4장 스프링 MVC 기초

Jasik·2021년 12월 30일
0

스프링 MVC

모델 : 애플리케이션 상태(데이터)나 비즈니스 로직을 제공하는 컴포넌트
뷰 : 모델이 보유한 애플리케이션 상태(데이터)를 참조하고 클라이언트에 반환할 응답 데이터를 생성하는 컴포넌트
컨트롤러 : 요청을 받아 모델과 뷰의 호출을 제어하는 컴포넌트

웹 애플리케이션 개발의 특징

스프링 MVC로 개발된 웹 애플리케이션의 특징.

  • POJO(Plain Old Java Object) 구현
    컨트롤러나 모델 등의 클래스는 POJO 형태로 구현. 단위 테스트 용이
  • 애너테이션을 이용한 정보 정의 설정
    비즈니스 로직과 그 로직을 수행하기 위한 각종 정의 정보를 자바 파일 안에서 함께 기술하여 효율적 웹앱 개발 가능
  • 유연한 메서드 시그니처 정의
    인수에 지정할 수 있는 다양한 타입 지원. 프레임웤크가 인수에 전달하는 값을 자동으로 담아주거나 변환. 사양 변경 및 리팩터링에 강한 아키텍처
  • Servlet API 추상화
    서블릿 API(HttpServletRequest, HttpServletResponse, HttpSession 등)를 추상화하는 기능 제공. 컨트롤러 클래스 구현에서 서블릿 API를 직접 사용하는 코드가 제거됨
  • 뷰 구현 기술의 추상화
    컨트롤러는 뷰 이름만 반환. 스프링 MVC는 뷰 이름에 해당하는 화면이 표시되게 함. 컨트롤러는 뷰가 어떤 기술로 만들어졌는지 구체적인 내용을 몰라도 된다.
  • 스프링의 DI 컨테이너와의 연계
    DI 컨테이너가 제공하는 DI나 AOP와 같은 구조를 그대로 활용할 수 있다.

스프링 MVC 애플리케이션

ContextLoaderListener 설정

웹 애플리케이션에서 사용할 어플리케이션 컨텍스트를 만들려면 서블릿 컨테이너에 ContextLoaderListener 클래스를 등록해야 한다.

@configuration
public class AppConfig {
}

DispatcherServlet 설정

스프링 MVC의 프런트 컨트롤러를 이용하기 위해 DispatcherServlet 클래스를 서블릿 컨테이너에 등록. 웹 애플리케이션용 애플리케이션 컨텍스트와 별개로 DispatcherServlet용 애플리케이션 컨텍스트를 별도로 만든다.

@Configuration
@EnableWebMvc // 스프링 MVC가 제공하는 설정 클래스가 임포트되어 스프링 MVC를 이용할 때 필요한 컴포넌트의 빈 정의가 자동으로 이뤄진다.
@ComponentScan("example.app")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
}

CharacterEncodingFilter 설정

입력 값의 한국어가 깨지지 않도록 CharacterEncodingFilter 클래스를 서블릿 컨테이너에 등록한다.

스프링 MVC 아키텍처

프레임워크 아키텍처

스프링MVC는 프런트 컨트롤러 패턴(Front controller) 이라고 하는 아키텍처를 채택.
클라이언트 요청을 프런트 컨트롤러라는 컴포넌트가 받아 요청 내용에 따라 수행하는 핸들러를 선택하는 아키택처.
프런트 컨트롤러에 공통적인 처리를 통합할 수 있다. ex) 클라이언트의 요청 검수, 요청 데이터를 자바 객체로 변환, 입력값 검사 실행, 핸들러 호출, 뷰 선택, 클라이언트에 요청 결과 전달, 예외 처리

프런트 컨트롤러 아키텍처

스프링MVC 프런트 컨트롤러 : DispatcherServlet
1. DispatcherServlet 클래스는 클라이언트의 요청을 받는다
2. DispatcherServlet 클래스는 HandlerMapping 인터페이스의 getHandler 메서드를 호출해서 요청 처리를 하는 Handler 객체를 가져온다.
3. DispatcherServlet 클래스는 HandlerAdapter 인터페이스의 handle 메서드를 호출해서 Handler 객체의 메서드 호출을 의뢰한다.
4. HandlerAdapter 인터페이스 구현 클래스는 Handler 객체에 구현된 메서드를 호출해서 요청 처리를 수행한다.
5. DispatcherServlet 클래스는 ViewResolver 인터페이스의 resolveViewName 메서드를 호출해서 Handler 객체에서 반환된 뷰 이름에 대응하는 View 인터페이스 객체를 가져온다.
6. DispatcherServlet 클래스는 View 인터페이스의 render 메서드를 호출해서 응답 데이터에 대한 렌더링을 요청한다. View 인터페이스의 구현 클래스는 JSP와 같은 템플릿 엔진을 사용해 렌더링할 데이터를 생성한다.
7. DispatcherServlet 클래스는 클라이언트에 응답을 반환한다.

Handler

프레임워크 관점에서는 핸들러, 개발자가 작성하는 클래스의 관점에서는 컨트롤러라 부른다.

@Controller 애너테이션을 클래스에 지정하고 @RequestMapping 애너테이션을 요청 처리하는 메서드에 지정한다.

HandlerMapping

요청에 대응할 핸들러를 선택하는 역할.
RequestMappingHandlerMapping 클래스는 @RequestMapping 에 정의된 설정 정보를 바탕으로 실행할 핸들러를 선택한다.

HandlerAdapter

핸들러 메서드를 호출하는 역할.
RequestMappingHandlerMapping 클래스에 의해 선택된 핸들러 메서드를 호출할 때는 RequestMappingHandlerAdapter 클래스를 사용.
핸들러 메서드에 매개변수를 전달하고 메서드의 처리 결과를 반환값으로 되돌려 보내는 역할.
핸들러 메서드에 매개변수를 전달할 때는 요청받은 데이터를 자바 객체로 변환하고 입력값이 올바른지 검사 (Bean validation) 하는 것까지 한번에 이뤄진다.
인수나 반환값에 기본적으로 지원되지 않는 타입을 지원해야 할 경우에 HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler 인터페이스를 활용할 수 있다.

ViewResolver

핸들러에서 반환한 뷰 이름을 보고 이후에 사용할 View 인터페이스의 구현 클래스를 선택한다.

View

클라이언트에 반환하는 응답 데이터를 생성하는 역할.

DI 컨테이너와의 연계

스프링 MVC에서는 두 가지 애플리케이션 컨텍스트를 사용한다.

  • 웹 애플리케이션용 애플리케이션 컨텍스트 : 웹 애플리케이션 전체에서 하나. 웹 애플리케이션 전체에서 사용하는 컴포넌트 (Service, Repository, DataSource, ORM 등) 의 빈을 등록.
  • DispatcherServlet용 애플리케이션 컨텍스트 : DispatcherServlet마다 인스턴스가 생성됨. 스프링 MVC 프론트 컨트롤러의 구성 컴포넌트(HandlerMapping, HandlerAdapter, ViewResolver)와 컨트롤러의 빈을 등록.
    DispatcherServlet용 애플리케이션 컨텍스트들은 웹 애플리케이션용 애플리케이션 컨텍스트의 자식이 되며, 자식에서 부모의 애플리케이션 컨텍스트에 등록돼 있는 빈을 사용할 수 있다.
profile
가자~

0개의 댓글