๋ฐ์ํ
Spring Data JPA
SpringBoot ํ๊ฒฝ์์์ JPA
- SpringBoot ํ๊ฒฝ์์๋ EntityManagerFactory์ EntityManager๋ฅผ ์๋์ผ๋ก ์์ฑ
- application.properties์ DB ์ ๋ณด๋ฅผ ์ ๋ฌํด ์ฃผ๋ฉด ์ด๋ฅผ ํ ๋๋ก EntityManagerFactory๊ฐ ์์ฑ๋จ
@PersistenceContext EntityManager em;
- application.properties์ DB ์ ๋ณด๋ฅผ ์ ๋ฌํด ์ฃผ๋ฉด ์ด๋ฅผ ํ ๋๋ก EntityManagerFactory๊ฐ ์์ฑ๋จ
@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
๋ฐ์ํ
'๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ์๋ จ 3์ฃผ์ฐจ : ์ธ์ฆ๊ณผ ์ธ๊ฐ (0) | 2023.11.09 |
---|---|
์คํ๋ง ์๋ จ 3์ฃผ์ฐจ : Bean (0) | 2023.11.09 |
Spring ์ ๋ฌธ 2์ฃผ์ฐจ : JPA - 3 (0) | 2023.11.07 |
Spring ์ ๋ฌธ 2์ฃผ์ฐจ : JPA - 2 (0) | 2023.11.07 |
Spring ์ ๋ฌธ 2์ฃผ์ฐจ : JPA - 1 (0) | 2023.11.07 |