[Spring] MVC 아키텍처 정리 및 주요 구성 요소 설명
KUKJIN LEE • 3주 전 작성
Spring MVC는 전통적인 MVC(Model-View-Controller) 디자인 패턴을 따르는 웹 애플리케이션 프레임워크로, 사용자 인터페이스와 데이터 간의 분리를 통해 코드 유지보수와 확장성을 높이는 데 도움을 줍니다.
요약
-
DispatcherServlet: 모든 요청을 가로채고 처리할 컨트롤러에 전달
-
Controller: 비즈니스 로직을 수행하고 데이터를 Model에 담아 뷰에 전달
-
Model: 컨트롤러와 뷰 간의 데이터 전달
-
View 및 View 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!");
View 및 View 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의 작동 흐름
-
요청 처리: 클라이언트가 URL에 HTTP 요청을 보내면 DispatcherServlet이 이를 가로챕니다.
-
HandlerMapping: DispatcherServlet은 HandlerMapping을 사용해 요청을 처리할 컨트롤러를 찾습니다.
-
Controller 처리: 요청을 컨트롤러로 전달하여 비즈니스 로직을 수행하고 데이터를 Model에 저장합니다.
-
View Resolver: 컨트롤러가 반환한 뷰 이름을 바탕으로 ViewResolver가 실제 뷰 객체를 찾습니다.
-
응답: DispatcherServlet은 모델 데이터를 뷰에 전달하고, 뷰는 최종 HTML을 렌더링하여 클라이언트에게 응답합니다.