Spring MVC
1.MVC 패턴 패턴 기초와 역할
1) 서블릿의 문제점
- 낮은 응집도: 하나의 서블릿 클래스 냉 여러 로직이 혼재 / 많은 책임
- 강한 결합도: HttpServletRequest, HttpServletResponse와 같은 서블릿 API에 직접적으로 의존 / 웹 환경 밖에서 테스트 어려움
- 반복적인 상용구 코드: 반복적인 코드 필수 요구
- 문제 해결: 관심사의 분리 원칙에 입각하여 스프링 MVC를 사용
2) MVC 패턴
- 하나의 Servlet이 혼자 모든 것을 처리하던 문제를 해결하기 위해 애플리케이션의 코드를 세 가지 역할로 명확하게 나누는 설계 방식
- Model, View, Controller
3) Controller
- 사용자의 HTTP 요청을 받아서 처리
- 어떤 요청이 들어왔을 때 어떤 메소드를 실행할지 결정, 비즈니스 로직을 호출, 데이터를 Model에 담아 View 이름을 반환
- @Controller
4) View
- 사용자에게 보여지는 화면
- Model에 담긴 데이터를 사용 > HTML을 생성 > 클라이언트에게 응답
- Controller가 반환한 View 이름을 ViewResolver가 실제 View 파일과 매핑시켜 렌더링
- Thymeleaf
5) Model
- Controller에서 View로 데이터를 전달할 때 사용하는 객체
- Key-Value 형태로 데이터 저장
- Controller에서 처리한 결과 데이터를 Model에 추가 > View에서 해당 데이터를 참조
- Model, ModelAndView 클래스
6) 타임리프
- HTML을 동적으로 만들어주는 자바 기반의 도구 / 템플릿 엔진
- 예시) "${userName}님 환영합니다" > "홍길동"으로 바꿔서 최종 페이지를 완성
- SSR 방식
7) SSR
- 서버가 웹 페이지에 필요한 모든 데이터를 채워 넣어 완벽하게 조립된 HTML 페이지를 브라우저에게 전달하는 방식
- 거의 즉시 콘텐츠를 볼 수 있어 초기 로딩 속도가 빠름 / 모든 내용이 HTML에 포함되어 있어 검색 엔진 최적화(SEO)에 유리
- 서버에서 완성된 HTML을 통째로 주는 것
8) CSR
- 거의 텅 빈 HTML 뼈대와 자바스크립트 파일만 보내주는 방식
- 클라이언트가 자바스크립트를 실행해 필요한 데이터를 서버에 다시 요청 > 브라우저가 직접 페이지를 조립하여 화면에 그림
- 클라이언트에서 자바스크립트로 그 때 그 때 HTML을 그려내는 것
- React나 Vue 같은 최신 프론트엔드 프레임워크
- 초기 로딩 느림 / 앱처럼 부드럽고 빠른 화면 전환이 가능
2. 프론트 컨트롤러 패턴과 어댑터 패턴, DispatcherServlet
1) 프론트 컨트롤러 패턴

- 모든 클라이언트 요청을 단일 진입점에서 처리하는 디자인 패턴
- 모든 요청을 하나의 컨트롤러가 받아서 처리(공통 로직을 중앙화)
- 개별 요청을 처리할 핸들러로 작업을 위임하는 역할
- 장점
- 공통 로직의 중앙화
- 일관된 처리 흐름
- 새로운 컨트롤러 추가 시에도 공통 로직 자동 적용
- 유지보수성 향상
2) 어댑터 패턴
- 서로 다른 인터페이스를 가진 클래스들을 연결해주는 패턴
- 필요한 이유: 프론트 컨트롤러 패턴만으로는 다양한 종류의 컨트롤러를 처리하기 어려움
더보기
// 1. @Controller 어노테이션 방식
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
// 2. Controller 인터페이스 방식
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) {
return new ModelAndView("hello");
}
}
// 3. HttpRequestHandler 인터페이스 방식
public class SimpleController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request,
HttpServletResponse response) {
// 처리 로직
}
}
- Controller를 모두 하나의 HandlerAdapter라는 타입으로 처리
// HandlerAdapter 인터페이스 (공통 인터페이스)
public interface HandlerAdapter {
boolean supports(Object handler); // 처리 가능 여부 판단(boolean)
ModelAndView handle( // 어떻게 처리할 것인지에 대한 로직
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
}
// Controller 구현 1 (HandlerAdapter를 implements)
public class RequestMappingHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof HandlerMethod; // @RequestMapping 메서드인지 확인
}
@Override
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// @Controller 방식으로 처리
return invokeHandlerMethod((HandlerMethod) handler, request, response);
}
}
// Controller 구현 2 (HandlerAdapter를 implements)
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) {
// Controller 인터페이스 방식으로 처리
return ((Controller) handler).handleRequest(request, response);
}
}
- 장점
- 다양한 컨트롤러 타입을 통일된 방식으로 처리(다형성)
- 새로운 컨트롤러 타입 추가 시 새 어댑터만 만들면 됨
- 기존 코드 수정 없이 확장 가능
3) DispatcherServlet
- 프론트 컨트롤러 패턴을 구현한 스프링 MVC의 핵심적인 프론트 컨트롤러
- 스프링 MVC와 DispatcherServlet

- ① 요청: 클라이언트가 웹 애플리케이션에 요청을 보내고, 이 요청은 가장 먼저 DispatcherServlet에 도달
- ② 핸들러 조회: DispatcherServlet은 HandlerMapping에게 요청을 처리할 Handler(=Controller)를 찾아달라고 요청
- ③ 핸들러 실행: DispatcherServlet은 HandlerMapping으로부터 받은 정보를 이용해 해당 Controller에게 요청 처리를 위
- ④ ModelAndView 반환: Controller는 비즈니스 로직을 수행한 후, 결과 데이터(Model)와 뷰의 논리적 이름(View Name)을 담은 ModelAndView 객체를 DispatcherServlet에 반환
- ⑤ 뷰 해석: DispatcherServlet은 ModelAndView에서 뷰 이름을 추출하여 ViewResolver에게 전달하고, 해당하는 실제 View 객체를 찾아달라고 요청
- ⑥ 뷰 렌더링: DispatcherServlet은 ViewResolver로부터 받은 View 객체에게 모델 데이터를 전달하여 뷰를 렌더링하도록 요청
- ⑦ 응답: 렌더링된 View의 결과물이 DispatcherServlet을 통해 클라이언트에게 최종적으로 응답(Response)으로 전달
'🔌 SPARTA > Courses' 카테고리의 다른 글
| 스탠다드반 2회차: 데이터 베이스 모델링 (0) | 2026.02.05 |
|---|---|
| 스탠다드반 1회차: MVC & REST API (0) | 2026.02.02 |
| Spring 시작하기 (1) | 2026.01.29 |
| 배열과 컬렉션 (1) | 2026.01.28 |
| 완전 탐색과 그리디 알고리즘 (1) | 2026.01.27 |