[Spring] MVC 아키텍처 정리 및 주요 구성 요소 설명

KUKJIN LEE's profile picture

KUKJIN LEE3주 전 작성

Spring MVC는 전통적인 MVC(Model-View-Controller) 디자인 패턴을 따르는 웹 애플리케이션 프레임워크로, 사용자 인터페이스와 데이터 간의 분리를 통해 코드 유지보수와 확장성을 높이는 데 도움을 줍니다.

 

요약

  • DispatcherServlet: 모든 요청을 가로채고 처리할 컨트롤러에 전달

  • Controller: 비즈니스 로직을 수행하고 데이터를 Model에 담아 뷰에 전달

  • Model: 컨트롤러와 뷰 간의 데이터 전달

  • ViewView Resolver: 뷰 템플릿을 결정하고 데이터 렌더링

 

주요 구성 요소

DispatcherServlet

  • 역할: Spring MVC 애플리케이션의 프론트 컨트롤러로, 모든 요청을 받아 해당 요청을 처리할 컨트롤러에 전달합니다.

  • 설정 예시: Spring Boot에서는 자동으로 설정되지만, XML 기반 설정도 가능합니다.

<!-- web.xml -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 

Controller

  • 역할: 비즈니스 로직을 처리하고 필요한 데이터를 모델에 담아 뷰(View)에 전달합니다.

  • 예시 코드:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/greeting")
public class GreetingController {

    @GetMapping
    public String greetUser(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "greeting"; // View 이름 반환
    }
}

 

Model

  • 역할: 컨트롤러와 뷰 사이에서 데이터를 전달하는 역할을 합니다.

  • 사용 예시: Model 객체에 데이터를 추가하여 뷰에서 참조할 수 있습니다.

// Model에 데이터를 추가하는 예시
model.addAttribute("message", "Hello, Spring MVC!");

 

ViewView Resolver

  • 역할: 뷰는 데이터를 렌더링하여 사용자에게 보여주고, View Resolver는 Spring MVC가 HTML 또는 JSP 파일을 렌더링할 때 참조할 뷰를 결정합니다.

  • Thymeleaf 템플릿 엔진 사용 시

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
  • JSP 뷰 리졸버 사용 시 (Java Config)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
public class WebConfig {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

 

HandlerMapping

  • 역할: 요청 URL에 따라 실행할 컨트롤러와 메서드를 결정합니다.

  • 작동 방식: @RequestMapping 어노테이션에 정의된 URL과 매칭하여 해당 메서드를 호출합니다.

  • 예시 코드

@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/profile")
    public String userProfile(Model model) {
        model.addAttribute("username", "John Doe");
        return "profile";
    }

    @PostMapping("/register")
    public String registerUser(User user) {
        // 사용자 등록 로직 처리
        return "registrationSuccess";
    }
}

 

Spring MVC의 작동 흐름

  1. 요청 처리: 클라이언트가 URL에 HTTP 요청을 보내면 DispatcherServlet이 이를 가로챕니다.

  2. HandlerMapping: DispatcherServletHandlerMapping을 사용해 요청을 처리할 컨트롤러를 찾습니다.

  3. Controller 처리: 요청을 컨트롤러로 전달하여 비즈니스 로직을 수행하고 데이터를 Model에 저장합니다.

  4. View Resolver: 컨트롤러가 반환한 뷰 이름을 바탕으로 ViewResolver가 실제 뷰 객체를 찾습니다.

  5. 응답: DispatcherServlet은 모델 데이터를 뷰에 전달하고, 뷰는 최종 HTML을 렌더링하여 클라이언트에게 응답합니다.

New Tech Posts