๐ŸŒฑ Spring Boot ์‹œ๋ฆฌ์ฆˆ 10 โ€” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด & DispatcherServlet ํ๋ฆ„ ์™„์ „ ์ •๋ฆฌ

๊น€์„ธํ˜„ยท2025๋…„ 10์›” 22์ผ

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
10/19

๋‚ ์งœ:2025-10-22


ํ•™์Šต ๋ชฉํ‘œ

  • ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด ์ดํ•ด
  • ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด ์ดํ•ด
  • DispatcherServlet์˜ ๋™์ž‘ ์›๋ฆฌ ํŒŒ์•…
  • /hello ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์š”์ฒญโ€“์‘๋‹ต ํ๋ฆ„ ์ตํžˆ๊ธฐ

1. ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ„ด

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

  • ๋ชจ๋“  ์š”์ฒญ์„ ๋‹จ์ผ ์ง„์ž…์ ์—์„œ ๋ฐ›์•„ ๊ณตํ†ต ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ดํ›„ ์ ์ ˆํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์œ„์ž„ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

  • ๊ฐ ์„œ๋ธ”๋ฆฟ๋งˆ๋‹ค ๊ณตํ†ต ๋กœ์ง(์ธ์ฆ, ๋กœ๊น…, ์ธ์ฝ”๋”ฉ ๋“ฑ)์ด ์ค‘๋ณต
  • ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•จ
  • ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ  ์ผ๊ด€์„ฑ ์œ ์ง€๊ฐ€ ํž˜๋“ฌ

ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๋„์ž… ํ›„

  • ๋ชจ๋“  ์š”์ฒญ์„ ์ค‘์•™ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋จผ์ € ์ฒ˜๋ฆฌ

  • ๊ณตํ†ต ๋กœ์ง์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ

  • ํ•„์š”ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ž‘์—…์„ ์œ„์ž„(delegate)

  • ๐Ÿ‘‰ ์ฆ‰, โ€œ๋ชจ๋“  ์š”์ฒญ์ด ํ•œ ๊ณณ์„ ๊ฑฐ์นœ๋‹คโ€๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์žฅ์ 

  • ๊ณตํ†ต ๋กœ์ง ์ค‘์•™ํ™”
  • ์ผ๊ด€๋œ ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ ํ–ฅ์ƒ

2. ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด

์ •์˜

  • ์„œ๋กœ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด
  • ์ฆ‰, ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด ๋‹ค์–‘ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

Spring MVC์—์„œ์˜ ํ•„์š”์„ฑ

-- Spring์€ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์ปจํŠธ๋กค๋Ÿฌ(@Controller, Controller ์ธํ„ฐํŽ˜์ด์Šค, HttpRequestHandler ๋“ฑ)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋•Œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
 // @Controller ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐฉ์‹
    @Controller
    public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
    }

    // Controller ์ธํ„ฐํŽ˜์ด์Šค ๋ฐฉ์‹
    public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("hello");
    }
    }

    // HttpRequestHandler ๋ฐฉ์‹
    public class SimpleController implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
        // ์ฒ˜๋ฆฌ ๋กœ์ง
    }
    }

์–ด๋Œ‘ํ„ฐ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ

// HandlerAdapter ์ธํ„ฐํŽ˜์ด์Šค
   public interface HandlerAdapter {
   boolean supports(Object handler);
   ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
   }

์˜ˆ์‹œ ๊ตฌํ˜„

// @Controller์šฉ ์–ด๋Œ‘ํ„ฐ
   public class RequestMappingHandlerAdapter implements HandlerAdapter {
   @Override
   public boolean supports(Object handler) {
       return handler instanceof HandlerMethod;
   }

   @Override
   public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {
       return invokeHandlerMethod((HandlerMethod) handler, request, response);
   }
   }

// Controller ์ธํ„ฐํŽ˜์ด์Šค์šฉ ์–ด๋Œ‘ํ„ฐ
    public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    @Override
    public boolean supports(Object handler) {
        return handler instanceof Controller;
    }

    @Override
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        return ((Controller) handler).handleRequest(request, response);
    }
    }

์žฅ์ 

  • ๋‹ค์–‘ํ•œ ์ปจํŠธ๋กค๋Ÿฌ ํƒ€์ž…์„ ํ†ต์ผ๋œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์ƒˆ๋กœ์šด ์ปจํŠธ๋กค๋Ÿฌ ์ถ”๊ฐ€ ์‹œ ์–ด๋Œ‘ํ„ฐ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ
  • ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ํ™•์žฅ ๊ฐ€๋Šฅ

3.DispatcherServlet

DispatcherServlet์ด๋ž€?

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

๋™์ž‘ ํ๋ฆ„

1๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ โ†’ DispatcherServlet ๋„์ฐฉ
2๏ธโƒฃ HandlerMapping โ†’ ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€ ํƒ์ƒ‰
3๏ธโƒฃ HandlerAdapter โ†’ ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‹คํ–‰
4๏ธโƒฃ ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ โ†’ ModelAndView ๋ฐ˜ํ™˜
5๏ธโƒฃ ViewResolver โ†’ ๋ทฐ ์ด๋ฆ„์„ ์‹ค์ œ ๋ทฐ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
6๏ธโƒฃ ๋ทฐ ๋ Œ๋”๋ง(View Rendering)
7๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ตœ์ข… ์‘๋‹ต ๋ฐ˜ํ™˜


hello ์˜ˆ์ œ

  • ์ด๋ฒˆ ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„ํ•  ๋ถ€๋ถ„์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ€๋ถ„(Controller + View) ์ž…๋‹ˆ๋‹ค.
  • ๋‚˜๋จธ์ง€ ๋ณต์žกํ•œ ํ๋ฆ„์€ ๋ชจ๋‘ Spring์ด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ

dependencies {
 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
 implementation 'org.springframework.boot:spring-boot-starter-web'
 compileOnly 'org.projectlombok:lombok'
 annotationProcessor 'org.projectlombok:lombok'
 testImplementation 'org.springframework.boot:spring-boot-starter-test'
 testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
 }

HelloController

@Controller
   public class HelloController {
   
   @GetMapping("/hello")
   public String hello(Model model) {
       model.addAttribute("message", "Hello, Spring!");
       return "hello"; // view ์ด๋ฆ„
   }
   }

hello.html

<!DOCTYPE html>
   <html xmlns:th="http://www.thymeleaf.org">
   <head>
   <title>Hello Page</title>
   </head>
   <body>
   <h1 th:text="${message}">(๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์—ฌ์ง€๋Š” ๊ณณ)</h1>
   </body>
   </html>

์‹คํ–‰ ๊ฒฐ๊ณผ

  • ์„œ๋ฒ„ ์‹คํ–‰ ํ›„
  • ๐Ÿ‘‰ http://localhost:8080/hello ์ ‘์† ์‹œ ๋ธŒ๋ผ์šฐ์ €์—


์ •๋ฆฌ

ํŒจํ„ด์—ญํ• ํ•ต์‹ฌ ํฌ์ธํŠธ
ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์š”์ฒญ์˜ ๋‹จ์ผ ์ง„์ž…์ ๊ณตํ†ต ๋กœ์ง ์ค‘์•™ ๊ด€๋ฆฌ
์–ด๋Œ‘ํ„ฐ ํŒจํ„ด๋‹ค์–‘ํ•œ ์ปจํŠธ๋กค๋Ÿฌ ์ง€์›๋‹คํ˜•์„ฑ ๊ธฐ๋ฐ˜ ํ™•์žฅ์„ฑ
DispatcherServletSpring MVC์˜ ํ•ต์‹ฌ ์ปจํŠธ๋กค์š”์ฒญโ€“์‘๋‹ต ์ „์ฒด ํ๋ฆ„ ๊ด€๋ฆฌ
profile
๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ•œ ๊ฑธ์Œ

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