์ ์ฒด ๊ธ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. ์ด์ 1 2 3 4 ยทยทยท 9 ๋ค์