개발은 재밌어야 한다
article thumbnail
반응형

스프링 부트에서 REST URL을 자동으로 생성해주는 spring-boot-starter-data-rest가 어떻게 주소를 자동으로 생성해서 Rest URL을 생성해주는가에 대해서 알아보겠습니다.

 

우선 공식 문서 스프링 데이터의 공식문서를 참조해서 보겠습니다.

https://docs.spring.io/spring-data/rest/docs/current/reference/html/

 

Spring Data REST Reference Guide

Spring Data REST presents a default view of the domain model you export. However, sometimes, you may need to alter the view of that model for various reasons. This section covers how to define projections and excerpts to serve up simplified and reduced vie

docs.spring.io

 

 

사용방법

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 클래스가 있습니다.

https://github.com/spring-projects/spring-data-rest/blob/main/spring-data-rest-core/src/main/java/org/springframework/data/rest/core/mapping/RepositoryCollectionResourceMapping.java

 

GitHub - spring-projects/spring-data-rest: Simplifies building hypermedia-driven REST web services on top of Spring Data reposit

Simplifies building hypermedia-driven REST web services on top of Spring Data repositories - GitHub - spring-projects/spring-data-rest: Simplifies building hypermedia-driven REST web services on to...

github.com

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
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!