ํน์ง
- ๊ธฐ์กด์ ์์ JPA์ ๋ฐ๋ณต์ ์ธ ๊ตฌํ์ฒด๋ค์ ์ถ์ํํจ
- ์ธํฐํ์ด์ค ์ ์ธ๋ง์ผ๋ก Spring JPA๊ฐ ์๋์ผ๋ก ๊ตฌํ์ฒด๋ค์ ๋ง๋ค์ด์ ์ฃผ์

- ๊ตฌํ์ฒด๊ฐ ์ฃผ์ ๋๋ ๊ณผ์ ( ์ค์ ๋ก ๊ฐ์ฒด๋ฅผ ์ฐ์ด๋ณด๋ฉด Proxy )
- Repository ์ ๋๊ฐ์ง ๊ธฐ๋ฅ์ ์ด๋
ธํ
์ด์
์ ์ ์์ด ์ฌ์ฉ ๊ฐ๋ฅ
- ์ปดํฌ๋ํธ ์ค์บ ๊ธฐ๋ฅ
- JPA ์์ธ๋ฅผ ์คํ๋ง ์์ธ๋ก ๋ณํํ์ฌ ์ผ๊ด์ ์ธ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ
์ฟผ๋ฆฌ ๋ฉ์๋
- ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ ex) findByUsername
๋ฐํ ํ์
- ์ปฌ๋ ์ ์กฐํ - ๋น ์ปฌ๋ ์ ๋ฐํ ( null ์๋! )
- ๋จ๊ฑด ์กฐํ - null ๋ฐํ โ Optional ์ฌ์ฉํ๊ธฐ
ํ์ด์ง๊ณผ ์ ๋ ฌ
- Total Count ํ์ํ ๊ฒฝ์ฐ : Page
- Total Count๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ : Slice ex) ์ธ์คํ๊ทธ๋จ, ๋ชจ๋ฐ์ผ ๋ ๋ณด๊ธฐ ๊ธฐ๋ฅ
์ฝ๊ฒ DTO๋ก ๋ณ๊ฒฝํ๋ ๋ฒ
- page.map(member โ new MemberDto(member.getId, member.getUsername))
๋ฒํฌ์ฑ ์์ ์ฟผ๋ฆฌ
- Bulk ์ฑ ์ฟผ๋ฆฌ ์ดํ์ flush(), clear() ํ๊ธฐ (์์์ฑ ์ปจํ ์คํธ ํด๋ฆฌ์ด)
์ํฐํฐ๊ทธ๋ํ
- @EntityGraph(attributePaths = {โfetchJoin ํ๊ณ ์ถ์ ๋์โ})
์ฌ์ฉ์์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ
Data Jpa Repository์ ๋ชจ๋ ๋ก์ง๋ค์ ์์ฑํ ๊ฒฝ์ฐ ์ค์ ๋น์ฆ๋์ค์ ์ธ ๋ก์ง์ ๊ตฌ๋ถํด๋ด๊ธฐ ์ฝ์ง ์์
- CustomRepository ์ธํฐํ์ด์ค ์์ฑ
- ์ธํฐํ์ด์ค ๊ตฌํ์ฒด์ ์ค์ ์ปค์คํ ๋ก์ง ์์ฑ
- ๊ธฐ์กด Data Jpa Repository์ CustomRepository ์ถ๊ฐ ์์
- (!์ฃผ์!) ๋๋ฌด Data Jpa์ ์์กดํ์ง ์๊ณ , ํ๋ฉด์ ๋ฟ๋ฆฌ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ค์ด๋ ๋ณต์กํ ํต๊ณ์ฑ ์ฟผ๋ฆฌ๋ค์ ๋ฐ๋ก repository Class๋ก ์์ฑํ๋ ๊ฒ์ด ์ข์ ๋ฐฉํฅ
Auditing
-
JPA Event ๊ธฐ๋ฐ
- BaseEntity ์์ฑ ( @MappedSuperClass)
- @PrePersist, @PreUpdate ์ค์
-
Data Jpa ๊ธฐ๋ฐ
- BaseEntity ์์ฑ ( @MappedSuperClass, @EntityListener(AuditingEntityListener.class) )
- @CreateDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy
- Spring Main Run Class์ @EnableJpaAuditing ์ถ๊ฐ
-
์ดํ๋ฆฌ์ผ์ด์ ์ ์ถ๊ฐํด ์ถํ ์ํ๋ฆฌํฐ, ์ธ์ ์ ๋ณด๋ฑ์ ๊ฐ์ ธ์ ๋ฃ์ด์ฃผ๋ฉด ์ฌ์ฉํ๋ ์ฌ์ฉ์๊ฐ createdBy, LastModifiedBy ์ ์๋์ผ๋ก ๋ฃ์ ์ ์์
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}