WebClient์™€ RestTemplate ๊ทธ๋ฆฌ๊ณ  RestClient
ยท
TIL
์™ธ๋ถ€API์™€ ์—ฐ๋™ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” RestTemplate๊ณผ WebClient ๊ฐ„์— ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„์ง€ ์ฐพ์•„๋ณด๊ณ , ์–ด๋–ค ๊ธฐ์ˆ ์„ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ดค์Šต๋‹ˆ๋‹ค. Webflux ?๋น„๋™๊ธฐ(Async), ๋…ผ๋ธ”๋กœํ‚น(Non-blocking) ๋ฐฉ์‹์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. WebClientSpring WebFlux์—์„œ ์ œ๊ณตํ•˜๋Š” HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. RestTemplate ?๋ธ”๋กœํ‚น(Blocking) ๊ธฐ๋ฐ˜์˜ ๋™๊ธฐ ๋ฐฉ์‹์˜ Spring MVC์˜ HTTP ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค.๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค ์ฐจ์žˆ๋Š” ๊ฒฝ์šฐ Queue์—์„œ ๋Œ€๊ธฐ๋ฅผ ํ•˜๊ฒŒ๋˜์–ด ์š”์ฒญ์ด ๋งŽ์•„์ง€๊ฒŒ ๋˜๋ฉด ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋น„์Šค ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. WebClient..
ํ”„๋กœ์ ํŠธ | ํ”„๋กœ์ ํŠธ ์ค‘ ํ•ด๊ฒฐ/๊ณ ๋ฏผํ•œ ๋ฌธ์ œ๋“ค ์ •๋ฆฌ! (feat. JPQL, Querydsl)
ยท
TIL
์„œ๋ก ์Œ.. ํฌ๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง„ ์•Š์•˜๊ณ , ์ด์ „ ํ”„๋กœ์ ํŠธ์— ๋น„ํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ์— ๋ช‡ ์‹œ๊ฐ„ ๊ฑธ๋ฆฌ๋Š” ์ผ๋„ ์—†์–ด์„œ ๋ฌด์ฒ™ ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๊ฒƒ๋“ค์ผ ์ˆ˜๋„ ์žˆ๋‹ค.ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ์ ๋“ค์ด ์ฐธ ๋งŽ๋‹ค........  1. ์„ฑ๋Šฅ ๊ฐœ์„  ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘? ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ์กฐํšŒํ•˜๋˜ ๋ถ€๋ถ„์„ JPQL๋กœ ์กฐํšŒํ•˜๋ฉด์„œ select ๋ฌธ์ด 2๊ฐœ์—์„œ 1๊ฐœ๋กœ ์ค„์—ˆ๋‹ค. ์™ ์ง€ ์„ฑ๋Šฅ ๊ฐœ์„ ์€ ์—„์ฒญ๋‚œ ์ฐจ์ด๋กœ ๊ฐœ์„ ํ•ด์•ผํ•˜๋Š” ๋А๋‚Œ์ธ ๋“ฏํ•˜์—ฌ..     ์ด๋Ÿฐ ๊ฑธ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•ด๋„ ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ..? — ์ดˆ๊ธฐ ์ฝ”๋“œ// ServiceUUID ownerUser = menu.getRestaurant().getOwner().getUserId(); ์‹คํ–‰๋˜๋Š” select ๋ฌธ๋“คHibernate: select m1_0.rm_id, m..
REST API | ๋ฐ์ดํ„ฐ ์ˆ˜์ • api ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ? (PATCH์™€ @DynamicUpdate ์ฐจ์ด์ )
ยท
TIL
์„œ๋ก myBatis ์‚ฌ์šฉํ•  ๋• ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— CRUD ๋ชจ๋‘ ๋ฐ์ดํ„ฐ ๋„ฃ๋Š” ๋ถ€๋ถ„์—์„œ ๊ตฌํ˜„ ๊ณ ๋ฏผ์€ ๋ณ„๋กœ ์—†์—ˆ๋‹ค.์ด๋ฒˆ์— ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š” Spring Boot + JPA ํ™˜๊ฒฝ์—์„œ PATCH ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์„ ์š”์ฒญ๋ฐ›์•„์„œ update ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ๊ตฌํ˜„์„ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ.. ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์ด์ „์—๋Š” Patch + @Dynamic ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒŒ ๊ธฐ์–ต์ด ๋‚ฌ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹น์‹œ์—๋Š” ํŒ€์›์ด ์“ฐ๊ธธ๋ž˜ ๋”ฐ๋ผ ์ผ๋˜ ๊ฑฐ๋ผ ๊ฐ๊ฐ์˜ ์ •ํ™•ํ•œ ๋™์ž‘๊ณผ ๋ชฉ์ ? (์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ์ ํ•ฉํ•œ์ง€..) ์— ๋Œ€ํ•ด์„œ ์•„์ฃผ ํ•œ ๋ฐœ์ง ๋” ๋‚˜๊ฐ€๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. PATCH๋ž€? โœ… ์ •์˜PATCH HTTP ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ผ๋ถ€ ํ•„๋“œ๋งŒ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” HTTP ๋ฉ”์„œ๋“œ์ด๋‹ค. ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋งŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ „์†กํ•˜๋Š” ..
REST API ์—์„œ์˜ HTTP ์‘๋‹ต ์ฝ”๋“œ (HTTP 201 Created)
ยท
TIL
๋ง‰์—ฐํ•˜๊ฒŒ ์•Œ๊ณ , ๋Œ€์ถฉ ์‚ฌ์šฉํ•˜๋˜ HTTP ์‘๋‹ต ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•  ์‹œ๊ฐ„.. ๋“œ๋””์–ด..ํ•œ ๋ฒˆ์— ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ POST ํ•˜๋‚˜ ์ •๋ฆฌ๋„ ๊ฝค๋‚˜ ๊ฑธ๋ ค์„œ ๋‚˜๋ˆ ์„œ ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค. ์‚ฌ์‹ค ์•„์ง POST ๋ง๊ณ ๋Š” ๊ถ๊ธˆํ•œ ์ ์ด ์—†์Œ. ์กฐํšŒ(GET) => 200 OK์ƒ์„ฑ(POST) => 201 Created์ˆ˜์ •(PUT, PATCH) => 200 OK / 204 No Content์‚ญ์ œ(DELETE) => 204 No Content ๐Ÿ”ถ ์ƒ์„ฑ(POST)POST ์š”์ฒญ ์‹œ 201 Created ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.์ด ๋•Œ, Location ํ—ค๋”์— ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. HTTP 201 Created์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์œผ๋ฉฐ, ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. URI๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ @PostMapping..
Spring JPA | Entity์™€ Dto ๋ถ„๋ฆฌ
ยท
TIL
Spring JPA๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ์ ์ด ์žˆ์–ด ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.Entity๋ฅผ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์„œ๋น„์Šค๋‹จ์—์„œ Entity์™€ Dto๋ฅผ ๋นŒ๋” ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณค ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Entity์— toResponseDto() ๋ฉ”์„œ๋“œ์™€ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค.์ด์— ๋Œ€ํ•ด Entity๋ฅผ ๋ณดํ˜ธํ•˜๋ผ! ๋ผ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๊ณ , ๊ณ ์น˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ „๋‹ฌ๋ฐ›์•˜๊ธฐ์— ๊ธฐ๋กํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.  ๐Ÿง Entity๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•˜๋Š” ์ด์œ Entity๋Š” ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋กœ ์œ ์ง€ํ•˜๊ณ , DTO์™€์˜ ์˜์กด์„ฑ์„ ์—†์• ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.Entity๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ 1:1 ๋งคํ•‘๋˜๋Š” ๊ฐ์ฒด์ธ๋ฐ, DTO์™€์˜ ๋ณ€ํ™˜ ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋ฉด ..
ํ”„๋กœ์ ํŠธ | ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ํ™•์žฅ์„ฑ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ
ยท
TIL
โœจ ์ฃผ์š” ๋‚ด์šฉ ํ–ฅํ›„์— ์–ด๋–ค ๋ณ€๋™(๊ธฐ๋Šฅ ๋ณ€๊ฒฝ, ์™ธ๋ถ€ ์„œ๋น„์Šค ๋“ฑ)์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•  ๊ฒƒ  โœ ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์„ค๊ณ„๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.๊ธฐํš์€ ํ•˜์ง€ ์•Š๊ณ , ์š”๊ตฌ์‚ฌํ•ญ์ด ์ฃผ์–ด์ง„ ์ฃผ๋ฌธ ๊ด€๋ฆฌ ํ”Œ๋žซํผ์„ ์„ค๊ณ„๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋  ์˜ˆ์ •์ด๋‹ค. ๊ณ ๋ คํ•  ์ ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ธฐ๋ฐ˜์˜ ๋ชจ๋†€๋ฆฌ์‹ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์ถ”ํ›„ MSA๋กœ ์ „ํ™˜ํ•  ๊ฒƒ.์‹ค์ œ๋กœ ์ดˆ๊ธฐ์—๋Š” ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋กœ MVP ์œ„์ฃผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ์ถ”ํ›„์— MSA๋ฅผ ๋„์ž…ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.์ดˆ๊ธฐ์— MSA๋ฅผ ๋„์ž…ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ถˆํ™•์‹ค์„ฑ, ์ธ๋ ฅ ๋ฐ ์ธํ”„๋ผ์˜ ์ œํ•œ ๋“ฑ ์—ฌ๋Ÿฌ ์š”์ธ์œผ๋กœ ํž˜๋“ค๋‹ค.ํ˜‘์—… ๋™๋ฃŒ(์˜ˆ. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž)์—๊ฒŒ ๋ฌธ์„œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•  ๊ฒƒ์ธ๊ฐ€?RESTful API ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ๊ณ ๋ คํ•  ์ ์€ ๋ฌด์—‡์ธ๊ฐ€?์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?ํ™•์žฅ์„ฑ์€ ์–ด๋””๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š”..