[Spring/MVC] WebMvcConfigurer

2024. 12. 24. 20:36·Spring/MVC

김영한님 Spring MVC 강의를 통해 공부하다가 Spring MVC에 WebMvcConfigurer 라는 확장 포인트가 있다는 점을 알게 되었다. 

(강의에서는 ArgumentResolver와 MessageConverter를 WebMvcConfigurer에서 확장할 수 있다 정도만 설명하고 넘어감)

Spring MVC에는 대부분의 기능이 이미 구현되어 있어 확장 포인트가 많지 않다고 했는데, WebMvcConfigurer에서는 어떤 부분을 확장할 수 있는지 구체적으로 알아보자.

 

WebMvcConfigurer란?

WebMvcConfigurer 는 스프링 부트 혹은 스프링 MVC 애플리케이션에서 MVC 관련 설정을 직접 확장하거나 추가할 수 있게 해주는 확장 포인트 인터페이스이다.

 

스프링 부트가 제공하는 WebMvcAutoConfiguration 은 내부적으로 기본 설정(MessageConverter, 정적 리소스 핸들링, 인터셉터, CORS 등)을 이미 해 놓았다.


이 기본 설정에 추가로 설정을 붙이거나 일부를 커스터마이징하고 싶으면, 개발자는 @Configuration 클래스에서 WebMvcConfigurer를 구현(implements)하면 된다.

 

WebMvcConfigurer가 제공하는 대표적인 확장 메서드

  1. addFormatters(FormatterRegistry registry)
    • Converter나 Formatter 등을 등록해 데이터 변환 로직을 커스터마이징할 수 있다.
    • 예: 문자열을 특정 객체로 변환하거나, 날짜 포맷을 다르게 해석해야 할 때
  2. extendMessageConverters(List<HttpMessageConverter<?>> converters)
    • 기존에 스프링이 등록한 MessageConverter 목록에 추가로 커스텀 컨버터를 넣을 수 있다.
    • (구버전 메서드: configureMessageConverters(...)는 완전히 교체하는 것이고, extendMessageConverters(...)는 추가하는 것에 가깝다.)
    • 예: 특정 미디어 타입(json, xml, protobuf, etc.)을 추가로 지원하거나, 직렬화 과정을 좀 더 세분화하고 싶을 때
  3. addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
    • 컨트롤러 메서드의 파라미터를 어떻게 바인딩할지 결정하는 ArgumentResolver 를 추가한다.
    • 예: @LoginUser 같은 어노테이션을 파라미터에 달면 사용자 세션 정보를 자동으로 주입해주도록 만들 때
      • 이 부분은 김영한님 MVC 강의 2편에서 로그인 구현을 설명할 때 직접 예제로서 보여주신다고 한다.
  4. addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers)
    • 컨트롤러 메서드의 리턴 값을 처리하는 로직을 확장할 수 있다.
    • 예: @ResponseBody가 아닌, 특정 커스텀 어노테이션이나 리턴 타입을 다르게 처리해야 할 때
  5. addInterceptors(InterceptorRegistry registry)
    • 핸들러 인터셉터(HandlerInterceptor)를 등록해, 요청 전후 로직을 추가할 수 있다.
    • 예: 공통 로깅, 인증/인가 로직, 공통 처리 로직 등을 AOP처럼 구현하려 할 때
  6. addViewControllers(ViewControllerRegistry registry)
    • 단순히 View 만 반환하는 경우, 컨트롤러 클래스를 만들지 않고 매핑 가능하게 해준다.
    • 예: "/login" 요청이 들어오면 바로 "loginView" 템플릿을 보여주기
  7. configureViewResolvers(ViewResolverRegistry registry)
    • 뷰 리졸버(ViewResolver) 설정을 확장하거나 추가할 수 있다. (예: Thymeleaf,
    • JSP, Freemarker 등)
  8. addResourceHandlers(ResourceHandlerRegistry registry)
    • 정적 리소스(이미지, CSS, JS 등) 경로를 매핑하고, 캐싱 전략 등을 커스터마이징할 수 있다.
  9. addCorsMappings(CorsRegistry registry)
    • CORS 설정을 추가할 수 있다.
    • 예: 특정 URL 패턴에 대해 allowedOrigins, allowedMethods 등을 세부적으로 설정
  10. configurePathMatch(PathMatchConfigurer configurer)
    • URL 경로 매핑 전략을 세밀하게 다룰 수 있다. (예: 점(.) 허용 여부, 대소문자 구분 등)

이외에도 configureContentNegotitation(), configureAsyncSupport(), configureDefaultServletHandling() 등이 있다.

예시 - CORS Configuration

CORS 매핑의 경우 필자가 직접 확장해본 적이 있다.

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins("http://stackture.com")
            .allowedMethods("GET", "POST")
            .allowCredentials(true);
}

 

앞으로 WebMvcConfigurer를 직접 확장해볼 일이 생긴다면 내용을 계속해서 추가해보겠다.

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

[Spring MVC] 08. 타임리프 기본기능  (0) 2024.12.27
[Spring MVC] 07. 스프링 MVC - 웹 페이지 만들기(타임리프, PRG, RedirectAttribute)  (0) 2024.12.26
[Spring MVC] 06. 스프링 MVC - 기본 기능  (0) 2024.11.24
[Spring MVC] 05. 스프링 MVC - 구조 이해  (0) 2024.11.21
[Spring MVC] 04. MVC 프레임워크 만들기  (0) 2024.11.20
'Spring/MVC' 카테고리의 다른 글
  • [Spring MVC] 08. 타임리프 기본기능
  • [Spring MVC] 07. 스프링 MVC - 웹 페이지 만들기(타임리프, PRG, RedirectAttribute)
  • [Spring MVC] 06. 스프링 MVC - 기본 기능
  • [Spring MVC] 05. 스프링 MVC - 구조 이해
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456) N
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129) N
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5) N
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Spring/MVC] WebMvcConfigurer
상단으로

티스토리툴바