๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [Spring] 'DispatcherServlet vs Servlet' ํŽธ

ybkยท2024๋…„ 11์›” 12์ผ

spring

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

๐Ÿ”” 'DispatcherServlet vs Servlet'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ Servlet

  • ์„œ๋ธ”๋ฆฟ(Servlet)์€ ์ž๋ฐ”์˜ ์›น ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋กœ, HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ(์˜ˆ: ๋ธŒ๋ผ์šฐ์ €)๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์„œ๋ธ”๋ฆฟ์„ ์ฐพ์•„ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ต์‹ฌ ์—ญํ• :

    • ์š”์ฒญ(Request) ์ฒ˜๋ฆฌ
    • ์‘๋‹ต(Response) ์ƒ์„ฑ
    • ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก
  • ์„œ๋ธ”๋ฆฟ์€ ๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ง์ ‘์ ์œผ๋กœ HTTP ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์„œ๋ธ”๋ฆฟ์˜ ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ„:

    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException {
            response.setContentType("text/html");
            response.getWriter().println("Hello, World!");
        }
    }
  • ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์„œ๋ธ”๋ฆฟ์€ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์‘๋‹ต์„ ์ง์ ‘ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ธ”๋ฆฟ์—์„œ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง๊ณผ ๋ทฐ ์ฒ˜๋ฆฌ ๋“ฑ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ DispatcherServlet

  • DispatcherServlet์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋ธ”๋ฆฟ ์ค‘ ํ•˜๋‚˜๋กœ, ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ์„œ๋ธ”๋ฆฟ์ž…๋‹ˆ๋‹ค.

  • ์Šคํ”„๋ง MVC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ชจ๋“  HTTP ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌํ•œ ํ›„, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ต์‹ฌ ์—ญํ• :

    • ์š”์ฒญ์„ ๋ถ„์„ํ•˜๊ณ  ์ ์ ˆํ•œ ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ)์— ์ „๋‹ฌ
    • ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๋ฐ›์•„์„œ ์ ์ ˆํ•œ ๋ทฐ๋กœ ๋ฐ˜ํ™˜
    • ์Šคํ”„๋ง์˜ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋“ค๊ณผ ์—ฐ๋™: ๋ทฐ ๋ฆฌ์กธ๋ฒ„(View Resolver), ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ(Handler Adapter), ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋“ฑ

    DispatcherServlet์˜ ๋™์ž‘ ํ๋ฆ„:

  1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด DispatcherServlet์ด ์ด๋ฅผ ๋จผ์ € ๋ฐ›์Šต๋‹ˆ๋‹ค.

  2. ์š”์ฒญ์„ ๋ถ„์„ํ•˜์—ฌ, ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ(Handler)์— ์š”์ฒญ์„ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.

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

  4. DispatcherServlet์€ ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ ์ ˆํ•œ ๋ทฐ(View)๋ฅผ ์ฐพ์•„ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  5. ์ตœ์ข…์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    @Controller
    public class MyController {
        @GetMapping("/hello")
        public String handleRequest(Model model) {
            model.addAttribute("message", "Hello, World!");
            return "hello"; // hello.jsp or hello.html๋กœ ๋ฐ˜ํ™˜
        }
    }
  • DispatcherServlet์€ ์Šคํ”„๋ง์˜ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์—ฐ๋™ํ•˜์—ฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง ์ปจํŠธ๋กค๋Ÿฌ, ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ๋ทฐ ๋ฆฌ์กธ๋ฒ„ ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ์ฐจ์ด์ 

ํ•ญ๋ชฉServletDispatcherServlet
์—ญํ• HTTP ์š”์ฒญ์„ ์ง์ ‘ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต ์ƒ์„ฑ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›์•„์„œ ๋ถ„์„ํ•˜๊ณ , ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ
๊ธฐ๋Šฅ๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ ์ฒ˜๋ฆฌ์™€ ์‘๋‹ต ์ƒ์„ฑ์Šคํ”„๋ง์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ(์ปจํŠธ๋กค๋Ÿฌ ๋งคํ•‘, ๋ทฐ ๋ฆฌ์กธ๋ฒ„, ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ์ฒ˜๋ฆฌ
MVC ์—ญํ• ์ˆ˜๋™์œผ๋กœ MVC ํŒจํ„ด ๊ตฌํ˜„ ํ•„์š”MVC ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ์ง€์› (์ปจํŠธ๋กค๋Ÿฌ, ๋ทฐ, ๋ชจ๋ธ ์ฒ˜๋ฆฌ)
๊ตฌ์„ฑ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋“  ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ์Šคํ”„๋ง์˜ ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ž๋™ ์—ฐ๋™, ์„ค์ • ์ตœ์†Œํ™”
ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์ˆ˜๋™์œผ๋กœ URL ๋งคํ•‘ ๊ตฌํ˜„์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ๋งคํ•‘ ์ง€์› (์˜ˆ: @GetMapping)
์‚ฌ์šฉ ์‚ฌ๋ก€๋‹จ์ˆœํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ์Šคํ”„๋ง MVC ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ค‘์•™ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ

์š”์•ฝ

  • Servlet์€ ์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์›น ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ๋กœ, ๋‹จ์ผ ์š”์ฒญ์— ๋Œ€ํ•ด ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • DispatcherServlet์€ ์Šคํ”„๋ง MVC์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์„œ๋ธ”๋ฆฟ์œผ๋กœ, ๋ชจ๋“  ์›น ์š”์ฒญ์„ ์ค‘์•™์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ์— ์œ„์ž„ํ•˜์—ฌ ์Šคํ”„๋ง์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๊ณผ ์—ฐ๋™๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง์˜ MVC ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•ต์‹ฌ ์„œ๋ธ”๋ฆฟ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, DispatcherServlet์€ Servlet์˜ ์ผ์ข…์ด์ง€๋งŒ, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์—ฐ๋™ํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ณ ๊ธ‰ ์„œ๋ธ”๋ฆฟ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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