๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring๐Ÿƒ

SpringData ๊ตฌ์กฐ ๋ฐ JpaRepository ์›๋ฆฌ

728x90

์ถœ์ฒ˜ : ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

 

SpringData ๊ตฌ์กฐ

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ : ์Šคํ”„๋ง์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ์—ฐ๋™ ๋ฐ ์ตœ์ ํ™” ํŒจํ‚ค์ง€

Spring Data Common & JPA

- Repository : ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์€ ์—†๋Š” ๋งˆ์ปค ์–ด๋…ธํ…Œ์ด์…˜

- CrudRepository : CRUD ๊ธฐ๋Šฅ ์ œ๊ณต

- PagingAndSortingRepository : ํŽ˜์ด์ง•, ์ •๋ ฌ ๋ถ€๋ฌธ์— ๋Œ€ํ•ด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

- Repository > CrudRepository > PagingAndSortingRepository > JPARepository๊นŒ์ง€ @NoRepositoryBean

: ์ค‘๊ฐ„ ๋‹จ๊ณ„์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์‹ค์ œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์•„๋‹˜์„ ์•Œ๋ ค ์‹ค์ œ Bean์„ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ

์‚ฌ์šฉ์ž ์ง€์ • ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ JPARepository<Entity, Id>๋ฅผ ์ƒ์†ํ•˜๋ฉด ์•Œ๋งž๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋œ SimpleJPARepository ๊ตฌํ˜„์ฒด Bean์ด ๋˜๊ณ , ์Šคํ”„๋ง ๊ตฌ๋™์‹œ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค

+ @EnableJPARepositories(์Šคํ”„๋ง ๋ถ€ํŠธ ์‚ฌ์šฉ์‹œ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค)์˜

JPARepositoriesRegistrar -> RepositoryBeanDefinitionRegistrarSupport : ImportBeanDefinitionRegistrar์„ ์ƒ์†

 

@Repository vs @JPARepository

  • Repository
    • **@Repository** ์„ ํด๋ž˜์Šค์— ๋ถ™์ธ๋‹ค.
    • ์•ž์„œ๋ฐฐ์šด RawJPA์˜ Repository ๊ธฐ๋Šฅ๋งŒ ๊ฐ€์ง„ ๊ตฌํ˜„์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. (DB๋ณ„ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋“ฑ)
  • JpaRepository
    • JpaRepository<Entity,ID> ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์— extends ๋ถ™์ธ๋‹ค.
      • @NotRepositoryBean ๋œ ****์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋œ๋‹ค. (@NotRepositoryBean = ๋นˆ์ƒ์„ฑ ๋ง‰์Œ)
      • SpringDataJpa ์— ์˜ํ•ด ์—”ํ‹ฐํ‹ฐ์˜ CRUD, ํŽ˜์ด์ง•, ์ •๋ ฌ ๊ธฐ๋Šฅ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ฐ€์ง„ ๋นˆ์ด ๋“ฑ๋ก๋œ๋‹ค. (์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์˜ ๊ธฐ๋Šฅ)

Repository ๊ธฐ๋Šฅ ์ œํ•œํ•˜๊ธฐ

1. @RepositoryDefinition

@RepositoryDefinition(domainClass = Thread.class, idClass = Long.class)
public interface ThreadRepository {

    Optional<Thread> findByThreadMessage(String message);

    // ๋‹ค๋ฅธ ํ•„๋“œ๊ฐ’์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค : ์˜ค๋กœ์ง€ ๋ฉ”์„ธ์ง€ ๊ฒ€์ƒ‰๋งŒ ๊ฐ€๋Šฅ
}

2. @NoRepositoryBean ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ•œ๋ฒˆ ๋” ๊ฐ์‹ธ๋Š” ๋ฒ•

@NoRepositoryBean
public interface UserRepository<User, ID extends Serializable> extends Repository<User, ID> {

    Optional<User> findByUsername(String username);
    // ์ดํ›„ ๋ชฉํ‘œํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ฒŒ ํ•œ๋‹ค ~ ์—ฌ๊ธฐ์— ์ž‘์„ฑํ•œ ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค
}

Repository ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ

delete() ๋ฉ”์†Œ๋“œ

์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐ๋ณธ delete() ๋ฉ”์†Œ๋“œ

์˜์†์„ฑ ์ƒํƒœ์—ฌ์•ผ cascade, orphanremoval์— ์˜ํ•ด ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋„ ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์†์„ฑ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค

 

-> ์—ฐ๊ด€๊ด€๊ณ„ ์—†๊ณ  ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ•˜๊ณ  ์‹ถ๋‹ค : delete() ๋ฉ”์„œ๋“œ ์žฌ์ •์˜ํ•˜๊ธฐ

1. ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•  ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ

2. ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ , delete ์ฟผ๋ฆฌ๋ฅผ ๋ฐ”๋กœ ๋‚ ๋ฆฌ๋„ ๋ฉ”์„œ๋“œ ์žฌ์ •์˜

 

JPA ํ”„๋กœ์„ธ์Šค

์š”์ฒญ

----- ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ -----

-> ์“ฐ๋ ˆ๋“œ

 new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•œ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ ~ ๋น„์˜์†์„ฑ ์ƒํƒœ์ธ ๊ฐ์ฒด, em.persist()๋กœ ์˜์†์„ฑ ๋ถ€์—ฌ 

-> 1์ฐจ์บ์‹œ(์˜์†์„ฑ ์ปจํ…์ŠคํŠธ)

์˜์†์„ฑ์ด ๋ถ€์—ฌ๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ 1์ฐจ ์บ์‹œ์— ๋“ฑ๋ก๋œ๋‹ค, flush()๋กœ DB transaction์— ์ฟผ๋ฆฌ๋กœ ๋“ฑ๋ก๋˜๊ฒŒ ํ•œ๋‹ค ~ ์ƒ์„ฑ insert ์ฟผ๋ฆฌ

----- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค -----

-> DB Transaction

Commit()์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์›๋ณธ์— Record๋กœ ์ €์žฅ์ด ๋œ๋‹ค

-> DB ์›๋ณธ

 

Detached, Remove๋กœ ์ƒํƒœ ๋ณ€ํ™˜ ๋“ฑ์€ 1์ฐจ ์บ์‹œ, 1์ฐจ ์บ์‹œ์—์„œ ์ผ์–ด๋‚œ ์ผ์„ ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์—์„œ ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜, DB transaction์œผ๋กœ ์ „์†ก ~ Transaction ๊ตฌ๊ฐ„ 1์ฐจ ์บ์‹œ์™€ DB transaction

 

+ 1์ฐจ์บ์‹œ : App๋‹จ ์ตœ์ ํ™” ~ ์“ฐ๊ธฐ ์ง€์—ฐ ์ €์žฅ์†Œ์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ณ„์† ์ตœ์ ํ™”, ์ฟผ๋ฆฌ๋Š” ์ด๋ฏธ DB transaction์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค

+ 1์ฐจ์บ์‹œ์—์„œ ํ•˜๋Š” ๋กค๋ฐฑ๊ณผ DB transaction์—์„œ ํ•˜๋Š” ๋กค๋ฐฑ์ด ์žˆ๋‹ค (๋‘˜์€ ๋‹ค๋ฅด๋‹ค)

 

728x90