๐Ÿ’ป ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ Dispatcher-Servlet์˜ ๊ฐœ๋…๊ณผ ๋™์ž‘ ๊ณผ์ • ์•Œ์•„๋ณด๊ธฐ

2,882 ๋‹จ์–ดยท6 ๋ถ„ยท์›๋ฌธ(.md)

๊ฐœ์š” #

์Šคํ”„๋ง AOP, Filter, Interceptor๊ณผ ๊ฐ™์€ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•œ ์–˜๊ธฐ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ

์•„์ง ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™์•„ ํ•œ๋ฒˆ ๊ฐœ๋…๊ณผ ๋™์ž‘๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Servlet (Java Servlet) #

์ž๋ฐ” ์„œ๋ธ”๋ฆฟ์ด๋ž€ ์ž๋ฐ”๋ฅผ ์‚ฌ์šฉํ•ด ์›น์„ ๋“ฑ์กฑ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์„œ๋ฒ„์ธก ํ”„๋กœ๊ทธ๋žจ ํ˜น์€ ๊ทธ ์‚ฌ์–‘์„ ๋งํ•œ๋‹ค.

ํ”ํžˆ ์„œ๋ธ”๋ฆฟ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ์ž๋ฐ” ์„œ๋ธ”๋ฆฟ์€ ์›น ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฐ”์˜ ํด๋ž˜์Šค ์ผ์ข…์ด๋‹ค.

์ฆ‰, ์„œ๋ธ”๋ฆฟ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ ์ด๋‹ค.

Dispatcher-Servlet #

dispatch๋Š” "๋ณด๋‚ด๋‹ค" ๋ผ๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ ์žˆ๊ณ  ์ด๋Ÿฌํ•œ ๋‹จ์–ด๋ฅผ ํฌํ•จํ•ด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ HTTP๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„

๊ฐ€์žฅ ๋จผ์ € ๋ฐ›์•„์„œ ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ์œ„์ž„ํ•ด์ฃผ๋Š”ย ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ •์˜๋œ๋‹ค.

ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋ž€? (Front Controller)

์ฃผ๋กœ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ œ์ผ ์•ž์—์„œ ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ํด๋ผ์ด์–ธํŠธ๋“ค์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋‹ค.

MVC ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. (๊ณผ๊ฑฐ์—๋Š” ์ด๊ฒŒ ์—†์–ด์„œ web.xml์— ๋ชจ๋“  url์„ ๋“ฑ๋กํ•˜๋Š” ๋ถˆํŽธํ•จ์ด..)

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ์š”์ฒญ์€ ํ†ฐ์บฃ๊ณผ ๊ฐ™์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ์š”์ฒญ์„

ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ธ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๊ฐ€์žฅ ๋จผ์ € ๋ฐ›๋Š”๋‹ค. ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ๊ณตํ†ต์ ์ธ ์ž‘์—…์„ ๋จผ์ € ์ฒ˜๋ฆฌ ํ›„

์š”์ฒญ์— ํ•ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์•„ ์ž‘์—…์„ ์œ„์ž„ํ•ด์ค€๋‹ค.

์žฅ์ 

-> ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ํ•ธ๋“ค๋ง ํ•œ๋‹ค.

-> ๊ณตํ†ต ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. (์šฐ๋ฆฌ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ด๋‘๊ธฐ๋งŒ ํ•˜๋ฉด ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์•Œ์•„์„œ ์œ„์ž„ํ•ด์ฃผ์–ด ํŽธ๋ฆฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.)

but

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์ •์  ์ž์›์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๋ฌธ์ œ๊ฐ€ํ•˜๋‚˜ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด

๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋‹ค ๋ณด๋‹ˆ image, HTML, CSS, JavaScript์™€ ๊ฐ™์€ ์ •์ ์ž์›์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ๋„ ๋ฐœ์ƒํ•œ๋‹ค/

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋“ค์€ ๋‘๊ฐ€์ง€์˜ ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ–ˆ๋‹ค.

  1. ์ •์  ์ž์› ์š”์ฒญ๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”์ฒญ ๋ถ„๋ฆฌ

  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์š”์ฒญ ํƒ์ƒ‰ ํ›„ ์—†์œผ๋ฉด ์ •์  ์ž์›์— ๋Œ€ํ•œ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌ

1. ์ •์  ์ž์› ์š”์ฒญ๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”์ฒญ ๋ถ„๋ฆฌ

-> /app ์˜ URL๋กœ ์ ‘๊ทผํ•˜๋ฉด Dispatcher Servlet์ด ๋‹ด๋‹น

-> /resource ์˜ URL๋กœ ์ ‘๊ทผํ•˜๋ฉด Dispatcher Servlet์ด ์ปจํŠธ๋กคํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ดœ์ฐฎ์•„ ๋ณด์ด๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์„ค๊ณ„ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ƒ๋‹นํžˆ ์ง€์ €๋ถ„ํ•ด์ง„๊ณ  ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ €๋Ÿฐ

URL(app, resource)์„ ๋ถ™์—ฌ์ค˜์•ผ ํ•˜๋ฏ€๋กœ ์ง๊ด€์ ์ธ ์„ค๊ณ„๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค.

2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํƒ์ƒ‰ ํ›„ ์—†์œผ๋ฉด ์ •์  ์ž์›์— ๋Œ€ํ•œ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌ

์ •์  ์ž์›์˜ ์š”์ฒญ๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”์ฒญ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ํ•œ๊ณ„๋ฅผ ๋А๋ผ๊ณ  ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ•ด๋‚ด์—ˆ๋‹ค.

์š”์ฒญ์— ๋Œ€ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—, 2์ฐจ์ ์œผ๋กœ ์„ค์ •๋œ ์ž์› ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•ด ์ž์›์„ ํƒ์ƒ‰ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์˜์—ญ์„ ๋ถ„๋ฆฌํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์— ํšจ์œจ์ ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ถ”ํ›„์— ํ™•์žฅ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

#

๋™์ž‘๊ณผ์ • #

์œ„์˜ ๊ทธ๋ฆผ์€ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด๋‹ค. ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์•ž์„œ ๋งํ•œ๋Œ€๋กœย ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์•„ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›๋Š”๋‹ค.

  2. ์š”์ฒญ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ์œ„์ž„ํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

  3. ์š”์ฒญ์„ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์œ„์ž„ํ•  ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ฐพ์•„์„œ ์ „๋‹ฌํ•œ๋‹ค.

  4. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.

  5. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  6. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  7. HanlderAdapter๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  8. ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๋ฐ›๋Š”๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์€ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ๋„์‹ํ™”ํ•œ ๊ฒƒ์œผ๋กœ ์•ž์„œ ์„ค๋ช…ํ–ˆ๋“ฏ ์„œ๋ธ”๋ฆฟ์€ ๊ฐ€์žฅ ๋จผ์ € ์š”์ฒญ์„ ๋ฐ›๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋‹ค.

์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ(Web Context)์—์„œ ํ•„ํ„ฐ๋“ค์„ ์ง€๋‚˜ ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ์—์„œ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๊ฐ€์žฅ ๋จผ์ € ์š”์ฒญ์„ ๋ฐ›๋Š”๋‹ค.

์‹ค์ œ๋กœ Interceptor๊ฐ€ Controller๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ์ € ์œ„์— ๋งํ–ˆ๋“ฏ ์ฒ˜๋ฆฌ์ˆœ์„œ๋ฅผ ๋„์‹ํ™” ํ•œ ๊ฒƒ ๋ฟ์ด๋‹ค.

์š”์ฒญ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ์œ„์ž„ํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

HandlerMapping ๊ตฌํ˜„์ฒด์ค‘ ํ•˜๋‚˜์ธ RequestMapping HandlerMapping์€ @Controller๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ ๋นˆ์„ ํŒŒ์‹ฑํ•˜์—ฌ HashMap(์š”์ฒญ ์ •๋ณด, ์ฒ˜๋ฆฌ ๋Œ€์ƒ)์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์—„๋ฐ€ํžˆ ๋งํ•˜์ž๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์•„๋‹Œ, ์š”์ฒญ์— ๋งคํ•‘๋˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š” HandlerMethod ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์€ ์š”์ฒญ์ด ์˜ค๋ฉด HTTP Method, URI๋“ฑ์„ ํ†ตํ•ด Key ๊ฐ์ฒด์ธ ์š”์ฒญ ์ •๋ณด๋ฅผ ๋งŒ๋“ค๊ณ , Value์ธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  HandlerMethod๋ฅผ ์ฐพ์•„ HandlerMethodExecutionChain์œผ๋กœ ๊ฐ์‹ธ ๋ฐ˜ํ™˜ํ•œ๋‹ค. HandlerMethodExecutionChain์œผ๋กœ ๊ฐ์‹ธ๋Š” ์ด์œ ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ๋„˜๊ฒจ์ฃผ๊ธฐ ์ „ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š”ย ์ธํ„ฐ์…‰ํ„ฐ๋“ฑ์„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.

์š”์ฒญ์„ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์œ„์ž„ํ•  ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ฐพ์•„ ์ „๋‹ฌํ•จ

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ง์ ‘ ์š”์ฒญ์„ ์œ„์ž„ํ•˜๋Š”๊ฒŒ ์•„๋‹Œ HandlerAdapter๋ผ๋Š” ์นœ๊ตฌ๋ฅผ ํ†ตํ•ด์„œ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.

์ด๋•Œ ์–ด๋Œ‘ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ด์œ ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„๋ฐฉ์‹์ด ๋‹ค์–‘ํ•ด์„œ๋‹ค.

์ตœ๊ทผ์—๋Š” @Controller, @RequestMapping ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜๋งŒ ์‚ฌ์šฉํ•ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธด ํ•˜์ง€๋งŒ

์ปจํŠธ๋กค๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ๋‹ค. ์Šคํ”„๋ง์€ HanlderAdapter๋ผ๋Š” ์–ด๋Œ‘ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด

์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•จ์œผ๋กœ์จ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์— ์ƒ๊ด€ ์—†์ด ์š”์ฒญ์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•จ

ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ปจํŠธ๋กค๋Ÿด๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•˜๊ธฐ์ „ ๊ณตํ†ต์ ์ธ ์ „/ํ›„ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ๋“ค์„ ํฌํ•จํ•ด @RequestParm,@RequestBody ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ArgumentResolver๋“ค๊ณผ

์‘๋‹ต ์‹œ์— ResponseEntity์˜ Body๋ฅผ Json์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”

ReturnValueHandler๋“ฑ์ด ์–ด๋Œ‘ํ„ฐ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌ๋˜๊ธฐ ์ „ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์š”์ฒญ์„ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์š”์ฒญ์ด ์œ„์ž„๋˜๋Š” ๊ณผ์ •์— ๋ฆฌํ”Œ๋ ‰์…˜์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋Œ€์ƒ ์ •๋ณด์ธ HandlerMethod ๊ฐ์ฒด์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์ •๋ณด์™€ ๋ฉ”์„œ๋“œ ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฆฌํ”Œ๋ ‰์…˜ ๋ฉ”์„œ๋“œ ๊ฐ์ฒด๋ฅผ invoke ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌํ”Œ๋ ‰์…˜(Reflection)์ด๋ž€?

๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ํƒ€์ž…์„ ์•Œ์ง€ ๋ชปํ•ด๋„ ๊ทธ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ, ํƒ€์ž…, ๋ณ€์ˆ˜๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ž๋ฐ” API

์‚ฌ์‹ค ์‹ค์ œ๋กœ๋Š” HandlerMethod์— ์ปจํŠธ๋กค๋Ÿฌ ๋นˆ ์ด๋ฆ„๊ณผ ๋ฉ”์„œ๋“œ, ๋นˆ ํŒฉํ† ๋ฆฌ๊ฐ€ ์žˆ์–ด ๋นˆ ํŒฉํ† ๋ฆฌ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ๋นˆ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ ๋นˆ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•จ

์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ฒ˜๋ฆฌ๋œ ํ›„ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (ResponseEntity, View Name)

HandlerAdapter๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ์ฒ˜๋ฆฌํ•จ

ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต์„ ์‘๋‹ต ์ฒ˜๋ฆฌ๊ธฐ์ธ ReturnValueHandler๊ฐ€ ํ›„์ฒ˜๋ฆฌํ•œ ํ›„ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ResponseEntity๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด HttpEntityMethodProcessor๊ฐ€ MessageConverter๋ฅผ ์‚ฌ์šฉํ•ด ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•œ ํ›„ ์‘๋‹ต ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ทฐ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ทฐ๋ฆฌ์กธ๋ฒ„๋ฅผ ํ†ตํ•ด ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ˜ํ™˜

๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์„ ํ†ตํ•ด ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต์€ ๋‹ค์‹œ ํ•„ํ„ฐ๋“ค์„ ๊ฑฐ์ณ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๊ธ€

https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80

Back-End/spring/dispatcher_servlet.md