Backend/Spring

[Spring Web MVC] WebMvcConfigurer

해로몬 2024. 11. 26. 17:19

1.MVC Config :: Spring Framework

2. MVC Config API :: Spring Framework

3. Web MVC Configurer

 

더보기

@Configuration VS @Component

 

@Component는 개발자가 직접 작성한 클래스를 bean으로 등록하고자할 때 사용한다.

 

@Configuration@Component를 포함하는데, 외부 라이브러리 또는 내장 클래스를 bean으로 등록하고자할 때, 1개이상의 @Bean을 제공하는 클래스에 붙여 사용한다.

WebMvcConfigurer란?

WebMvcConfigurer는 Spring MVC에서 제공하는 인터페이스로, Spring의 기본 설정을 커스터마이징하는 데 사용됩니다.

주로 URL 매핑, 뷰 리졸버, 리소스 처리, CORS 설정, 인터셉터 등록 등과 같은 MVC 설정을 사용자 정의할 수 있도록 지원합니다.

 

WebMvcConfigurer의 주요 역할

  1. Spring Boot의 자동 설정을 유지하면서 필요한 부분만 변경:
    • Spring Boot의 기본 설정을 덮어쓰지 않고, 커스터마이징이 필요한 부분만 설정 가능.
  2. 애플리케이션 전역 설정 적용:
    • 공통적으로 적용할 규칙(예: 전역 URL 패턴, 리소스 핸들링, 포맷 설정 등)을 설정.
  3. Spring MVC 기능 확장:
    • 인터셉터, 포맷터, 메시지 컨버터 등을 추가하여 애플리케이션의 요구 사항에 맞게 확장 가능.

WebMvcConfigurer의 주요 메서드

메서드 역할
addViewControllers(ViewControllerRegistry registry) 특정 URL에 대해 컨트롤러 없이 바로 뷰를 연결.
configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) 기본 서블릿 처리 활성화.
addResourceHandlers(ResourceHandlerRegistry registry) 정적 리소스(js, css, 이미지 등) 경로 설정.
addCorsMappings(CorsRegistry registry) 전역 CORS(Cross-Origin Resource Sharing) 설정.
addFormatters(FormatterRegistry registry) 커스텀 포맷터나 변환기 등록.
addInterceptors(InterceptorRegistry registry) 요청 처리 전에 가로채는 인터셉터 등록.
configureMessageConverters(List<HttpMessageConverter<?>> converters) HTTP 메시지 변환기 설정 (예: JSON → 객체).
configureContentNegotiation(ContentNegotiationConfigurer configurer) 클라이언트 요청에 따라 반환할 데이터 타입 설정 (JSON, XML 등).
configurePathMatch(PathMatchConfigurer configurer) URL 경로 매핑 규칙 설정.

기본 구조

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

@Configuration
public class WebConfig implements WebMvcConfigurer {
	//WebMvcConfigurer는 인터페이스이므로 원하는 메서드만 오버라이드하여 사용할 수 있습니다.
    // 필요한 메서드 오버라이드
}

주요 설정 예제

1 뷰 컨트롤러 추가

  • 특정 URL을 처리하기 위해 별도의 컨트롤러 없이 뷰만 연결.
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/home").setViewName("home");
    registry.addViewController("/login").setViewName("login");
}

사용 사례

  • 로그인 페이지나 정적 페이지와 같이 간단한 URL 매핑이 필요한 경우.

2 정적 리소스 핸들링

  • 정적 리소스(js, css, 이미지 등)의 경로를 설정.

코드 예제

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
            .addResourceLocations("classpath:/static/");
}

사용 사례

  • /static/ 경로로 접근하면 src/main/resources/static/에서 정적 리소스를 제공.

3 CORS 설정

  • 특정 도메인에서 애플리케이션에 접근할 수 있도록 허용(CORS).
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")  // CORS 적용 경로
            .allowedOrigins("<http://example.com>")  // 허용 도메인
            .allowedMethods("GET", "POST")  // 허용 HTTP 메서드
            .allowCredentials(true);  // 쿠키 허용 여부
}

사용 사례

  • 클라이언트와 서버가 다른 도메인에 있을 때 API 호출 허용.

4 인터셉터 추가

  • 요청/응답 전에 특정 로직을 실행.

[Spring Web MVC] HandlerInterceptor

인터셉터 구현:

import org.springframework.web.servlet.HandlerInterceptor;

public class CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("Interceptor: Before request processing");
        return true;  // true일 경우 다음 단계로 진행
    }
}

WebMvcConfigurer에 등록:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new CustomInterceptor())
            .addPathPatterns("/api/**")  // 적용 경로
            .excludePathPatterns("/api/login");  // 제외 경로
}

사용 사례

  • 인증, 로깅, 사용자 권한 검사 등 요청 처리 전에 실행해야 하는 로직.

5 메시지 컨버터 추가

  • 클라이언트 요청(JSON, XML 등)을 객체로 변환하거나, 객체를 응답으로 변환.
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MappingJackson2HttpMessageConverter());
}

사용 사례

  • JSON 요청/응답 변환을 커스터마이징.

6 포맷터 및 변환기 등록

  • 데이터 포맷 변환(예: 날짜 형식 변경).
@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
}

사용 사례

  • 날짜 형식 변경(2024-01-01 → 01/01/2024).

7 PathMatch 설정

  • URL 경로 매핑 규칙을 설정.
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.setUseTrailingSlashMatch(false);  // 슬래시 구분 활성화
}

사용 사례

  • /example/와 /example를 구분.

WebMvcConfigurer vs @EnableWebMvc

특정 WebMvcConfigurer @EnableWebMvc
사용 목적 Spring Boot 기본 설정을 유지하며 커스터마이징 가능 Spring Boot의 기본 MVC 설정을 완전히 대체
설정 범위 필요한 메서드만 오버라이드하여 선택적으로 설정 가능 모든 MVC 설정을 수동으로 정의해야 함
적합한 환경 대부분의 Spring Boot 애플리케이션 기본 설정을 모두 커스터마이징해야 하는 고급 애플리케이션

'Backend > Spring' 카테고리의 다른 글

[Spring Web MVC] HandlerInterceptor  (0) 2024.11.26
Rdeirect VS Forward  (0) 2024.11.26
[Spring Web MVC] Session  (0) 2024.11.25
[Spring Web MVC] 🍪Cookie  (0) 2024.11.25
[Spring Web MVC] HTTP 요청 RequestMapping  (0) 2024.11.25