2022. 9. 22. 14:34ใ์ธํ๋ฐ/์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA
1๏ธโฃ ์์ JPA ๊ธฐ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ง๋ค๊ธฐ
๊ธฐ๋ณธ CRUD
- ์ ์ฅ
- ๋ณ๊ฒฝ -> ๋ณ๊ฒฝ ๊ฐ์ง Dirty Checking
- ์ญ์
- ์ ์ฒด ์กฐํ
- ๋จ๊ฑด ์กฐํ
- ์นด์ดํธ
โ ์ฐธ๊ณ
JPA์์ ์์ ์ ํน๋ณํ ๋ช ๋ น์์ด ๋ณ๊ฒฝ๊ฐ์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํธ๋์ญ์ ์์์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ํธ๋์ญ์ ์ข ๋ฃ ์์ ์ ๋ณ๊ฒฝ๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ํด์
๋ณ๊ฒฝ๋ ์ํฐํฐ๋ฅผ ๊ฐ์งํ๊ณ UPDATE SQL์ ์คํํ๋ค.
- ์์ JPA ๊ธฐ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ : ํ์
[Optional]
Java8์์๋ Optional<T> ํด๋์ค๋ฅผ ์ ๊ณตํด NPE ๋ฐ์ํ๋๊ฑธ ๋ฐฉ์งํ ์ ์๋๋ก ๋์์ค๋ค.
Optional<T>๋ null์ด ์ฌ ์ ์๋ ๊ฐ์ ๊ฐ์ธ๋ Wrapper ํด๋์ค๋ก, ์ฐธ์กฐํ๋๋ผ๋ NPE๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋์์ค๋ค.
Optional์ ๊ฐ์ด null์ด๋๋ผ๋ ๋ฐ๋ก NPE๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉฐ, ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ข ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
Optional.of() : ๊ฐ์ด null์ด ์๋ ๊ฒฝ์ฐ
Optional.ofNullable(): ๊ฐ์ด null์ผ ์๋, ์๋ ์๋ ์๋ ๊ฒฝ์ฐ
โ Optional์ null ๋๋ ๊ฐ์ ๊ฐ์ธ์ NPE๋ก๋ถํฐ ๋ถ๋ด์ ์ค์ด๊ธฐ ์ํด ๋ฑ์ฅํ ํด๋์ค์ด๋ค.
- ์์ JPA ๊ธฐ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ : ํ
- ์์ JPA ๊ธฐ๋ฐ ๋ฆฌํฌ์งํ ๋ฆฌ ํ ์คํธ
-> ๊ธฐ๋ณธ CRUD๋ฅผ ๊ฒ์ฆํ๋ค.
findById์์ ๊ฐ์ ๊บผ๋ด์ฌ ๋ Optional๋ก ๊ฐ์ธ์ ธ ์์ด์ ๊บผ๋ผ ๋ get ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ get์ ๊ฐ์ด ์์ผ๋ฉด ๋ฐ๋ก NPE ๋ฐ์ํด์ ๋ณดํต์ ์ฌ์ฉํ๋ฉด ์๋๊ณ , ์ง๊ธ์ ํ ์คํธ๋ผ์ ์ฌ์ฉํ๋ค..!
2๏ธโฃ ๊ณตํต ์ธํฐํ์ด์ค ์ค์
์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด
์ด๋ฐ์์ผ๋ก ์ค์ ํด์ค์ผ ํ๋๋ฐ
์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉ์์๋ @SpringBootApplication ์์น๋ฅผ ์ง์ ํด ์๋ตํด๋ ์ฌ์ฉํ ์์๋ค.
(ํด๋น ํจํค์ง์ ํ์ ํจํค์ง ์ธ์)
์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ๊ตฌํ ํด๋์ค ๋์ ์์ฑ
MemberRepository ์ธํฐํ์ด์ค๋ฅผ ๋ณด๋ฉด JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ณ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๊ฐ ์์ด๋ ์ ๊ธฐํ๊ฒ ๋์ํ๋ค.
๊ทธ ์ด์ ๋ ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ๋์ ์์ฑํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ตฌํํ ํ์๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ณด๋ฉด @Repository ์ด๋ ธํ ์ด์ ๋ ์๋ต๋๊ฒ์ ํ์ธํ ์ ์๋๋ฐ
์ปดํฌ๋ํธ ์ค์บ์ ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ JPA ์์ธ๋ฅผ ์คํ๋ง ์์ธ๋ก ๋ณํํ๋ ๊ณผ์ ๋ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค.
3๏ธโฃ ๊ณตํต ์ธํฐํ์ด์ค ์ ์ฉ
๋ฐ๋ผ์ ๊ณตํต ์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํ๋๊ฑด ํฌ๊ฒ ํ ์์ ์ด ์์ด ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ ๋ค์์ JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ผ๋ฉด ๋๋ค.
- ์คํ๋ง ๋ฐ์ดํฐ JPA ๊ธฐ๋ฐ MemberRepository
- ์คํ๋ง ๋ฐ์ดํฐ JPA ๊ธฐ๋ฐ TeamRepository
-> ์ ๋ค๋ฆญ ํ์ ์์ T๋ ์ํฐํฐ ํ์ ์ด๊ณ , ID๋ ์๋ณ์ ํ์ pk์ด๋ค.
- MemberRepositoryTest
MemberJpaRepositoryTest์์ ํ๋ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์์ MemberRepository๋ก ๋ณ๊ฒฝ๋ง ํด์ฃผ๊ณ ํ ์คํธ๋ฅผ ์คํํด๋ ์ ์์ ์ผ๋ก ์ ๋์ํ๋ค.
4๏ธโฃ ๊ณตํต ์ธํฐํ์ด์ค ๋ถ์
JpaRepository
: ๊ณตํต CRUD ์ ๊ณต
์ ๋ค๋ฆญ์ <์ํฐํฐํ์ , ์๋ณ์ํ์ > ์ค์
์์ PagingAndSortingRepository์ CrudRepository๋
spring-data-commons ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ค์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ JpaRepository๋
spring-data-jpa์์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค์ด๋ค.
- ์ ๋ค๋ฆญ ํ์
T ์ํฐํฐ
ID ์ํฐํฐ์ ์๋ณ์ ํ์
S ์ํฐํฐ์ ๊ทธ ์์ ํ์
- ์ฃผ์ ๋ฉ์๋
save(S) : ์๋ก์ด ์ํฐํฐ๋ ์ ์ฅํ๊ณ ์ด๋ฏธ ์๋ ์ํฐํฐ๋ ๋ณํฉํ๋ค.
delete(T) : ์ํฐํฐ ํ๋๋ฅผ ์ญ์ ํ๋ค. ๋ด๋ถ์์ EntityManager.remove() ํธ์ถ
findById(ID): ์ํฐํฐ ํ๋๋ฅผ ์กฐํํ๋ค. ๋ด๋ถ์์ EntityManager.find() ํธ์ถ
getOne(ID): ์ํฐํฐ๋ฅผ ํ๋ก์๋ก ์กฐํํ๋ค. ๋ด๋ถ์์ EntityManager.getReference() ํธ์ถ
findAll(..) : ๋ชจ๋ ์ํฐํฐ๋ฅผ ์กฐํํ๋ค. ์ ๋ ฌ Sort๋ ํ์ด์งPageable ์กฐ๊ฑด์ ํ๋ผ๋ฏธํฐ๋ก ์ ๊ณตํ ์ ์๋ค.
JpaRepository๋ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ๊ณตํต์ ์ผ๋ก ์ ๊ณตํ ์ ์๋ ๋ชจ๋ ๋ฉ์๋๋ค์ด ์ ๊ณต๋๋ ํธ์ด๋ค.
'์ธํ๋ฐ > ์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง ๋ฐ์ดํฐ JPA] 6. ์คํ๋ง ๋ฐ์ดํฐ JPA ๋ถ์ (0) | 2022.10.03 |
---|---|
[์คํ๋ง ๋ฐ์ดํฐ JPA] 5. ํ์ฅ ๊ธฐ๋ฅ (1) | 2022.09.29 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 4. ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ (0) | 2022.09.28 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 2. ์์ ๋๋ฉ์ธ ๋ชจ๋ธ (0) | 2022.09.22 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 1. ํ๋ก์ ํธ ํ๊ฒฝ์ค์ (0) | 2022.09.21 |