๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

Spring ์ž…๋ฌธ 2์ฃผ์ฐจ : JPA - 4

KIMHYEYUN 2023. 11. 7. 12:20
๋ฐ˜์‘ํ˜•

Spring Data JPA

SpringBoot ํ™˜๊ฒฝ์—์„œ์˜ JPA

  • SpringBoot ํ™˜๊ฒฝ์—์„œ๋Š” EntityManagerFactory์™€ EntityManager๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
    • application.properties์— DB ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๋ฉด ์ด๋ฅผ ํ† ๋Œ€๋กœ EntityManagerFactory๊ฐ€ ์ƒ์„ฑ๋จ
      @PersistenceContext
      EntityManager em;
  • @PersistenceContext ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ EntityManager๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Spring์˜ ํŠธ๋žœ์žญ์…˜

  • Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ DB์˜ ํŠธ๋žœ์žญ์…˜ ๊ฐœ๋…์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋ฅผ ์ œ๊ณต

    @Transactional(readOnly = true)
    public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
                          ...
    
          @Transactional
          @Override
          public <S extends T> S save(S entity) {
    
              Assert.notNull(entity, "Entity must not be null");
    
              if (entityInformation.isNew(entity)) {
                  em.persist(entity);
                  return entity;
              } else {
                  return em.merge(entity);
              }
          }
    
                          ...
    }
  • ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ @Transactional ์• ๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์‰ฝ๊ฒŒ ํŠธ๋žœ์žญ์…˜ ๊ฐœ๋…์„ ์ ์šฉ ๊ฐ€๋Šฅ

    • ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ํ•ด๋‹น ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋“  DB ์—ฐ์‚ฐ ๋‚ด์šฉ์€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์ž„
    • ์ด๋•Œ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ณ , ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋กค๋ฐฑ
    • ํด๋ž˜์Šค์— ์„ ์–ธํ•œ @Transactional์€ ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•จ
    • ์ด๋•Œ, save ๋ฉ”์„œ๋“œ๋Š” @Transactional ์• ๋„ˆํ…Œ์ด์…˜์ด ์ถ”๊ฐ€๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— readOnly = true์˜ต์…˜์ด ๋ฎ์–ด์“ฐ์—ฌ์ ธ readOnly = false๋กœ ์ ์šฉ
      • readOnly = true ์˜ต์…˜
        • ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ๋งŒ ํ•  ๋•Œ ์‚ฌ์šฉ
        • ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
        • ๋งŒ์•ฝ, ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ ํ•„์š”

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ํŠธ๋žœ์žญ์…˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ํŠธ๋žœ์žญ์…˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์ผ์น˜
  • => ํŠธ๋žœ์žญ์…˜์ด ์œ ์ง€๋˜๋Š” ๋™์•ˆ์€ ์—ฐ์†์„ฑ ์ปจํ…์ŠคํŠธ๋„ ๊ณ„์† ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

    โš ๏ธ Spring์€ ์–ด๋–ป๊ฒŒ Service ๋ถ€ํ„ฐ Repository ๊นŒ์ง€ Transaction์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

    • Spring์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ

ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ

  • @Transactional์—์„œ ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์˜ต์…˜ ์ง€์ • ๊ฐ€๋Šฅ
  • ๊ธฐ๋ณธ ์˜ต์…˜์€ REQUIRED
    • ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ์— ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•˜๋ฉด ์ž์‹ ๋ฉ”์„œ๋“œ์˜ ํŠธ๋žœ์žญ์…˜์€ ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜์— ํ•ฉ๋ฅ˜ํ•จ

Spring Data JPA๋ž€?

  • Spring Data JPA๋Š” JPA๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด๋†“์€ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ
    • JPA๋ฅผ ์ถ”์ƒํ™”์‹œํ‚จ Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต
  • Repository ์ธํ„ฐํŽ˜์ด์Šค๋Š” Hibernate์™€ ๊ฐ™์€ JPA ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ

JPA Auditing ์ ์šฉ

  • Spring Data JPA์—์„œ๋Š” ์‹œ๊ฐ„์— ๋Œ€ํ•ด์„œ ์ž๋™์œผ๋กœ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ธ JPA Auditing ์ œ๊ณต
  • @MappedSuperclass
    • JPA Entity ํด๋ž˜์Šค๋“ค์ด ํ•ด๋‹น ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•  ๊ฒฝ์šฐ, ์ถ”์ƒ ํด๋ž˜์Šค์— ์„ ์–ธํ•œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ปฌ๋Ÿผ์œผ๋กœ ์ธ์‹ ๊ฐ€๋Šฅ
  • @EntityListeners(AuditingEntityListener.class)
    • ํ•ด๋‹น ํด๋ž˜์Šค์— Auditing ๊ธฐ๋Šฅ์„ ํฌํ•จ
  • @Temporal
    • ๋‚ ์งœ ํƒ€์ž…์„ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ
    • DB์—๋Š” Date(๋‚ ์งœ), Time(์‹œ๊ฐ„), Timestamp(๋‚ ์งœ์™€ ์‹œ๊ฐ„)๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ํƒ€์ž…์ด ๋ณ„๋„๋กœ ์กด์žฌ

โš ๏ธ @SpringBootApplication ์ด ์žˆ๋Š” class์— @EnableJpaAuditing ์ถ”๊ฐ€!!

Query Methods

  • Spring Data JPA์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ SQL์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” Query Methods ๊ธฐ๋Šฅ์„ ์ œ๊ณต
728x90
๋ฐ˜์‘ํ˜•