2022. 10. 3. 12:36ใ์ธํ๋ฐ/์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA
1๏ธโฃ ์คํ๋ง ๋ฐ์ดํฐ JPA ๊ตฌํ์ฒด ๋ถ์
org.springframework.data.jpa.repository.support.SimpleJpaRepository
-> ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์ ๊ณตํ๋ ๊ณตํต ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด
SimpleJpaRepository
@Repository
: ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๊ณ , JPA ์์ธ๋ฅผ ์คํ๋ง์ด ์ถ์ํํ ์์ธ๋ก ๋ณํํด์ฃผ๋ ์ญํ ๋ ํ๋ค.
-> ์คํ๋ง์ด ๊ฐ์กฐํ๋ ํฐ ์ฅ์ ์ค ํ๋๋ผ๊ณ ํ ์ ์๋๋ฐ JPA ๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ์ด๋ค ์ด์ ๋ก JDBC ๋ฑ์ผ๋ก ๋ณ๊ฒฝํ๋ค๊ณ ํด๋ ์์ธ ๊ฐ์๊ฑธ ์คํ๋ง ๊ด๋ จ ์์ธ๋ก ์์์ ๋ณํํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ฒด๊ฐ ๋ฐ๋์ด๋ ๋ก์ง์ ๋์ผํ๊ฒ ๋์๊ฐ๋๋ก ์ค๊ณ๋์ด์๋ค.
@Transactional
: ํธ๋์ญ์ ์ ์ฉ, JPA์ ๋ชจ๋ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ์์์ ๋์
์คํ๋ง ๋ฐ์ดํฐ JPA๋ ๋ณ๊ฒฝ(๋ฑ๋ก, ์์ , ์ญ์ ) ๋ฉ์๋๋ฅผ ํธ๋์ญ์ ์ฒ๋ฆฌ
- ์๋น์ค ๊ณ์ธต์์ ํธ๋์ญ์ ์ ์์ํ์ง ์์ผ๋ฉด ๋ฆฌํ์งํ ๋ฆฌ์์ ํธ๋์ญ์ ์์
- ์๋น์ค ๊ณ์ธต์์ ํธ๋์ญ์ ์ ์์ํ๋ฉด ๋ฆฌํ์งํ ๋ฆฌ๋ ํด๋น ํธ๋์ญ์ ์ ์ ํ ๋ฐ์์ ์ฌ์ฉ
๊ทธ๋์ ์คํ๋ง ๋ฐ์ดํฐ JPA๋ฅผ ์ฌ์ฉํ ๋ ํธ๋์ญ์ ์์ด๋ ๋ฐ์ดํฐ ๋ฑ๋ก, ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ์ ( ์ฌ์ค ํธ๋์ญ์ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ ๊ณ์ธต์ ๊ฑธ๋ ค์๊ธฐ ๋๋ฌธ)
@Transactional(readonly = true)
: ๋ฐ์ดํฐ๋ฅผ ๋จ์ํ ์กฐํ๋ง ํ๊ณ ๋ณ๊ฒฝํ์ง ์๋ ํธ๋์ญ์ ์์๋ readOnly = true ์ต์ ์ ์ฌ์ฉํ๋ฉด ํ๋ฌ์๋ฅผ ์๋ตํด์ ์ฝ๊ฐ์ ์กฐํ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์๋ค.
๋ฐ๋ผ์ ์ ์ฒด์๋ readOnly = true๋ฅผ ๊ฑธ์ด์ฃผ๊ณ , ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์๋ ๋ฉ์๋์๋ @Transactional ์ด๋ ธํ ์ด์ ์ ๊ฑธ์ด์ ํด๋น ๋ฉ์๋์์๋ง ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋๋ก ์ค์ ํด์ฃผ๋ฉด ์ฝ๊ฐ์ ์กฐํ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์๋ค.
(๊ธฐ๋ณธ์ด readOnly = false)
save()
- ์๋ก์ด ์ํฐํฐ๋ฉด ์ ์ฅ -> persist()
- ์๋ก์ด ์ํฐํฐ๊ฐ ์๋๋ฉด ๋ณํฉ -> merge()
โ๏ธ merge ์ฌ์ฉ์ ์กฐ์ฌํด์ผ ํ๋๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ๋ผ์ฐ๊ธฐ ๋๋ฌธ์ ์ด๊ฑธ ์์ ํ ๋ ์ฌ์ฉํ๋ฉด ํฐ์ผ์ด๋ค. ์๋ ๋ฐ์ดํฐ๊น์ง ๋ค์ง์ด ์ธ ์ ์๊ธฐ ๋๋ฌธ!! ๊ทธ๋ฌ๋ฏ๋ก ์์ ์ ํ ๋๋ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ , merge๋ ์์ ์ํ๊ฐ ์๋ ์ํฐํฐ์ ๋ํด์ ๋ค์ ์์ ์ํ๋ก ๋ง๋ค๋ ~
๋ญ ์ด๋ฐ ์ํฉ์์๋ง ์ฌ์ฉํด์ผ ํ๋ค. ( merge๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค๊ณ ํ๋ค.)
2๏ธโฃ ์๋ก์ด ์ํฐํฐ๋ฅผ ๊ตฌ๋ณํ๋ ๋ฐฉ๋ฒ
์๋ก์ด ์ํฐํฐ๋ฅผ ํ๋จํ๋ ๊ธฐ๋ณธ ์ ๋ต
- ์๋ณ์๊ฐ ๊ฐ์ฒด์ผ ๋๋ Null ๋ก ํ๋จ (ex) Long)
- ์๋ณ์๊ฐ ์๋ฐ ๊ธฐ๋ณธ ํ์ ์ผ ๋๋ 0์ผ๋ก ํ๋จ (ex) long -> ๊ธฐ๋ณธ ํ์ ์ null ์ด ์๋๋๊น~)
- Persistable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ํ๋จ ๋ก์ง ๋ณ๊ฒฝ ๊ฐ๋ฅ
Persistable
Item
์์ ๋ฅผ ์ํด์ Item ์ํฐํฐ๋ฅผ ๋ง๋ค์๋ค.
์ด๋ pk ๊ฐ์ Long ์ด ์๋ ์ด๋ค ์ด์ ๋ก String์ผ๋ก ๋ง๋ค์๋ค๊ณ ํ์. ๊ทธ๋ฐ๋ฐ ์ด๋ @GeneratedValue ๋ฅผ ์๋ตํ๊ณ ์ง์ ์์ฑํด์ฃผ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ id ๊ฐ์ ๋ฏธ๋ฆฌ ์ง์ ํ๋๋ก ํ๋ค.
ItemRepositoryTest
๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ํ ์คํธ๋ก save ํ๋ ํ ์คํธ์ด๋ค.
๊ทผ๋ฐ ์๋ก์ด ์ํฐํฐ๋ฅผ ํ๋จํ๋ ์ ๋ต์ผ๋ก ์ฐ์ ๊ฐ์ฒด์ ์๋ณ์๊ฐ null ์ผ๋ ์๋ก์ด ๊ฐ์ฒด๋ก ํ๋จํ๋ค๊ณ ํ๋๋ฐ
์ง๊ธ Item์๋ 'A' ๋ก ์๋ณ์ ๊ฐ์ด ์ฃผ์ด์ ธ์๊ธฐ ๋๋ฌธ์ ์ฒ์์ jpa๊ฐ ์๋ก์ด ๊ฐ์ฒด๋ก ํ๋จ์ ๋ชปํ๊ณ , merge() ๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ด ํ ์คํธ๋ฅผ ๋๋ ค๋ณด๋ฉด
์ฐ์ select๋ฅผ ํด์ ์๋ณ์๊ฐ 'A'์ธ item์ ์ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํ๋ฅผ ํ๊ณ , ์ด๋ ์๊ธฐ ๋๋ฌธ์ ๊ทธ์ ์์ผ insert๋ฅผ ํ๋ค๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์๋ค.
-> merge๋ persist์ ๋นํด ์ฟผ๋ฆฌ๋ฅผ ํ๋ฒ ๋ ๋ ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ๋นํจ์จ์ ์ด๋ค.
โญ๏ธ ์ฐธ๊ณ โญ๏ธ
JPA ์๋ณ์ ์์ฑ ์ ๋ต์ด @GeneratedValue ๋ฉด save() ํธ์ถ ์์ ์ ์๋ณ์๊ฐ ์์ผ๋ฏ๋ก ์๋ก์ด ์ํฐํฐ๋ก ์ธ์ํด์ ์ ์ ๋์ํ๋ค.
๊ทธ๋ฐ๋ฐ JPA ์๋ณ์ ์์ฑ ์ ๋ต์ด @Id๋ง ์ฌ์ฉํด์ ์ง์ ํ ๋น์ด๋ฉด ์ด๋ฏธ ์๋ณ์ ๊ฐ์ด ์๋ ์ํ๋ก save() ๋ฅผ ํธ์ถํ๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ์๋ merge()๊ฐ ํธ์ถ๋๋ค. merge()๋ ์ฐ์ DB๋ฅผ ํธ์ถํด์ ๊ฐ์ ํ์ธํ๊ณ , DB์ ๊ฐ์ด ์์ผ๋ฉด ์๋ก์ด ์ํฐํฐ๋ก ์ธ์งํ๋ฏ๋ก ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ Persistable๋ฅผ ์ฌ์ฉํด์ ์๋ก์ด ์ํฐํฐ ํ์ธ ์ฌ๋ถ๋ฅผ ์ง์ ๊ตฌํํ๋๊ฒ ํจ๊ณผ์ ์ด๋ค.
์ฐธ๊ณ ๋ก ๋ฑ๋ก์๊ฐ(@CreatedDate)๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ๋ฉด ์ด ํ๋๋ก ์๋ก์ด ์ํฐํฐ ์ฌ๋ถ๋ฅผ ํธ๋ฆฌํ๊ฒ ํ์ธํ ์ ์๋ค.
(@CreatedDate์ ๊ฐ์ด ์์ผ๋ฉด ์๋ก์ด ์ํฐํฐ๋ก ํ๋จ)
Persistable ๊ตฌํ
Persistable ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ ๊ตฌํํ๋ฉด ๋๋ค.
์ด๋ @CreatedDate๋ฅผ ์ฌ์ฉํด์ ์ด ๊ฐ์ด null ์ด๋ฉด ์๋ก์ด ๊ฐ์ด๋ผ๊ณ ํ๋จํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ Auditing์ ์ฌ์ฉํ๋๊น @EntityListener(AuditingEntityListener.class)๋ฅผ ์ถ๊ฐํด์ค์ผ ํ๋ค~~
์ด๋ฌ๊ณ ๋ค์ ํ ์คํธ๋ฅผ ๋๋ ค๋ณด๋ฉด
์ด๋ฒ์๋ selectํด์ ๋จผ์ DB ์กฐํ๋ฅผ ํ์ง ์๊ณ ๋ฐ๋ก ์๋ก์ด ์ํฐํฐ๋ก ํ๋จํ๊ณ insert ํ ์ฟผ๋ฆฌ๋ฅผ ํ์ธํด ๋ณผ ์ ์๋ค.
'์ธํ๋ฐ > ์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง ๋ฐ์ดํฐ JPA] 7. ๋๋จธ์ง ๊ธฐ๋ฅ๋ค (1) | 2022.10.04 |
---|---|
[์คํ๋ง ๋ฐ์ดํฐ JPA] 5. ํ์ฅ ๊ธฐ๋ฅ (1) | 2022.09.29 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 4. ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ (0) | 2022.09.28 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 3. ๊ณตํต ์ธํฐํ์ด์ค ๊ธฐ๋ฅ (0) | 2022.09.22 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 2. ์์ ๋๋ฉ์ธ ๋ชจ๋ธ (0) | 2022.09.22 |