우리는 지금 Spring을 사용해서 웹 애플리케이션을 만드는 방법에 대해 공부하고 있다.
💋 인트로
Spring MVC Configuration이 뭘까?
스프링 프레임워크를 사용해서 웹 애플리케이션을 만들 때, 필요한 설정 정보를 담고 있는 파일이다.
이름을 통해 Spring MVC에 대한 "설정"에 관한 내용이라고 유추할 수 있다.
작성하는 방법도 다양한데, XML, Java Config, 어노테이션 방식으로 할 수 있고,
DispatcherServlet, View Resolver, Handler Mapping 등의 설정이 포함된다.
잘 작성하면 웹 애플리케이션 동작을 조정하고, 요청에 대한 응답을 처리할 수 있다.
오늘 공부할 건 View Resolver인데, 이걸 알기 위해서는 먼저 View Controller를 알아야 한다.
💋 View Controller란?
이번에 공부할 View Controller도 역시 컨트롤러이다.
스프링에서 사용되는 컨트롤러는 일반적으로 View Template 또는 JSON 중 하나의 반환값을 가진다.
✔ 1. View Template
컨트롤러에서 반환한 뷰 이름을 통해 뷰 객체를 생성하고, 브라우저에 HTML을 렌더링하여 보여준다.
대표적으로 JSP, Thymeleaf, Freemarker 등이 있다.
✔ 2. JSON
컨트롤러에서 반환한 데이터를 JSON 형식으로 브라우저에 전달하여 보여준다.
SPA나 모바일 애플리케이션 등에서 데이터 통신을 위해 많이 사용된다.
따라서 우리의 웹 애플리케이션은 컨트롤러에서 반환하는 값에 따라서 뷰 템플릿을 이용해 렌더링하는 방식과 JSON 데이터를 반환받아서 클라이언트에서 처리하는 방식 두 가지가 있다고 볼 수 있다.
두 가지 이름을 보아하니, 우리가 이번에 공부하려는 View Controller는 첫 번째 View Template을 반환하는 컨트롤러겠쬬?
Spring 공식문서에서는, View Controller는 Spring MVC에서 뷰와 매핑되는 컨트롤러라고 설명한다.
즉, Spring MVC에서 화면을 관리하는 컨트롤러이다. 페이지 전환을 처리하고, 각 요청에 대해서 적절한 view를 반환한다.
View Controller는 컨트롤러의 계층에서 가장 상위에 위치한다.
View Controller 또한 컨트롤러 계층의 일종이라는 것을 생각해보면, 컨트롤러 계층에는 어떤 컨트롤러들이 있을까?
1. `@Controller` 어노테이션이 붙은 컨트롤러 클래스
2. `@RestController` 어노테이션이 붙은 RESTful 컨트롤러 클래스
3. `@ControllerAdvice` 어노테이션이 붙은 전역 예외 처리 컨트롤러 클래스
이중 View Controller는 1번에 해당하는 클래스이다.
✔ 요청과 매핑되는 view 이름 제공
View Controller에서는 보통 컨트롤러 메서드를 정의하지 않고, 대신에 요청과 매핑되는 view 이름만을 반환한다.
이 view 이름이 뒤에서 소개될 View Resolver를 통해서 실제 view의 경로로 반환되어서 클라이언트에게 전달되는 것이다!
아래 코드는 "/home" 경로에 대해 home 뷰를 반환하는 View Controller이다.
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/home").setViewName("home");
// 뷰 이름(home)과 매핑되는 URL(/home) 제공
}
// ...
}
참고: @EnableWebMvc 어노테이션은 Spring MVC를 사용하는 웹 애플리케이션에서 @Configuration 클래스에 적용할 수 있는 어노테이션이다.
View Controller를 사용하면 위의 코드에서 보듯 컨트롤러 메서드를 별도로 쓰지 않아도 되기 때문에 코드의 양이 줄어든다.
💋 View Resolver란?
자 그러면 내가 view를 표시해달라는 뜻으로, 딱 멋지게 index를 달라고 했다고 생각해보자!
그런데 프로그램 입장에서는 index가 뭐지...?
내가 보기에는 /WEB-INF/views/index.jsp 이게 index인 것 같은데.....
그러면 내가 개떡같이 index라고 말했을 때 찰떡같이 /WEB-INF/views/index.jsp 보여줘! 라고 해줄 것이 필요하다.
이게 바로 View Resolver의 종류 중 하나인 InternalResourceViewResolver가 하는 역할이다. (아래에서 자세히 설명할 것임!)
일반적인 View Resolver가 하는 역할도 크게 다르지 않다.
백엔드로부터 가져온 데이터를 통해서 view에 어떤 것을 어떻게 보여줄 지 자유롭게 설정할 수 있는데, 이 설정 역할을 View Resolver가 하게 된다. API 형태로 전달하고 싶다면 View Resolver를 통해서 json 형태(Json View)로 전달할 수도 있고, 자바 프론트엔드 언어인 JSP 페이지의 형태로 전달할 수도 있다.
View Resolver는 요청에 대한 응답으로 보여줄 view를 결정하고, 해당하는 view를 찾아서 반환한다.
InternalResourceViewResolver는 JSP를 사용한 뷰를 처리할 때 사용되며, prefix와 suffix를 설정하여 뷰(View)의 경로를 지정한다. 따라서 설정에서 prefix를 "/WEB-INF/views/"로 설정하고, suffix를 ".jsp"로 설정함으로써, View Resolver는 "index"라는 요청에 대해서 "/WEB-INF/views/index.jsp"라는 경로의 JSP 파일을 반환하게 된다.
✔ InternalResourceViewResolver
스프링에서는 여러 가지 View Resolver를 제공하는데, 대표적으로는 InternalResourceViewResolver가 있다. JSP를 사용한 뷰를 처리할 때 사용된다.
참고: JSP(JavaServer Pages)는 자바 기반의 서버 사이드 스크립트 언어로, HTML 안에 자바 코드를 삽입하여 동적인 웹 페이지를 생성할 수 있는 기술이다.
먼저 설정이 필요한데, xml 설정 파일에서 아래와 같이 설정해주면 된다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
제대로 이해하지 못하더라도, 보면 viewResolver라는 id로 빈을 만들거라 한다.
우리가 지금 하고싶은건 index만 입력했을 때, /WEB-INF/views/index.jsp로 바꿔주는거다.
속성에서 앞에 붙이는 prefix로 index 앞의 내용인 /WEB-INF/views/를 입력하고 suffix로는 그 뒤로 끝까지 입력해놨다.