본문 바로가기
Spring

[Spring 공식문서] Spring Boot. Web

by 매트(Mat) 2024. 5. 16.

이번 파트는 Web이다. 스프링 부트를 사용하여 웹을 개발하게 되면 거의 Spring MVC를 사용하게 된다. 역시 전체를 정리하진 못했고, 부분부분 정리했다.

정리하면서 느끼는거지만 스프링 공식문서에 있는 내용들을 외우려고 보는 것은 아니다. 그냥.. 한번 정도는 볼 필요가 있고, 이제는 공식문서를 두려워하지 않는다는 생각이 들어서이다. (억지로 하려고 하면 너무 힘이들기 떄문에 가볍게 보는 마음으로 정리하고 있다.)

Web

레거시 스프링은 어려웠지만, 스프링 부트는 웹 애플리케이션 개발에 매우 적합하다. 그 이유는 내장된 Tomcat, Jetty, Undertow, Netty 서버를 사용함으로써 독립형 HTTP 서버를 만들 수 있다. 웹 애플리케이션 개발을 하기 위해서 spring-boot-starter-web 모듈을 사용한다.

Servlet Web Applications

서블릿 기반의 웹 애플리케이션을 빌드하려면 Spring MVC에 대한 auto-configuration을 사용할 수 있다.

Spring MVC Auto-configuration

스프링 부트가 아닌 레거시 스프링을 사용한다면 @EnableWebMvc 설정 정보를 작성해야 했다. 하지만 스프링 부트는 Spring MVC에 대한 설정을 자동으로 등록해준다. 추가적으로 자동 설정은 아래 기능들도 제공해준다.

  • ContentNegotiatingViewResolverBeanNameViewResolver 빈을 포함한다.
    • ContentNegotiatingViewResolver: ViewResolver의 구현체로 reuqest의 파일 이름 또는 accept 헤더를 기반으로 view가 결정된다.
    • BeanNameViewResolver : ViewResolver의 구현체로 Bean 이름을 기반으로 view가 결정된다.
  • WebJars를 포함한 static resources 지원
  • Converter, GenericConverter, Formatter 빈들을 자동 등록
  • HttpMessageConverters 지원
  • MessageCodesResolver 자동 등록
  • Welcome Page인 static index.html 지원
  • ConfigurableWebBindingInitializer 빈 자동 등록

Spring Boot의 auto-configuration을 통해 제공해주는 다양한 기능들을 커스터마이징하려면 WebMvcConfigurer 인터페이스를 상속받은 클래스에 @Configuration을 사용한다. (대신 @EnableWebMvc 을 사용하면 안된다! auto-configuration 기능을 제공받지 못한다.)

Spring MVC Conversion Service

스프링 부트가 제공해주는 ConversionService 말고도 직접 커스터마이징 하려면 WebMvcConfigurer 인터페이스를 상속받은 설정 클래스에 addFormatters 메서드를 통해 등록하면 된다.

HttpMessageConverters

Spring MVC는 HttpMessageConverter를 사용하여 HTTP의 요청과 응답을 변환한다. 예를 들어 객체는 JSON으로 자동 변환하고, 기본적으로 문자열은 UTF-8로 인코딩된다.

MessageCodesResolver

검증시(validate) 에러 코드를 통해 메시지 코드를 빌드하기 위한 전략 인터페이스이다.

Static Content

기본적으로 스프링 부트는 static content를 아래 classpath에 있는 디렉토리에서 제공한다.

  • /static
  • /public
  • /resources
  • /META-INF/resources

경로를 변경하고 싶으면 WebMvcConfigurer 인터페이스를 상속한 설정 클래스에서 ResourceHttpRequestHandleraddResourceHandlers 메서드를 재정의할 수 있다.

하지만 역시 왠만하면 default 그대로 사용하는 것이 나중에 유지보수에도 좋을 것 같다.

# Spring boot default resources
spring.mvc.static-path-pattern=/resources/**
  • war가 아닌 jar 패키징을 사용할 경우 src/main/webapp 경로는 사용하지 말아야 한다.
  • 해당 경로는 war 패키징만 사용한다.

Welcome Page

스프링 부트는 static과 템플릿된 welcome pages를 지원한다. static content에 위치한 index.html 을 만들면 된다. 같은 리소스가 여러개라면 아래 우선순위에 따라 렌더링된다.

  • RouterFunctionMapping
  • RequestMappingHandlerMapping
  • WelcomePageHandlerMapping

Path Matching and Content Negotiation

Spring MVC는 요청 경로를 통해 애플리케이션에 정의된 매핑과 매칭시켜 들어오는 HTTP 요청 핸들러를 찾을 수 있다.

스프링 부트는 기본적으로 suffix 패턴 매칭을 비활성화시킨다.

Wrong: "GET /projects/spring-boot.json"
Good: @GetMapping("/projects/spring-boot")

Template Engines

스프링 부트는 REST Web Service 뿐만 아니라, Spring MVC를 사용하여 동적 HTML 컨텐츠를 제공한다. 다양한 템플릿 기술을 제공한다. 아래 템플릿 엔진들을 스프링 부트의 auto-configuration에 포함된다.

  • FreeMarker
  • Groovy
  • Thymeleaf
  • Mustache

스프링 부트를 사용한다면 가능한 JSP는 피해야 한다. 내장 서블릿 컨테이너 환경에서 사용하는데 제한이 있다.

템플릿 경로는 src/main/resources/templates 위치한다.

Error Handling

스프링 부트는 모든 오류를 합리적인 방식으로 처리하는 /error 매핑을 제공하며 서블릿 컨테이너에 global 오류 페이지로 등록된다.

  • Rest의 경우 에러 내용(에러 상세, 상태코드, 예외 메시지)을 JSON으로 응답한다.
  • Browser의 경우 HTML 포맷으로 같은 에러 내용을 “whitelabel” view로 렌더링된다.

기본으로 제공해주는 Error Handling을 커스터마이징 하려면 ErrorController 를 구현하고 빈으로 등록하면 된다.

스프링 부트가 기본적으로 제공해주는 Error Handling은 ErrorController 인터페이스를 구현한 BasicErrorController 클래스이다.

@ControllerAdvice 애노테이션을 사용하면 에러 내용을 JSON으로 반환할 수도 있다.

Custom Error Pages

/error 디렉토리에 404.html 처럼 HTML 파일명을 상태코드로 만들면 해당 상태코드 에러 발생시 커스텀한 Error 페이지를 사용자에게 보여줄 수 있다.

파일명을 변경하려면 ErrorViewResolver 인터페이스를 구현하여 빈으로 등록하면 된다.

public class MyErrorViewResolver implements ErrorViewResolver {

    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        // Use the request or status to optionally return a ModelAndView
        if (status == HttpStatus.INSUFFICIENT_STORAGE) {
            // We could add custom model values here
            new ModelAndView("myview");
        }
        return null;
    }

}

CORS Support

CORS(Cross-Origin Resource Sharing)는 대부분의 브라우저에서 구현되는 W3C 사양으로, 승인된 도메인 간 요청 종류를 유연하게 지정할 수 있다.

스프링 4.2 버전 이후부터 Spring MVC는 CORS를 지원하는데 컨트롤러 메서드에 @CrossOrigin 애노테이션을 사용하면 된다. 아니면 WebMvcConfigurer 인터페이스를 상속받은 설정 파일에 addCorsMappings(CorsRegistry) 메서드를 오버라이딩하여 구현한다.

댓글