๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ51

FeignClient vs RestClient ์™ธ๋ถ€  API ํ…Œ์ŠคํŠธ์ธ WireMock ์ฐพ์•„๋ณด๋‹ค๊ฐ€ FeignClient๋ฅผ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.์ง€๋‚œ๋ฒˆ์— RestTemplate, WebClient(webflux), RestClient ์ฐพ์•„๋ณผ ๋• ๋ชฐ๋ผ์„œ ํ•จ๊ป˜ ๋น„๊ตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. FeignClient ๋ž€?Netflix์—์„œ ๊ฐœ๋ฐœํ•œ ์„ ์–ธํ˜• HTTP ํด๋ผ์ด์–ธํŠธ๋กœ Spring Cloud์™€ ํ†ตํ•ฉ์ด ์›ํ™œํ•˜์—ฌ MSA์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.์„ ์–ธํ˜• HTTP ํด๋ผ์ด์–ธํŠธ: ์ธํ„ฐํŽ˜์ด์Šค์™€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ REST API ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.Spring Boot์—์„œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ์„ค์ •๋œ๋‹ค.Ribbon ๋ฐ Hystrix๋ฅผ ํ™œ์šฉํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๊ณผ ์žฅ์•  ๋ณต๊ตฌ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— MSA์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์ด ์‰ฝ๋‹ค.  Restclient ๋ž€?Spri.. 2025. 2. 28.
CSRF์™€ XSS ์˜ˆ์ „์— ๋ฐœํ‘œ ์ž๋ฃŒ๋กœ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ ๋ณต์Šต ๊ฒธ ์ž‘์„ฑ CSRF   CSRF์˜ ์ •์˜Cross-Site Request Forgery, ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ ๊ฐ„์— ์š”์ฒญ์„ ์œ„์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋œ ์ƒํƒœ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์„ธ์…˜ ์ •๋ณด๊ฐ€ ๋‚จ์•„ ์žˆ์„ ๋•Œ, ์‚ฌ์šฉ์ž์˜ ์˜์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ์•…์˜์ ์ธ ์š”์ฒญ์„ ์„œ๋ฒ„์— ์ „์†กํ•˜๊ฒŒ ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ์ด์šฉํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ• CSRF์˜ ๊ณต๊ฒฉ ์›๋ฆฌCSRF ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ์ทจ์•ฝ์ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋‚จ์•„์žˆ๋Š” ์ฟ ํ‚ค ๊ธฐ๋ฐ˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฟ ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ๋ฌด๋ ฅํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค-- CSRF์˜ ์œ ๋„ ๋งค์ฒด์ด๋ฉ”์ผ, ๋ฉ”์‹œ์ง€, ์ด๋ฏธ์ง€ ๋งํฌ ๋“ฑ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋งํฌ๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฒŒ ์œ ๋„ํ•จ CSRF ๋ฐฉ์–ด ๋ฐฉ๋ฒ•์‚ฌ์šฉ์ž์˜ ์š”์ฒญ/์ถœ์ฒ˜๋ฅผ ๊ฒ€์ฆํ•˜์—ฌ ์•…์„ฑ ์š”์ฒญ ๋ฐฉ์ง€ ๋ฐ ๋ฌดํšจํ™”1. CSRF ํ† ํฐ2. Sam.. 2025. 2. 26.
PageableArgumentResolver๋ฅผ ํ™œ์šฉํ•œ @Pageable ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ ์ œํ•œ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ ์ค‘์— ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ๋ฅผ 10, 30, 50์œผ๋กœ ์ œํ•œํ•˜๊ณ  ์ง€์ •ํ•œ ์‚ฌ์ด์ฆˆ ์™ธ์— ๋‹ค๋ฅธ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์ธ 10์œผ๋กœ ํŽ˜์ด์ง•ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.์ฒ˜์Œ์—๋Š” ๊ฐ ๋„๋ฉ”์ธ์—์„œ ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ ์ œํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ ์šฉ์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋Ÿฌ๋˜ ์ค‘ ArgumentResolver์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋˜์—ˆ๊ณ , ๊ทธ ์ค‘์—์„œ๋„ PageableArgumentResolver๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ ์ œํ•œ์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. Handler Method Argument Resolver ๋ž€?Spring MVC์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์— ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.์˜ˆ์‹œ๋กœ๋Š” @RequestParam, @ModelAttribute, @RequestBody ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Handler Method Argu.. 2025. 2. 24.
WebClient์™€ RestTemplate ๊ทธ๋ฆฌ๊ณ  RestClient ์™ธ๋ถ€API์™€ ์—ฐ๋™ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” RestTemplate๊ณผ WebClient ๊ฐ„์— ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„์ง€ ์ฐพ์•„๋ณด๊ณ , ์–ด๋–ค ๊ธฐ์ˆ ์„ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ดค์Šต๋‹ˆ๋‹ค. Webflux ?๋น„๋™๊ธฐ(Async), ๋…ผ๋ธ”๋กœํ‚น(Non-blocking) ๋ฐฉ์‹์˜ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. WebClientSpring WebFlux์—์„œ ์ œ๊ณตํ•˜๋Š” HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. RestTemplate ?๋ธ”๋กœํ‚น(Blocking) ๊ธฐ๋ฐ˜์˜ ๋™๊ธฐ ๋ฐฉ์‹์˜ Spring MVC์˜ HTTP ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค.๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค ์ฐจ์žˆ๋Š” ๊ฒฝ์šฐ Queue์—์„œ ๋Œ€๊ธฐ๋ฅผ ํ•˜๊ฒŒ๋˜์–ด ์š”์ฒญ์ด ๋งŽ์•„์ง€๊ฒŒ ๋˜๋ฉด ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋น„์Šค ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. WebClient.. 2025. 2. 21.
ํ”„๋กœ์ ํŠธ | ํ”„๋กœ์ ํŠธ ์ค‘ ํ•ด๊ฒฐ/๊ณ ๋ฏผํ•œ ๋ฌธ์ œ๋“ค ์ •๋ฆฌ! (feat. JPQL, Querydsl) ์„œ๋ก ์Œ.. ํฌ๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง„ ์•Š์•˜๊ณ , ์ด์ „ ํ”„๋กœ์ ํŠธ์— ๋น„ํ•ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ์— ๋ช‡ ์‹œ๊ฐ„ ๊ฑธ๋ฆฌ๋Š” ์ผ๋„ ์—†์–ด์„œ ๋ฌด์ฒ™ ๋‹จ์ˆœํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๊ฒƒ๋“ค์ผ ์ˆ˜๋„ ์žˆ๋‹ค.ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ์ ๋“ค์ด ์ฐธ ๋งŽ๋‹ค........  1. ์„ฑ๋Šฅ ๊ฐœ์„  ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘? ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ์กฐํšŒํ•˜๋˜ ๋ถ€๋ถ„์„ JPQL๋กœ ์กฐํšŒํ•˜๋ฉด์„œ select ๋ฌธ์ด 2๊ฐœ์—์„œ 1๊ฐœ๋กœ ์ค„์—ˆ๋‹ค. ์™ ์ง€ ์„ฑ๋Šฅ ๊ฐœ์„ ์€ ์—„์ฒญ๋‚œ ์ฐจ์ด๋กœ ๊ฐœ์„ ํ•ด์•ผํ•˜๋Š” ๋Š๋‚Œ์ธ ๋“ฏํ•˜์—ฌ..     ์ด๋Ÿฐ ๊ฑธ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•ด๋„ ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ..? — ์ดˆ๊ธฐ ์ฝ”๋“œ// ServiceUUID ownerUser = menu.getRestaurant().getOwner().getUserId(); ์‹คํ–‰๋˜๋Š” select ๋ฌธ๋“คHibernate: select m1_0.rm_id, m.. 2025. 2. 20.
REST API | ๋ฐ์ดํ„ฐ ์ˆ˜์ • api ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ? (PATCH์™€ @DynamicUpdate ์ฐจ์ด์ ) ์„œ๋ก myBatis ์‚ฌ์šฉํ•  ๋• ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— CRUD ๋ชจ๋‘ ๋ฐ์ดํ„ฐ ๋„ฃ๋Š” ๋ถ€๋ถ„์—์„œ ๊ตฌํ˜„ ๊ณ ๋ฏผ์€ ๋ณ„๋กœ ์—†์—ˆ๋‹ค.์ด๋ฒˆ์— ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ ์ด์œ ๋Š” Spring Boot + JPA ํ™˜๊ฒฝ์—์„œ PATCH ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์„ ์š”์ฒญ๋ฐ›์•„์„œ update ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ๊ตฌํ˜„์„ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ.. ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์ด์ „์—๋Š” Patch + @Dynamic ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒŒ ๊ธฐ์–ต์ด ๋‚ฌ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹น์‹œ์—๋Š” ํŒ€์›์ด ์“ฐ๊ธธ๋ž˜ ๋”ฐ๋ผ ์ผ๋˜ ๊ฑฐ๋ผ ๊ฐ๊ฐ์˜ ์ •ํ™•ํ•œ ๋™์ž‘๊ณผ ๋ชฉ์ ? (์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ์ ํ•ฉํ•œ์ง€..) ์— ๋Œ€ํ•ด์„œ ์•„์ฃผ ํ•œ ๋ฐœ์ง ๋” ๋‚˜๊ฐ€๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. PATCH๋ž€? โœ… ์ •์˜PATCH HTTP ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ผ๋ถ€ ํ•„๋“œ๋งŒ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” HTTP ๋ฉ”์„œ๋“œ์ด๋‹ค. ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋งŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ „์†กํ•˜๋Š” .. 2025. 2. 19.