2022. 9. 29. 13:20ใ์ธํ๋ฐ/์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA
1๏ธโฃ ์ฌ์ฉ์ ์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌํ
์คํ๋ง ๋ฐ์ดํฐ JPA ๋ฆฌํฌ์งํ ๋ฆฌ๋ ์ธํฐํ์ด์ค๋ง ์ ์ํ๊ณ ๊ตฌํ์ฒด๋ ์คํ๋ง์ด ์๋ ์์ฑํ๋ค.
๋ฐ๋ผ์ ์ด์ ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํ๋ ค๊ณ ํ๋ฉด ๊ตฌํํด์ผ ํ๋ ๊ธฐ๋ฅ๋ค์ด ๋๋ฌด ๋ง์ ๋ค ๊ตฌํํ๊ธฐ๊ฐ ํ๋ค๋ค.
๋ค์ํ ์ด์ ๋ก ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด..??
- JPA ์ง์ ์ฌ์ฉ(EntityManager)
- ์คํ๋ง JDBC Template ์ฌ์ฉ
- MyBatis ์ฌ์ฉ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ง์ ์ฌ์ฉ ๋ฑ๋ฑ..
- Querydsl ์ฌ์ฉ
์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค
MemberRepositoryCustom
์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค ๊ตฌํ ํด๋์ค
MemberRepositoryImpl
์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค ์์
MemberRepository
๊ทธ๋ฆฌ๊ณ ์ด์ MemberRepository์์ ์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค์ธ MemberRepositoryCustom์ ์์ ๋ฐ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฌ์ฉ์ ์ ์ ๋ฉ์๋ ํธ์ถ ์ฝ๋
MemberRepositoryTest
โ ์ฌ์ฉ์ ์ ์ ๊ตฌํ ํด๋์ค
๊ท์น: ๋ฆฌํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค ์ด๋ฆ + Impl
-> ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์ธ์ํด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก
๐ ์ฌ์ฉ์ ์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌํ ์ต์ ๋ฐฉ์
์คํ๋ง ๋ฐ์ดํฐ 2.X ๋ถํฐ๋ ์ฌ์ฉ์ ์ ์ ๊ตฌํ ํด๋์ค์ ๋ฆฌํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค ์ด๋ฆ + Impl ์ ์ ์ฉํ๋ ๋์ ์
์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค๋ช + Impl๋ฐฉ์๋ ์ง์ํ๋ค.
์๋ฅผ ๋ค์ด์ MemberRepositoryImpl ๋์ ์ MemberRepositoryCustomImpl ๋ก ๊ฐ์ด ๊ตฌํํด๋ ๋๋ค.
-> ๊ธฐ์กด ๋ฐฉ์๋ณด๋ค ์ด ๋ฐฉ์์ด ์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค ์ด๋ฆ๊ณผ ๊ตฌํ ํด๋์ค ์ด๋ฆ์ด ๋น์ทํ๋ฏ๋ก ๋ ์ง๊ด์ ์ธ ํธ์ด๋ค.
์ถ๊ฐ๋ก ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํด์ ๊ตฌํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋กญ๊ฒ ๋ณ๊ฒฝ๋ ์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค๋ช + Impl ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ ๋ ๊ถ์ฅํ๋ค.
โญ ์ฐธ๊ณ
์ค๋ฌด์์๋ ์ฃผ๋ก QueryDSL์ด๋ SpringJdbcTemplate์ ํจ๊ป ์ฌ์ฉํ ๋ ์ฌ์ฉ์ ์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ธฐ๋ฅ์ ์์ฃผ ์ฌ์ฉํ๋ค.
โ ์ฐธ๊ณ : ํญ์ ์ฌ์ฉ์ ์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ํ์ํ ๊ฒ์ ์๋๋ค.
๊ทธ๋ฅ ์์์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ ๋๋ค. ์๋ฅผ ๋ค์ด MemberQueryRepository๋ฅผ ์ธํฐํ์ด์ค๊ฐ ์๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ ๊ทธ๋ฅ ์ง์ ์ฌ์ฉํด๋ ๋๋ค. ๋ฌผ๋ก ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์คํ๋ง ๋ฐ์ดํฐ JPA์๋ ์๋ฌด๋ฐ ๊ด๊ณ ์์ด ๋ณ๋๋ก ๋์ํ๋ค.
2๏ธโฃ Auditing
โ ์ํฐํฐ๋ฅผ ์์ฑํ๊ณ ๋ณ๊ฒฝํ ๋ ๋ณ๊ฒฝํ ์ฌ๋๊ณผ ์๊ฐ์ ์ถ์ ํ๊ณ ์ถ๋ค๋ฉด?
- ๋ฑ๋ก์ผ
- ์์ ์ผ
- ๋ฑ๋ก์
- ์์ ์
์์ JPA ์ฌ์ฉ
: ๋ฑ๋ก์ผ, ์์ ์ผ ์ ์ฉ
JpaBaseEntity
๋ฑ๋ก์ผ์ด๋ ์์ ์ผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ณดํต ๋๋ถ๋ถ ํ ์ด๋ธ์ ๋ค์ด๊ฐ๋ ๊ฒ์ด ์ ์ง๋ณด์์ฑ์๋ ํจ์ฌ ์ข๋ค.
์๋ํ๋ฉด ๋๊ฐ ์ธ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ฑ๋กํ๋์ง๋ฅผ ์์์ผ์ง ๋ฌธ์ ํ์ ๋ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ณตํต ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ํด๋์ค๋ก ์์ฑํด์ @MappedSuperclass๋ฅผ ํ๊ณ ์ด ํด๋์ค๋ฅผ ์์๋ฐ์ผ๋ฉด ํด๋น ์ํฐํฐ์ ์ด ๋ฐ์ดํฐ๋ค์ ํฌํจํด์ ํ ์ด๋ธ์ ์์ฑํ๋ค.
์ฆ, BaseEntity๋ ํ ์ด๋ธ์ด ์๋๋ผ ๊ทธ๋ฅ ๊ณตํต ๋ฐ์ดํฐ์ด๋ค.
Member
-> Member ์ํฐํฐ์ BaseEntity๋ฅผ ์ถ๊ฐํด์คฌ๋ค.
MemberTest
JPA ์ฃผ์ ์ด๋ฒคํธ ์ด๋ ธํ ์ด์
@PrePersist, @PostPersist
@PreUpdate, @PostUpdate
์คํ๋ง ๋ฐ์ดํฐ JPA ์ฌ์ฉ
-์ค์
์คํ๋ง ๋ถํธ ์ค์ ํด๋์ค์ @EnableJpaAuditng์ ์ค์ ํด์ค์ผ ํ๋ค.
-> ๊ทธ๋ฆฌ๊ณ ์ํฐํฐ์ @EntityListeners(AuditingEntityListener.class)๋ฅผ ์ถ๊ฐํด์ค๋ค.
์ฌ์ฉ ์ด๋ ธํ ์ด์
@CreatedDate
@LastModifiedDate
@CreatedBy
@LastModifiedBy
-> ์คํ๋ง ๋ฐ์ดํฐ Auditing ์ ์ฉ : ๋ฑ๋ก์ผ, ์์ ์ผ, ๋ฑ๋ก์, ์์ ์
์ด๋ ๋ฑ๋ก์ผ๊ณผ ๋ฑ๋ก์๋ ์ต์ด ๋ฑ๋ก์ผ์ด๋ ๋ฑ๋ก์๋๊น ํน์ ์์ ๋ ๊ฒ์ ๋ฐฉ์งํด์ @Column(updatable = false)๋ก ์ง์ ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋ฑ๋ก์์ ์์ ์๋ ์์ด๋๊ฐ ์๊ธฐ ๋๋ฌธ์ UUID๋ก ๋๋ค๊ฐ์ผ๋ก ๋ฑ๋ก์์ ์์ ์๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ AuditorAware ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ค๋ค.
โ ์ค๋ฌด์์๋ ์ธ์ ์ ๋ณด๋, ์คํ๋ง ์ํ๋ฆฌํฐ ๋ก๊ทธ์ธ ์ ๋ณด์์ id ๋ฅผ ๋ฐ์์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
MemberTest
โญ ์ฐธ๊ณ
์ค๋ฌด์์ ๋๋ถ๋ถ์ ์ํฐํฐ๋ ๋ฑ๋ก์๊ฐ, ์์ ์๊ฐ์ด ํ์ํ์ง๋ง, ๋ฑ๋ก์, ์์ ์๋ ์์ ์๋ ์๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด Base ํ์ ์ ๋ถ๋ฆฌํ๊ณ , ์ํ๋ ํ์ ์ ์ ํํด์ ์์ํ๋ค.
-> ์ด๋ ๊ฒ ๋ฐ๋ก ๋ถ๋ฆฌํด๋ ๋ค์์ ์์ ์, ๋ฑ๋ก์๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ด๊ฑธ ์์ํด์ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
โ ์ฐธ๊ณ
์ ์ฅ ์์ ์ ๋ฑ๋ก์ผ, ๋ฑ๋ก์๋ ๋ฌผ๋ก ์ด๊ณ , ์์ ์ผ, ์์ ์๋ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
๋ฐ์ดํฐ๊ฐ ์ค๋ณต ์ ์ฅ๋๋ ๊ฒ ๊ฐ์ง๋ง, ์ด๋ ๊ฒ ํด๋๋ฉด ๋ณ๊ฒฝ ์ปฌ๋ผ๋ง ํ์ธํด๋ ๋ง์ง๋ง์ ์ ๋ฐ์ดํธํ ์ ์ ๋ฅผ ํ์ธํ ์ ์์ผ๋ฏ๋ก ์ ์ง๋ณด์ ๊ด์ ์์ ํธ๋ฆฌํ๋ค.
์ด๋ ๊ฒ ์ํ๋ฉด ๋ณ๊ฒฝ ์ปฌ๋ผ์ด null ์ผ ๋ ๋ฑ๋ก ์ปฌ๋ผ์ ๋ ์ฐพ์์ผ ํ๋ค.
์ฐธ๊ณ ๋ก ์ ์ฅ ์์ ์ ๊ทธ๋ฅ ์ ์ฅ ๋ฐ์ดํฐ๋ง ์ ๋ ฅํ๊ณ ์ถ์ผ๋ฉด @EnableAuditing(modifyOnCreate = false) ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
3๏ธโฃ Web ํ์ฅ - ๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ
: HTTP ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ํฐํฐ์ ์์ด๋๋ก ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๋ฐ์ธ๋ฉ
๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ ์ฌ์ฉ ์
MemberController
๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ ์ฌ์ฉ ์
MemberController
HTTP ์์ฒญ์ ํ์ id๋ฅผ ๋ฐ์ง๋ง, ๋๋ฉ์ธ ์ปจ๋ฒํฐ๊ฐ ์ค๊ฐ์ ๋์ํด์ ํ์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
memberRepository.find(Member.class, id) ์ด๋ฐ ๊ฑฐ ์์ด๋ ์์์ ๋์ํ๋ค..!!
๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ๋ ๋ฆฌํ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ํฐํฐ๋ฅผ ์ฐพ๊ธฐ๋ ํ๋ค.
โ ์ฃผ์
๋๋ฉ์ธ ํด๋์ค ์ปจ๋ฒํฐ๋ก ์ํฐํฐ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ผ๋ฉด, ์ด ์ํฐํฐ๋ ๋จ์ ์กฐํ์ฉ์ผ๋ก๋ง ์ฌ์ฉํด์ผ ํ๋ค~!!!!!!
(ํธ๋์ญ์ ์ด ์๋ ๋ฒ์๋ก ์ํฐํฐ๋ฅผ ์กฐํํ๊ธฐ ๋๋ฌธ์ ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํด๋ DB์ ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.)
๊ทธ๋ฆฌ๊ณ ์ด๊ฑฐ ์ฌ์ฉ ๊ถ์ฅ ์ํจ
4๏ธโฃ Web ํ์ฅ - ํ์ด์ง๊ณผ ์ ๋ ฌ
: ์คํ๋ง ๋ฐ์ดํฐ๊ฐ ์ ๊ณตํ๋ ํ์ด์ง๊ณผ ์ ๋ ฌ ๊ธฐ๋ฅ์ ์คํ๋ง MVC์์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ํ์ด์ง๊ณผ ์ ๋ ฌ ์์
MemberController
ํ๋ผ๋ฏธํฐ๋ก Pageable์ ๋ฐ์ ์ ์๋ค.
Pageable ์ ์ธํฐํ์ด์ค๋ก ์ค์ ๋ org.springframework.data.domain.PageRequest ๊ฐ์ฒด ์์ฑ
์์ฒญ ํ๋ผ๋ฏธํฐ
์) /members?page=0&size=3&sort=username,desc
page : ํ์ฌ ํ์ด์ง, 0๋ถํฐ ์์
size: ํ ํ์ด์ง์ ๋ ธ์ถํ ๋ฐ์ดํฐ ๊ฑด์
sort: ์ ๋ ฌ ์กฐ๊ฑด์ ์ ์ํ๋ค. ์) ์ ๋ ฌ ์์ฑ asc , ์ ๋ ฌ ๋ฐฉํฅ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด sort ํ๋ผ๋ฏธํฐ ์ถ๊ฐ
๊ธฐ๋ณธ ๊ฐ ์ค์ ํ๋ ๋ฐฉ๋ฒ
- ๊ธ๋ก๋ฒ ์ค์ : ์คํ๋ง๋ถํธ
default-page-size : ๊ธฐ๋ณธ ํ์ด์ง ์ฌ์ด์ฆ
max-page-size : ์ต๋ ํ์ด์ง ์ฌ์ด์ฆ
- ๊ฐ๋ณ ์ค์ : @PageableDefault ์ด๋ ธํ ์ด์ ์ฌ์ฉ
Page ๋ด์ฉ์ DTO๋ก ๋ณํํ๊ธฐ
์ํฐํฐ๋ฅผ API๋ก ์ง์ ๋ ธ์ถํ๋ ๊ฑด ์ข์ง ์๋ค.
์๋ํ๋ฉด ์ํฐํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด API ์คํ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๊ธฐ๋ ํ๊ณ , ์ ๋ต์ด ๋ ธ์ถ๋๋ ๊ฒ?์ด๊ธฐ ๋๋ฌธ์ ์ํฐํฐ๋ฅผ ์ง์ ๋ ธ์ถํ๋ ๊ฒ์ ํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
-> ๊ทธ๋์ ์ํฐํฐ๋ฅผ ๊ผญ DTO๋ก ๋ณํํด์ ๋ฐํํด์ผ ํ๋ค.
Page๋ map()์ ์ง์ํด์ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
MemberDto
โญ Page ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ผ๋ก๋ ์ฐ์ ์คํ๋ง ๋ฐ์ดํฐ๋ Page๋ฅผ 0๋ถํฐ ์์ํ๋ค!!
๋ง์ฝ Page๋ฅผ 1๋ถํฐ ์์ํ๊ณ ์ถ๋ค๋ฉด..?
1. Pageable, Page๋ฅผ ํ๋ผ๋ฏธํฐ์ ์๋ต๊ฐ์ผ๋ก ์ฌ์ฉํ์ง ์๊ณ , ์ง์ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ง์ PageRequest(Pageable ๊ตฌํ์ฒด)๋ฅผ ์์ฑํด์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋๊ธด๋ค.
๋ฌผ๋ก ์๋ต๊ฐ๋ Page ๋์ ์ ์ง์ ๋ง๋ค์ด์ ์ ๊ณตํด์ผ ํ๋ค.
2. spring.data.web.pageable.one-indexed-parameters ๋ฅผ true๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
๊ทผ๋ฐ ์ด ๋ฐฉ๋ฒ์ web์์ page ํ๋ผ๋ฏธํฐ๋ฅผ -1ํ ๋ฟ์ผ๋ก, ๋ฐ๋ผ์ ์๋ต๊ฐ์ธ Page์ ๋ชจ๋ 0 ํ์ด์ง ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ํ๊ณ๊ฐ ์๋ค.
๊ทธ๋ฅ ์ ์ผ ์ข์ ๋ฐฉ๋ฒ์ ์๋๋๋ก ์ฌ์ฉํ๋๊ฒ...
'์ธํ๋ฐ > ์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง ๋ฐ์ดํฐ JPA] 7. ๋๋จธ์ง ๊ธฐ๋ฅ๋ค (1) | 2022.10.04 |
---|---|
[์คํ๋ง ๋ฐ์ดํฐ JPA] 6. ์คํ๋ง ๋ฐ์ดํฐ JPA ๋ถ์ (0) | 2022.10.03 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 4. ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ (0) | 2022.09.28 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 3. ๊ณตํต ์ธํฐํ์ด์ค ๊ธฐ๋ฅ (0) | 2022.09.22 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 2. ์์ ๋๋ฉ์ธ ๋ชจ๋ธ (0) | 2022.09.22 |