사용자의 HTTP 요청이 스프링 MVC 프레임워크 내부에서 처리되어 응답으로 반환되는 전체 아키텍처와 흐름을 분석한다.
Spring MVC 핵심 처리 흐름
Spring MVC는 DispatcherServlet을 중심으로 각 구성 요소가 유기적으로 협력하여 요청을 처리한다.
- DispatcherServlet: 모든 요청을 중앙에서 수신하는 프론트 컨트롤러.
- HandlerMapping: 요청 URL을 처리할 적절한 컨트롤러를 탐색.
- HandlerAdapter: 탐색된 컨트롤러의 메서드를 실행할 수 있도록 연결.
- Controller: 실제 비즈니스 로직을 수행하고 결과 데이터(
Model)와 뷰 이름(ViewName) 반환. - ViewResolver: 컨트롤러가 반환한 논리적 뷰 이름을 실제 뷰 객체(JSP, Thymeleaf 등)로 변환.
- View: 최종 응답 화면을 렌더링하여 클라이언트에 전송.
컨트롤러 구현 예시
@Controller
@RequestMapping("/members")
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping("/list")
public String list(Model model) {
List<Member> members = memberService.findAll();
model.addAttribute("members", members); // 데이터 전달
return "members/memberList"; // 뷰 이름 반환
}
}
계층화된 아키텍처의 이점
- 역할 분담: 요청 수신, 로직 처리, 화면 렌더링의 책임이 명확히 분리되어 유지보수가 용이하다.
- 유연한 뷰 교체: 컨트롤러 수정 없이
ViewResolver설정만으로 출력 형식을 변경할 수 있다.
P.S
Spring MVC의 요청 흐름은 디자인 패턴 중 하나인 ‘프론트 컨트롤러 패턴’을 극한으로 정교화한 결과물이다.
각 단계의 역할을 명확히 이해해야 복잡한 웹 애플리케이션의 디버깅과 확장이 가능하는 것 같다.