스프링 부트에서 REST URL을 자동으로 생성해주는 spring-boot-starter-data-rest가 어떻게 주소를 자동으로 생성해서 Rest URL을 생성해주는가에 대해서 알아보겠습니다.
우선 공식 문서 스프링 데이터의 공식문서를 참조해서 보겠습니다.
https://docs.spring.io/spring-data/rest/docs/current/reference/html/
사용방법
Gadle이나 Maven을 통해서 스프링 데이터 REST에 대한 Dependency를 추가를 할 수 있습니다.
dependencies {
...
compile("org.springframework.boot:spring-boot-starter-data-rest")
...
}
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
...
</dependencies>
이렇게 spring-boot-starter-data-rest를 추가하게 되면 스프링 MVC에서의 REST를 자동으로 구성 할 수 있습니다.
스프링 부트의 경우에는 메인으로 실행되는 @SpringBootApplication에 지정되어 있는 @EnableAutoConfiguration때문에 자동으로 활성화가 된다고 합니다.
@SpringBootApplication을 들여다보면 컴포넌트 스캔과 더불어 @EnableAutoConfiguration도 지정되어 있는 것을 볼 수 있습니다.
Spring Data의 리포지토리를 기반으로 해당 도메인을 기준으로 거기에 맞는 RESTAPI의 엔드포인트를 만들어 생성해줘서 RESTAPI 작성에 있어서의 편의성을 높여줍니다.
보통 기본적으로 Spring Data REST에서는 루트 URL인 '/'에 대한 REST 리소스를 제공한다고 합니다.
'/'로 구성되어 있는 기본 URL을 변경하려면 properties를 통해 설정하는 방법과 자바 코드를 통해 변경하는 방법이 있습니다.
예시 ) '/' 기본 URL을 => '/api' 로 변경
1. Spring Boot 1.2 이상 버전에서는 application.properties다음과 같이 단일 속성을 설정하여 기본 URI를 변경할 수 있습니다 .
spring.data.rest.basePath=/api
2. Spring Boot 1.1 이하 버전이나 SpringBoot가 아니라면 코드를 통해 설정할 수 있습니다
@Configuration
class CustomRestMvcConfiguration {
@Bean
public RepositoryRestConfigurer repositoryRestConfigurer() {
return new RepositoryRestConfigurer() {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
config.setBasePath("/api");
}
};
}
}
@Configuration어노테이션(설정 파일을 만들기 위한 어노테이션 또는 Bean을 등록하기 위한 어노테이션)을 통해 빈을 생성해 RepositoryRestConfigurer를 오버라이드해서 setBasePath를 통해 원하는 기본 주소를 변경할 수 있습니다.
@Component를 통해 빈을 정의하고 RepositoryRestConfigurer를 extend를 통해 설정하여 해당 빈을 컴포넌트 스캔을 통해 사용 할 수 있도록 하게 하여 설정할 수도 있습니다.
@Component
public class CustomizedRestMvcConfiguration extends RepositoryRestConfigurer {
@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
config.setBasePath("/api");
}
}
그럼 spring-boot-starter-data-rest가 어떻게 url을 생성할까?
spring-data-rest에 보면 RepositoryCollectionResourceMapping 클래스가 있습니다.
RepositoryCollectionResourceMapping클래스의 생성자를 보면
지정된 저장소를 사용하여 지정된 저장소에 대해 새 {@link RepositoryCollectionResourceMapping}을(를) 생성합니다.
라고 되어있는데 여기서 entity로 지정된 것들에 대한 metadata들을 통해서 url을 생성해 주는것 같다.
domainTypeMapping에서 path를 가져와서 RepositoryCollectionResourceMapping 클래스의 필드변수에 할당하는 것으로 봐서 domainTypeMapping를 보면 될 것 같다.
EVO_INFLECTOR_ISPRESENT라는 것은 org.atteo.evo.inflector.English가 classpath에 존재하는지 체크하는 것이고,
일반적인 경우라면 spring dependency로 가져왔을테니까 일반적으로는 true값이 된다.
그럼 생성되는 EvoInflectorTypeBasedCollectionResourceMapping 를 봐보면
TypeBasedCollectionResourceMapping 클래스를 extends하고 있다
여기서 Resource 클래스의 정보들을 가져와서 담는다
그럼 다음과 같이 지정한 url을 커스텀하게 생성할 수도 있습니다.
참고
https://docs.spring.io/spring-data/rest/docs/current/reference/html/
https://www.freeism.co.kr/wp/archives/1645#fn-1645-2
'Spring > Spring' 카테고리의 다른 글
@RequiredArgsConstructor란? (0) | 2022.06.10 |
---|---|
[Spring 스프링] Http status 에러 405 Method Not Allowed (0) | 2021.06.22 |
REST API란? (0) | 2021.04.06 |