이번 파트는 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에 대한 설정을 자동으로 등록해준다. 추가적으로 자동 설정은 아래 기능들도 제공해준다.
ContentNegotiatingViewResolver
와BeanNameViewResolver
빈을 포함한다.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
인터페이스를 상속한 설정 클래스에서 ResourceHttpRequestHandler
의 addResourceHandlers
메서드를 재정의할 수 있다.
하지만 역시 왠만하면 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)
메서드를 오버라이딩하여 구현한다.
'Spring' 카테고리의 다른 글
[Spring 공식문서] Spring Boot. Data (0) | 2024.06.10 |
---|---|
[Spring 공식문서] Spring Boot. Core Features (0) | 2024.05.16 |
[Spring 공식문서] Spring Boot. Using Spring Boot (0) | 2024.05.14 |
HttpEntity, @RequestBody, @ResponseBody의 기능 (HTTP 메시지 컨버터) (0) | 2022.07.21 |
@RequestParam과 @ModelAttribute 기능 (0) | 2022.07.21 |
댓글