๐Ÿ“—Spring MVC Study [ ์š”์ฒญ ๋งคํ•‘ ํ—จ๋“ค๋Ÿฌ ์–ด๋ށํ„ฐ, HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ ]

Caruhยท2025๋…„ 3์›” 25์ผ

Spring MVC

๋ชฉ๋ก ๋ณด๊ธฐ
17/17
post-thumbnail

์š”์ฒญ ๋งคํ•‘ ํ—จ๋“ค๋Ÿฌ ์–ด๋ށํ„ฐ

  • ๊ณผ์—ฐ HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋Š” ์Šคํ”„๋ง MVC ๊ตฌ์กฐ ์ค‘ ์–ด๋””์—์„œ ์‚ฌ์šฉ๋ ๊นŒ?
  • ๋ชจ๋“  ์˜๋ฌธ์€ ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ ์ฆ‰ @RequestMapping์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋ށํ„ฐ์ธ @RequestMappingHandlerAdapter(์š”์ฒญ ๋งคํ•‘ ํ—จ๋“ค๋Ÿฌ ์–ด๋ށํ„ฐ)์— ์žˆ๋‹ค.

RequestMaapingHandlerAdapter ๋™์ž‘ ๋ฐฉ์‹

ArguemntResolver

ArgumentResolver ๋•๋ถ„์— ์šฐ๋ฆฌ๋Š” ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ปจํŠธ๋กค๋Ÿฌ -> ๋งค์šฐ ๋‹ค์–‘ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ๊ฐ€๋Šฅ

  • ex) HttpServletRequest, Model, @RequestParam, @ModelAttriburte๊ฐ™์€ ์• ๋…ธํ…Œ์ด์…˜, @RequestBody, HttpEntity ๊ฐ™์€ HTTP ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„
  • ์• ๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” @RequestMappingAdapter๋Š” ๋ฐ”๋กœ ์ด ArgumentResolver๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ปจํŠธ๋กค๋Ÿฌ(ํ•ธ๋“ค๋Ÿฌ)๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’(๊ฐ์ฒด)์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์ด ๋ชจ๋‘ ์ค€๋น„๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ฐ’์„ ๋„˜๊ฒจ์ค€๋‹ค.

์ฐธ๊ณ 


๋™์ž‘ ๋ฐฉ์‹

์ •ํ™•ํžˆ๋Š” HandlerMethodArgumentResolver์ธ๋ฐ ์ค„์—ฌ์„œ ArgumentResolver๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

public interface HandlerMethodArgumentResolver {

	boolean supportsParameter(MethodParameter parameter);
    @Nullable
	Object resolveArgument(MethodParameter parameter, @Nullable 
	ModelAndViewContainer mavContainer,
 	NativeWebRequest webRequest, @Nullable WebDataBinderFactory 
	binderFactory) throws Exception;
}

๋™์ž‘๋ฐฉ์‹

ArgumentResolver์˜ supportsParameter()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ์ฒดํฌํ•˜๊ณ , ์ง€์›ํ•˜๋ฉด resolverArgument()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ์‹œ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ.

ReturnValueHandler

  • HandlerMethodReturnValueHandler๋ฅผ ์ค„์—ฌ์„œ ReturnValueHandler๋ผ ๋ถ€๋ฅธ๋‹ค. ArgumentResolver์™€ ๋น„์Šทํ•œ๋ฐ, ์ด๊ฒƒ์„ ์‘๋‹ต ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ String์œผ๋กœ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ด๋„, ๋™์ž‘ํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ReturnValueHandler ๋•Œ๋ฌธ์ด๋‹ค.

์ฐธ๊ณ 

HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ

HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ ์œ„์น˜

HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋Š” ์–ด๋””์ฏค์— ์œ„์น˜ํ• ๊นŒ?

  • HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋Š” ์‚ฌ์šฉํ•˜๋Š” @RequestBody๋„ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์— ์‚ฌ์šฉ๋œ๋‹ค.
  • @ResponseBody์˜ ๊ฒฝ์šฐ๋„ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ด์šฉํ•œ๋‹ค.

์š”์ฒญ์˜ ๊ฒฝ์šฐ @RequestBody๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ArgumentResolver๊ฐ€ ์žˆ๊ณ , HttpEntity๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ArgumentResolver๊ฐ€ ์žˆ๋‹ค. ์ด ArgumentResolver๋“ค์ด HTTP ๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ

์‘๋‹ต์˜ ๊ฒฝ์šฐ @ResponseBody์™€ HttpEntity๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ReturnValueHandler๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ HTTP๋ฉ”์‹œ์ง€ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ ๋‹ค.

์Šคํ”„๋ง MVC๋Š” @RequestBody @ResponseBody๊ฐ€ ์žˆ์œผ๋ฉด RequestResponseBodyMethodProcessor(ArgumentResolver, ReturnValueHandler ๋‘˜๋‹ค ๊ตฌํ˜„) HttpEntity๊ฐ€ ์žˆ์œผ๋ฉด HttpEntityMethodProcessor(ArgumentResolver, ReturnValueHandler ๋‘˜๋‹ค ๊ตฌํ˜„)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ฐธ๊ณ 

  • HttpMessageConverter๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด๊ธฐ

ํ™•์žฅ

  • ์Šคํ”„๋ง์€ ๋‹ค์Œ์„ ๋ชจ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ œ๊ณต, ๋”ฐ๋ผ์„œ ํ•„์š”ํ•˜๋ฉด ์–ธ์ œ๋“ ์ง€ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • HandlerMethodArgumentResolver
    • HandlerMethodReturnValueHandler
    • HttpMessageConverter
  • ์‚ฌ์‹ค์ƒ ์Šคํ”„๋ง์ด ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์„ ์ œ๊ณตํ•จ.
  • ๊ธฐ๋Šฅ ํ™•์žฅ์€ WebMvcConfigurer๋ฅผ ์ƒ์† ๋ฐ›์•„์„œ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก
  • ์‹ค์ œ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์œผ๋‹ˆ ์‹ค์ œ ๊ธฐ๋Šฅ ํ™•์žฅ์ด ํ•„์š”ํ•˜๋ฉด WebMvcConfigurer๊ฒ€์ƒ‰ํ•ด๋ณด์ž.

๐Ÿ“ญ Reference

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€