[์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA] 3. ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ

2022. 9. 22. 14:34ใ†์ธํ”„๋Ÿฐ/์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

728x90

 

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๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณตํ†ต์ ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋“ค์ด ์ œ๊ณต๋˜๋Š” ํŽธ์ด๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90