Spring MVC/02.Spring @MVC

04. 웹과 관련된 설정

  • -

웹 관련 설정과 WebMvcConfigurer

스프링 부트에서의 설정은 크게 웹과 관련된 설정과 웹과 무관한 설정 둘로 나누어서 관리하는 것을 권장한다. 

 

편의상 앞으로 웹과 관련된 설정 파일은 MVCConfig라고 하자.

 

WebMvcConfigure

MVCConfig가 웹과 관련된 처리를 하기 위해서WebMvcConfigurer interface를 구현하는 것이 좋다.

package com.eshome.mvc.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MVCConfig implements WebMvcConfigurer {

}

 

WebMvcConfigurer에는 Spring MVC에서 아주 유용하게 사용되는 기능들이 선언되어있어서 해당 기능을 사용하려면 관련 메서드를 제정의 하면 된다. 또한 WebMvcConfigurer의 모든 메서드가 default 메서드로 선언되어 있어서 반드시 재정의해야하는 메서드는 없다. 필요할 때만 하면 된다.

public interface WebMvcConfigurer {
  default void addFormatters(FormatterRegistry registry) {}
  default void addInterceptors(InterceptorRegistry registry) {}
  default void addResourceHandlers(ResourceHandlerRegistry registry) {}
  default void addCorsMappings(CorsRegistry registry) {}
  default void addViewControllers(ViewControllerRegistry registry) {}
  default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
  default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}
  default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
  default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
  default Validator getValidator() {}
   . . .
}

 

view controller

WebMvcConfigurer 활용의 가장 쉬운 예로 view controller에 대해 설정하는 addViewControllers 메서드를 재정의해보자.

웹 애플리케이션을 만들다 보면 구지 거창한 Spring의 Controller를 거치지 않고 단순히 페이지만 보여줘도 충분할 경우가 있다. 예를 들면 /login을 get 방식으로 요청하면 단지 login을 위한 form을 보여주면 충분하다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form th:action="@{/login}" method="post">
		<fieldset>
			<legend>로그인</legend>
			<input type="hidden" name="prev" th:value="${param.prev}">
			<input type="text" name="name" placeholder="이름입력">
			<input type="submit">
		</fieldset>
	</form>
</body>
</html>

 

이런 간단한 페이지라도 스프링이 서비스 하려면 Controller가 필요한데 Controller 필요 없이 단순한 View만 존재하는 경우 요청을 받으면 바로 view name을 View Resolver에게 넘겨 버리는 것이 View Controller이다.

View Controller를 사용하기 위해서는 WebMvcConfigurer의 addViewControllers를 재정의한다.

// Controller에 개별적인 handler method로 구현하는 형태
@GetMapping("/login")
public String loginForm(Model model) {
    return "login";
}
    
// MVCConfig에서 View Controller로 처리하는 형태    
public class MVCConfig implements WebMvcConfigurer {
  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    // /login이라고 요청이 들어오면 login을 viewResolver에게 넘겨줌
    registry.addViewController("/login").setViewName("login");
  }
}

 

JSP 이용하기

앞서 이야기 했듯이 Spring Boot에서 JSP는 그다지 환영받지 못한다. 하지만 여전히 JSP가 가장 많이 사용되고 있는 템플릿인것도 사실이다.

이 세상의 많은 JSP를 위해 이번에는 템플릿 엔진으로 JSP를 사용하기 위해 필요한 내용을 살펴보자.

 

maven dependency

일단 Thymeleaf에 대한 의존성을 제거해주자. 

<!-- dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency-->

 

만약 SpringBoot 3.x를 사용 중이라면 다음의 링크 내용을 참조한다.

https://goodteacher.tistory.com/656

 

[Spring@MVC] SpringBoot 3.x에서 jsp, jstl 설정

SpringBoot 3.x에 들어서면서 jakarta.XX 패키지가 전면에 들어오면서 여러가지 혼선이 발생했다. 라이센스가 변경되면서 한번은 거쳐야하는 홍역인듯 하다. ㅠㅠ 이번 포스트에서는 SpringBoot 3.x에서 js

goodteacher.tistory.com

 

그 이전 버전이라면 아래의 내용을 참조한다.

더보기
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>

 

폴더 구조 생성

JSP가 동작하기 위한 폴더 구조는 아래와 같다. src/main에 아래 구조를 만들고 view에 index.jsp를 만들어보자.

 

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Insert title here</title>
<c:url var="root" value="/"></c:url>
<link rel="stylesheet" href="${root }css/common.css">

</head>
<body>
	<h2>${message}</h2>
</body>
<script src="${root }js/common.js"></script>
</html>

 

JSP를 위한 ViewResolver 설정

이제 JSP 파일을 사용하도록 ViewResolver 설정을 추가해주자.

가장 간단한 방법은 application.properties에 아래와 같이 설정하는 것이다.

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

Handler Adapter에서 view 이름이 반환되면 resolver는 view 이름의 앞에 /WEB-INF/views/를 붙이고 뒤에 .jsp를 붙여서 실제 호출될 jsp의 위치를 완성한다. 즉 index라는 이름을 받으면 /WEB-INF/views/index.jsp를 찾게 하는 것이다.

또는 명시적으로 ViewResolver를 추가할 수도 있다.

@Configuration
public class MVCConfig implements WebMvcConfigurer {
    @Bean
    public ViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
    ...
}

 

실행하기

이제 모든 준비는 완료이다. 다시 애플리케이션을 동작시켜보거나 단위테스트를 실행해보았을 때 Thymeleaf를 사용했을 때와 동일하게 동작하는 것을 확인할 수 있을 것이다. 겨우 몇 개의 설정만으로 template 기술을 대체하는 것은 스프링 부트의 유연함, 확장성의 결과이다.

이 페이지는 JSP의 동작 결과이다.

 

'Spring MVC > 02.Spring @MVC' 카테고리의 다른 글

06. 파라미터의 formatting  (0) 2020.07.07
05. Handler Interceptor  (1) 2020.07.03
03. Controller 작성 2  (2) 2020.07.01
02. Controller 작성 1  (0) 2020.06.30
01. Spring MVC 개요  (5) 2020.06.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.