๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’Š Java & Kotlin & Spring/- spring framework +

[Spring & Springboot-JPA] JPA๋ฅผ ์ด์šฉํ•œ CRUD ๋ฉ”์„œ๋“œ ์ž‘์„ฑํ•˜๊ธฐ - 3 (read ๋ฉ”์„œ๋“œ๋กœ ํšŒ์› ๊ฒ€์ƒ‰ ๋งŒ๋“ค๊ธฐ)

by Wonit 2020. 1. 27.

ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” ์—ฌ๋Ÿฌ ํŽธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ํ•˜๋‚˜์˜ ๊ฐœ๋…์„ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ž์„ธํ•œ ํ•™์Šต๊ณผ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ํฌ์ŠคํŠธ๋„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” :)


 
์ „ ์‹œ๊ฐ„์— ์šฐ๋ฆฌ๋Š” create๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ POST๋ฐฉ์‹์œผ๋กœ ํšŒ์›๊ฐ€์ž… ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—๊ฒŒ Requestํ•˜์˜€๋‹ค. ์ด๋ฒˆ์€ CRUD์˜ Read๋ฅผ ํ•™์Šตํ•ด๋ณด์ž. ํ•™์Šต์€ ์–ด์ œ์™€ ๋™์ผํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ˆœ์„œ๋กœ ์ด๋ฃจ์–ด์งˆ ์˜ˆ์ •์ด๋‹ค.

 

์ €๋ฒˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CRUD๋ฅผ ์œ„ํ•ด Controller์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„ํ•ด๋ณด์ž.

 

 

์ €๋ฒˆ์— create๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ Repository์— ๋Œ€ํ•œ Read๋ฅผ ํ…Œ์ŠคํŠธํ•  ๊ฒƒ์ด๋ฏ€๋กœ

 

test/java/repository/UserRepositoryTests ํด๋ž˜์Šค์— read() ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.

 

Read๋Š” ํŠน์ • ๊ฐ’์— ์˜ํ•œ ์ •๋ณด๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ฏ€๋กœ ํŠน์ • ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์Œ์„ ๊ฐ€์ •ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

 

findById() ๋ฉ”์„œ๋“œ

findById()๋ฉ”์„œ๋“œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ํ† ๋Œ€๋กœ DB์—์„œ ๊ฐ’์„ ์กฐํšŒํ•ด์˜ค๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์•„๋ž˜์—์„œ ๋ณด๋ฉด ์•Œ๊ฒ ๋“ฏ

 

์ด findById() ์˜ default ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” Long ํƒ€์ž… id ์ด๋‹ค. id๊ฐ’์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ Read๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”

 

ํ›„์— ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

findById()์˜ ๋ฐ˜ํ™˜ํ˜• Optional<T>

์šฐ๋ฆฌ๋Š” id๊ฐ’์„ ์ฃผ๋ฉด ํ•ด๋‹น id์— ๊ด€๋ จ๋œ Data๋ฅผ Jpa๊ฐ€ ๊บผ๋‚ด์˜จ๋‹ค๊ณ  ํ–ˆ๋Š”๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด User ์ •๋ณด๋ฅผ ์–ป๊ณ ์‹ถ์œผ๋ฏ€๋กœ findById() ์˜ return ๊ฐ’์„ User๋กœ ๋ฐ›์œผ๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ํ•œ ๋ฒˆ ํ•ด๋ณด์ž

 

๊ทผ๋ฐ ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค.. ๋นจ๊ฐ„ ์ค„์ด ๋œจ๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜จ๋‹ค... ํ•œ ๋ฒˆ findById() ๋ฉ”์„œ๋“œ๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ณด์ž.

 

 

๋ณด๋‹ˆ findByid()๋ฉ”์„œ๋“œ๋Š” ์กฐํšŒํ•˜๋ ค๋Š” ๊ฐ’์ด ์กด์žฌํ•  ์ˆ˜๋„, ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์–ด์„œ null์— ์˜ํ•œ ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํ„ด์œผ๋กœ Optional<T>๋ฅผ ๋ฐ›๋Š”๋‹ค.

 

Optional<User>์˜ ifPresent() ๋ฉ”์„œ๋“œ์™€ isPresent()๋ฉ”์„œ๋“œ

Optional์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๊ฐ€ ifPresent() ๋ฉ”์„œ๋“œ์™€ isPresent()๋ฉ”์„œ๋“œ ์ด๋‹ค. ๊ทธ ํŠน์ง•๊ณผ ์ฐจ์ด์ ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด

 

ifPresent()

  • ํŠน์ • ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Optional์˜ ๊ฐ’์ด ์กด์žฌํ•  ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋  ๋กœ์ง์ด ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • ํ•จ์ˆ˜ํ˜• ์ธ์ž๋กœ ๋žŒ๋‹ค์‹์ด ๋„˜์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

isPresent()

  • ํŠน์ • ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ˜„์žฌ optional์˜ ๊ฐ’์ด null์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  • if-else๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ null๊ฐ’ ์กด์žฌ ๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ณผ ๊ฐ™์€๋ฐ ์šฐ๋ฆฌ๋Š” user.ifPresent()์—์„œ ๋žŒ๋‹ค์‹์œผ๋กœ select sql๋ฌธ๋ฒ•์ด ์ง„ํ–‰๋œ ํ›„๋ฅผ ๊ฐ€์ •ํ•˜์—ฌ selectUser๋กœ Optional ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ํ•จ์ˆ˜ ๋กœ์ง์„ ์‹คํ–‰์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ๋‹ค์Œ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ œ์ถœํ•ด๋ณด์ž

 

 

 

์ปดํŒŒ์ผ ์‹œ์—๋Š” 9L์ด ์•„๋‹ˆ๋ผ 1L์œผ๋กœ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค..

 

 

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž!

 

์ด์ œ test ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์„œ๋น„์Šค ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€๋ณด์ž.

 

 

1. controller ํŒจํ‚ค์ง€ ์•„๋ž˜์— UserController์—์„œ String์„ returnํ•˜๋Š” findUser() ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

์ €๋ฒˆ์— ์šฐ๋ฆฌ๊ฐ€ ํšŒ์›๊ฐ€์ž…์„ ๋งŒ๋“ค ๋•Œ๋Š” Post ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ†ต์‹ ์„ ์งฐ์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ์ž๋ฃŒ์˜ ๊ฒ€์ƒ‰์ด ๋ชฉ์ ์ด๋ฏ€๋กœ Get๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ†ต์‹ ์„ ์งœ๋ณด์ž.

 

  1. @GetMapping()์„ ํ†ตํ•ด์„œ Get ๋ฉ”์„œ๋“œ๋กœ ์ •๋ณด ๊ฒ€์ƒ‰์„ ํ•œ๋‹ค.

 

  1. Test์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Optional์„ ์ด์šฉํ•˜์—ฌ findById()์˜ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›์•„์ฃผ๊ณ  get()์œผ๋กœ Json ํƒ€์ž…์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๋Œ“๊ธ€