개요
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"))
'dev > spring' 카테고리의 다른 글
Spring Framework 7.0.0 API Versioning (0) | 2025.07.31 |
---|---|
Spring Framework 7.0 - Resilience Features (회복력 기능) (2) | 2025.07.27 |
Jackson 3.0.0 알아보기 (0) | 2025.07.15 |
Spring Batch에서 JobParameter사용하기 (0) | 2025.06.17 |
Spring Boot에서 Project Leyden을 사용하는 방법 (2) | 2025.06.09 |