본문 바로가기
dev/spring

Spring - Path Prefix

by igooo 2025. 8. 18.
728x90

개요

Spring을 사용하여 API를 개발할 때 여러 개의 Controller를 생성하고, @RequestMapping을 사용하여 각 Controller에 공통된 Prefix Path를(ex /api/v1.0/, ...) 설정하는 방법으로 API의 URL을 정의해 왔다. 이번 포스트에서는 Spring의 WebMvcConfigurer를 사용하여 원하는 Controller에 Path Prefix를 설정하는 방법을 알아본다.

 

As-is

WebMvcConfigurer를 사용하는 방법을 알아보기 전에 기존 프로젝트의 코드에서는 대부분 아래와 같이 개발하는 경우가 많았다.

Controller에 @RequestMapping을 사용하여 상수로 정의한 API_PREFIX를 path 문자열 앞에 추가하여 API URL을 정의한다.

public class Constant {
    public static final String API_PREFIX = "/api/v1.0/";
    ......
}

 

@RestController
@RequestMapping(Constant.API_PREFIX + "/users")
class UserApiController {
    ......
    
    
@RestController
@RequestMapping(Constant.API_PREFIX + "/products")
class ProductApiController {
    ......

 

To-be

WebMvcConfigurer를 사용하여 설정하는 방법은 아래와 같다.

PathMatchConfigurer의 addPathPrefix 메서드를 사용하여 path prefix를 설정할 수 있다.

@Configuration
class WebConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("/api/v1.0", aClass -> true);
    }
}

addPathPrefix() 메서드의 2번째 파라미터인 Predicate를 사용하여 아래와 같이 가양한 조합을 사용하여 prefix를 설정할 수 있다.

 

@RestController에 적용하기

HandlerTypePredicate 클래스를 사용하여 RestController에만 prefix를 설정할 수 있다.

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
     configurer.addPAthPrefix("/api/v1.0", HandlerTypePredicate.forAnnotation(RestController.class));
}

 

 

Package 단위로 적용하기

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
     configurer.addPAthPrefix("/api/v1.0", HandlerTypePredicate.forBasePackage("org.igooo.api.user"));
}

 

 

@PathVariable 적용하기

@PathVariable을 설정하여 사용할 수 있다.

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
     configurer.addPAthPrefix("/api/{version}", clazz -> true);
}

 

@RestController
@RequestMapping("/users")
class UserApiController {
    @GetMapping
    List<User> users(@PathVariable("version) String version) {
        System.out.println("version " + version);
        ......   
    }
}

 

Customized

다양한 조건을 사용하여 prefix를 설정할 수 있다.

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
     configurer.addPAthPrefix("/api/v1.0", clazz -> clazz.isAnnotationPresent(Controller.class) 
               && clazz.getPackage().getName().contains("web"));
}

 

 

마무리

PathMatchConfigurer를 사용하여 API Path Prefix를 관리하면 아래와 같은 장점을 얻을수 있다.

  • 일관된 구조: API endpoint를 중앙에서 관리하여 일관된 구조를 제공한다.
  • 확장성: 프로젝트 규모가 커져도 체계적인 URL 관리가 가능하다.
  • 버전 관리: 다양한 API 버전을 쉽게 관리할 수 있다. (ex configurer.addPathPrefix("/api/v1.0", predicate))
  • 보안 강화: API 경로에 대해서만 특별한 보안 정책을 적용할 수 있다 (http.authorizeHttpRequests(auth -> auth.requestMatchers("/api/**).authenticated().anyRequest().permitAll())
  • CORS: API 경로에 대해서만 CORS를 적용할 수 있다. (registry.addMapping("/api/**").allowedOrigins("*").allowedMethods("GET", "POST"))
728x90