[Spring 입문] Spring MVC

박화랑·2025년 3월 17일

Spring_개념정리

목록 보기
12/17

Spring MVC 1강

1. Spring MVC 구조

  • Spring은 MVC 패턴에 프론트 컨트롤러 패턴, 어댑터 패턴이 적용된 구조를 가짐

Spring MVC 동작 과정

  1. 클라이언트가 요청을 보냄
  2. Controller에서 요청을 받아 비즈니스 로직을 실행
  3. 로직 실행 결과를 Model에 저장하여 View에 전달
  4. View는 Model 데이터를 참조하여 화면을 생성

Spring MVC 구성 요소

  • DispatcherServlet: Spring의 프론트 컨트롤러 역할
  • View: 인터페이스 기반으로 확장성이 뛰어남

Spring MVC 실행 순서

  1. HTTP 요청 처리: 클라이언트의 요청을 DispatcherServlet이 수신
  2. Handler 조회: 요청 URL에 맞는 Controller 조회 (HandlerMapping 활용)
  3. Handler Adapter 조회: 요청을 처리할 HandlerAdapter 조회
  4. Handler 실행: 적절한 Controller(Handler) 실행 후 결과 반환
  5. ModelAndView 반환: 실행 결과를 ModelAndView 객체로 변환
  6. View Resolver 실행: 논리적인 View 이름을 물리적 파일 경로로 변환
  7. View 반환 및 Rendering: 변환된 View를 기반으로 최종 응답 생성 후 클라이언트에 반환

2. DispatcherServlet

  • Spring MVC의 프론트 컨트롤러(Servlet의 한 종류)
  • 핵심 역할: 클라이언트 요청을 적절한 Controller로 전달하고 응답을 반환

DispatcherServlet의 동작 방식

  1. 클라이언트의 요청을 수신
  2. 등록된 Handler 목록에서 적절한 Controller 찾기
  3. Controller를 처리할 수 있는 HandlerAdapter 조회
  4. Controller 실행 및 ModelAndView 반환
  5. ViewResolver를 통해 View 조회 및 Rendering

3. Spring MVC의 주요 인터페이스

  • Spring MVC는 DispatcherServlet의 변경 없이 기능 확장 가능 (인터페이스 활용)

Spring MVC의 주요 인터페이스

  1. HandlerMapping → 요청 URL과 적절한 Controller 매핑
  2. HandlerAdapter → Controller를 실행할 수 있도록 도와주는 어댑터
  3. ViewResolver → 논리적인 View 이름을 실제 파일 경로로 변환
  4. View → 최종 화면을 렌더링하여 응답 생성

인터페이스를 직접 구현하면 Spring MVC의 기능을 확장할 수 있음


4. Spring MVC의 구조적 장점

  1. 프론트 컨트롤러(DispatcherServlet) → 모든 요청을 중앙에서 처리
  2. HandlerAdapter를 통한 유연성 → 다양한 방식의 Controller 구현 가능
  3. ViewResolver를 통한 화면 처리 → View 변경 시 Controller 수정 불필요
  4. 확장성과 유지보수성 향상 → 기존 코드 변경 없이 기능 추가 가능

Spring MVC는 웹 애플리케이션 개발의 효율성과 확장성을 극대화함


Spring MVC 2강

1. Controller Interface

  • Controller Interface를 구현하면 개발자가 원하는 Controller(Handler)를 직접 사용할 수 있음
  • 현대의 Annotation 기반 Spring @Controller와 역할이 유사하지만 별개 개념

Controller Interface 구현 예시

@Component("/example-controller")
public class ExampleController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("example-controller가 호출되었습니다.");
        return null;
    }
}
  • @Component("/example-controller") → Spring Bean으로 등록하여 URL 매핑
  • http://localhost:8080/example-controller 요청 시 호출됨

@Component

  • Spring Bean을 등록하는 역할
  • Servlet이 Servlet Container에 등록되는 것과 유사한 개념

Spring MVC 구조에서 배운 Handler Mapping, Handler Adapter가 컨트롤러 실행을 지원


2. Handler Mapping과 Handler Adapter

  • Spring Boot에서는 자동으로 필요한 HandlerMappingHandlerAdapter를 등록하여 사용 가능

Handler Mapping 우선순위

  1. RequestMappingHandlerMapping@RequestMapping Annotation 기반
  2. BeanNameUrlHandlerMapping → Spring Bean Name을 기반으로 핸들러 매핑

Handler Adapter 우선순위

  1. RequestMappingHandlerAdapter@RequestMapping 지원
  2. HttpRequestHandlerAdapterHttpRequestHandler 처리
  3. SimpleControllerHandlerAdapterController Interface 처리

☞ 현대 Spring Boot에서는 @RequestMapping이 가장 높은 우선순위로 사용됨


3. HttpRequestHandler를 활용한 Spring MVC 동작

  • 기존 Servlet과 유사한 방식으로 동작하는 Handler

HttpRequestHandler 구현 예시

@Component("/request-handler")
public class ExampleRequestHandler implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("request-handler Controller 호출");
    }
}
  • HttpRequestHandler를 구현하여 직접 요청 처리 가능

실행 순서

  1. HandlerMapping으로 핸들러 조회
    • BeanNameUrlHandlerMappingExampleRequestHandler 조회
  2. HandlerAdapter 조회
    • HttpRequestHandlerAdapterHttpRequestHandler를 지원
  3. HandlerAdapter 실행
    • HttpRequestHandlerAdapter.handle() 내부에서 ExampleRequestHandler 실행

DispatcherServlet이 Handler Adapter를 통해 적절한 핸들러를 실행하는 방식


4. Spring MVC의 구조적 특징

  • HandlerMapping → 적절한 Controller를 찾음
  • HandlerAdapter → Controller 실행을 지원
  • DispatcherServlet → 요청을 파싱하고 적절한 Handler 호출

Spring Boot를 사용하면 대부분 자동 설정되며, 직접 구현할 필요 없음


Spring MVC 3강

1. View Resolver란?

  • DispatcherServlet이 ModelAndView 객체를 받아 알맞은 View를 찾도록 도와주는 역할
  • ViewResolver가 View의 논리 이름을 물리적 경로로 변환하여 응답 생성

View Resolver 구현 예시

@Component("/view-controller")
public class ViewController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("view-controller가 호출되었습니다.");
        return new ModelAndView("test"); // 논리적 View Name
    }
}
  • return new ModelAndView("test") → "test"는 논리적인 View 이름이며, ViewResolver가 물리적인 View로 변환해야 함

2. ViewResolver의 동작 방식

  • application.properties 설정을 기반으로 InternalResourceViewResolver가 생성됨
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
  • 위 설정을 통해 ViewResolver는 "test"를 /WEB-INF/views/test.jsp로 변환하여 View를 찾음

View를 찾지 못하는 경우

@Component("/error-controller")
public class WhitelabelErrorController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("error-controller가 호출되었습니다.");
        return new ModelAndView("sparta"); // 존재하지 않는 View
    }
}
  • 위 코드 실행 시 Whitelabel Error Page가 발생

3. Spring Boot의 ViewResolver

  • Spring Boot는 자동으로 ViewResolver를 등록함

ViewResolver 우선순위

  1. BeanNameViewResolver → Bean Name으로 View 찾기
  2. InternalResourceViewResolver → 설정된 Prefix, Suffix 기반으로 View 찾기

InternalResourceViewResolver 설정 예시

@Bean
InternalResourceViewResolver internalResourceViewResolver() {
    return new InternalResourceViewResolver("/WEB-INF/views", ".jsp");
}
  • Spring Boot는 위 설정을 자동으로 처리하므로 별도 설정이 필요 없음

4. InternalResourceViewResolver의 동작 과정

실행 순서

  1. HandlerAdapter 호출"test" 논리 View Name 획득
  2. ViewResolver 호출"test" View를 찾기 위해 ViewResolver 조회
    • BeanNameViewResolver는 View를 찾지 못함
    • InternalResourceViewResolver가 View를 찾음
  3. InternalResourceView 생성 → JSP 파일 경로 변환
  4. View RenderingRequestDispatcher.forward()를 통해 View를 렌더링

InternalResourceView 동작

protected void renderMergedOutputModel(...) {
    // Model 데이터를 Request로 변환
    exposeModelAsRequestAttributes(model, request);
    
    // RequestDispatcher를 통해 JSP로 forward
    request.getRequestDispatcher(url).forward(request, response);
}
  • Model 데이터를 Request 속성으로 변환
  • RequestDispatcher.forward()를 사용하여 JSP로 이동

5. Spring Boot와 Thymeleaf

  • Thymeleaf는 별도의 ViewResolver 설정 없이 자동으로 적용됨
  • return "viewName"; 만으로 View가 렌더링됨

Spring Boot의 ViewResolver를 활용하면 View 처리를 간편하게 할 수 있음

profile
개발자 희망생

0개의 댓글