ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring / SpringBoot] Dispatcher Servlet(๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ) ๋™์ž‘ ๊ณผ์ • / SpringBoot(์Šคํ”„๋ง๋ถ€ํŠธ) ์š”์ฒญ, ์‘๋‹ต ํ๋ฆ„
    ๐Ÿ’ปProgramming/SpringBoot 2023. 9. 18. 12:34
    ๋ฐ˜์‘ํ˜•

    Dispatcher Servlet์ด๋ž€?

    DispatcherServlet์€ HTTP ํ”„๋กœํ† ์ฝœ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๋จผ์ € ๋ฐ›์•„์„œ ์ ํ•ฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ์œ„์ž„(Delegate Request)ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” Front Controller๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. Front Controller๋ž€ ์ฃผ๋กœ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์˜ ์ œ์ผ ์•ž์—์„œ ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋กœ์„œ, MVC ๊ตฌ์กฐ์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

    *์Šคํ”„๋ง๋ถ€ํŠธ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ์ž๋™ ๊ตฌ์„ฑ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํ”„๋ง๋ถ€ํŠธ ๊ตฌ๋™์‹œ DispatcherServlet์„ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ž๋™ ๋“ฑ๋กํ•˜๊ณ , ๋ชจ๋“  ๊ฒฝ๋กœ"/"์— ๋Œ€ํ•ด ๋งคํ•‘ํ•œ๋‹ค. 

     

    https://mozzi-devlog.tistory.com/8

    ์ •์  ์ž์›(Static Resources)์˜ ์ฒ˜๋ฆฌ

    Dispatcher Servlet์ด ๋ชจ๋“  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋‹ค๋ณด๋‹ˆ ์ด๋ฏธ์ง€, css, javascript๋“ฑ๊ณผ ๊ฐ™์€ ์ •์  ์ž์›์— ๋Œ€ํ•œ ์š”์ฒญ๋งˆ์ € ๋ชจ๋‘ ๊ฐ€๋กœ์ฑ„๋ฉฐ ์ •์  ์ž์›์„ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•จ.

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

    - /apps์˜ ์—”๋“œํฌ์ธํŠธ๋กœ ์ ‘๊ทผํ•˜๋ฉด Dispatcher Servlet์ด ๋‹ด๋‹น

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

    -> ๋ชจ๋“  ์—”๋“œํฌ์ธํŠธ์— apps์™€ resources๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•˜๋ฏ€๋กœ ์ง๊ด€์ ์ธ ์„ค๊ณ„ ๋ถˆ๊ฐ€๋Šฅ

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

    Dispatcher Servlet์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๊ณ  ์—†์œผ๋ฉด 2์ฐจ์ ์œผ๋กœ ์ž์›(resources)๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ž์› ํƒ์ƒ‰.

    -> ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์ง€์› / ์ถ”ํ›„์— ํ™•์žฅ ์šฉ์ด

    Dispatcher Servlet์˜ ์žฅ์ 

    ๊ณผ๊ฑฐ์— Dispatcher Servlet์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „์—๋Š” ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•ด URL์„ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ จ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์กด์žฌํ–ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•ด์„œ URL ๋งคํ•‘์„ ํ•˜๊ธฐ ์œ„ํ•ด web.xmlํŒŒ์ผ์— ๋ชจ๋‘ ๋“ฑ๋กํ•ด์•ผ ํ–ˆ์ง€๋งŒ, Dispatcher Servlet์ด ํ•ด๋‹น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ํ•ธ๋“ค๋งํ•˜๊ณ  ๊ณตํ†ต ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๋งค์šฐ ํŽธ๋ฆฌํ•ด์กŒ๋‹ค. ํ•œ๋งˆ๋””๋กœ Dispatcher Sevlet์€ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ๊ณตํ†ต์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— web.xml์— ๋Œ€ํ•œ ์˜์กด์„ ๊ทน์ ์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉด์„œ, ํ•˜๋‚˜์˜ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณตํ†ต๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘๋„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

    ์šฐ๋ฆฌ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด Dispatcher Servlet์ด ์•Œ์•„์„œ ์ผ์น˜ํ•˜๋Š” Controller๋กœ ์œ„์ž„์„ ํ•ด์ฃผ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋˜์—ˆ๋‹ค.

    + Servlet์ด๋ž€?

    : ์ž๋ฐ” ์›น ์•ฑ์—์„œ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฐ” ํด๋ž˜์Šค

    Dispatcher Servlet์˜ ๋™์ž‘ ๊ณผ์ •

    https://mangkyu.tistory.com/18

    1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์— ์š”์ฒญ์„ ๋ณด๋ƒ„

    ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ๋กœ์„œ Web Context์—์„œ ํ•„ํ„ฐ๋“ค์„ ์ง€๋‚˜ ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ์—์„œ ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์ด ๊ฐ€์žฅ ๋จผ์ € ์š”์ฒญ์„ ๋ฐ›๊ฒŒ๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” URL(ex. /follow/{fromUser}/{toUser})๋กœ ์ ‘๊ทผํ•˜์—ฌ ์ •๋ณด๋ฅผ ์š”์ฒญํ•œ๋‹ค.

    2. ํ•ด๋‹น ์š”์ฒญ์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งคํ•‘ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค. 

    ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ)๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์‹๋ณ„ํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด HandlerMapping์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€  "follow/{userId}/post"์—”๋“œํฌ์ธํŠธ๋กœ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋ฉด HandlerMapping์ด @Controller์ค‘ Follow๋ฅผ ๊ตฌํ˜„ํ•œ @Controller๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค. 

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

    ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  @Controller๋ฅผ ์ฐพ์•˜์œผ๋ฉด ์š”์ฒญ์„ ์œ„์ž„ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์€ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋ฐ”๋กœ ์š”์ฒญ์„ ์œ„์ž„ํ•˜์ง€ ์•Š๊ณ , HandlerAdapter๋ฅผ ํ†ตํ•ด ์œ„์ž„ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์ด ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ์ž‘์„ฑ๋˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ”„๋ง์€ HandlerAdapter๋ผ๋Š” ์–ด๋Œ‘ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•จ์œผ๋กœ์จ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ตฌํ˜„ ๋ฐฉ์‹์— ์ƒ๊ด€์—†์ด ์š”์ฒญ์„ ์œ„์ž„ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

    4. HandlerAdapter๊ฐ€ Controller๋กœ ์š”์ฒญ์„ ์œ„์ž„.

    ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋Š” ์š”์ฒญ์„ ์œ„์ž„ํ•œ ์ „/ํ›„์— ๊ณตํ†ต์ ์ธ ์ „/ํ›„์ฒ˜๋ฆฌ ๊นŒ์ง€ ํ•ด์ค€๋‹ค. @RequestParam, @RequestBody๋“ฑ์˜ ์ „์ฒ˜๋ฆฌ์™€ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์ธ ResponseEntity์˜ Body๋ฅผ Json์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค. 

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

    ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

    6. Controller๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฐ˜ํ™˜

    ์ผ๋ฐ˜์ ์œผ๋กœ ResponseEntity๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐ˜ํ™˜.

    return ResponseEntity.ok().body(responseDTO);

    ์˜ˆ๋ฅผ๋“ค์–ด ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    7. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. 

    ์•„๊นŒ 4๋ฒˆ์—์„œ HandlerAdapter๋Š” ์š”์ฒญ์„ ์œ„์ž„ํ•œ ์ „์ฒ˜๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ›„์ฒ˜๋ฆฌ๊นŒ์ง€ ํ•ด์ค€๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต์„ ์‘๋‹ต ์ฒ˜๋ฆฌ๊ธฐ์ธ ReturnValueHandler๊ฐ€ ํ›„์ฒ˜๋ฆฌํ•œ ํ›„์— ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋Œ๋ ค์ค€๋‹ค. ๋งŒ์•ฝ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ResponseEntity๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด HttpEntityMethodProcessor๊ฐ€ MessageConverter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•˜๊ณ  ์‘๋‹ต ์ƒํƒœ๋ฅผ ์„ค์ •. ๋งŒ์•ฝ View์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ViewResolver๋ฅผ ํ†ตํ•ด View๋ฅผ ๋ฐ˜ํ™˜.

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

    ์‘๋‹ต์ด ๋ฐ์ดํ„ฐ๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜๋˜๊ณ , ํ™”๋ฉด์ด๋ผ๋ฉด View์˜ ์ด๋ฆ„์— ๋งž๋Š” View๋ฅผ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ViewResolver๊ฐ€ ์ ์ ˆํ•œ ํ™”๋ฉด์„ ๋‚ด๋ ค์ค€๋‹ค.

     

    References

    ๊ฐ€์žฅ ๋งŽ์ด ์ฐธ๊ณ ํ•œ ๊ธ€:

    https://mangkyu.tistory.com/18

     

    [Spring] Dispatcher-Servlet(๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ)์ด๋ž€? ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์˜ ๊ฐœ๋…๊ณผ ๋™์ž‘ ๊ณผ์ •

    ์ด๋ฒˆ์—๋Š” servlet์˜ ์‹ฌํ™” ๋˜๋Š” ๋Œ€ํ‘œ์ฃผ์ž์ธ dispatcher-servlet์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 1. Dispatcher-Servlet(๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ)์˜ ๊ฐœ๋… [ Dispatcher-Servlet(๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ) ์ด๋ž€? ] ๋””์ŠคํŒจ์ฒ˜ ์„œ๋ธ”๋ฆฟ์˜

    mangkyu.tistory.com

    https://jake-seo-dev.tistory.com/435

    https://mozzi-devlog.tistory.com/8

    ๋ฐ˜์‘ํ˜•
Designed by Tistory.