Spring Data Rest
What is?
- Entity와 Repository를 작성하면 자동으로 RESTful API를 제공해줌
- JPA와 HATEOAS등 기능 자동으로 결합
- 빠르게 RESTful API의 구현이 가능하다.
- 단순한 CRUD만 가능하며 복잡성을 감당하기에 부족
사용이유
- MSA를 위해서 사용할 간단한 예제를 만들기에 적합하다고 판단함
- 무엇보다 RESTful API를 만드는데 빠름
Start
dependencies
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.4.0'
}
- DB로 h2데이터 베이스를 사용하였다.
- org.springframework.boot:spring-boot-starter-data-rest: 다음을 추가하면 spring data rest를 사용할 수 있다.
- 문서화 도구로 swagger을 위해 openapi를 사용하였다.
설정하기
spring.data.rest.basePath=/api
spring.data.rest.defaultMediaType=application/json
spring.data.rest.maxPageSize=100
spring.data.rest.pageParamName=page
spring.data.rest.limitParamName=limit
spring.data.rest.sortParamName=sort
spring.data.rest.defaultPageSize=20
spring.data.rest.returnBodyOnCreate=true
spring.data.rest.returnBodyOnUpdate=true
spring.data.rest.detectionStrategy=annotated
spring.data.rest.enableEnumTranslation=true
spring.data.rest.enableDefaultExposure=true
spring.data.rest.detection-strategy=annotated
- 다음과 같은 것을 설정할 수 있다.
- spring.data.rest.detection-strategy의 경우 등록할 Repo를 지정할 수있다.
- ANNOTATED으로 지정하면 @RepositoryRestResource을 붙인 Repo만 사용가능 하다.
Entity와 Repository 구성하기
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
private String city;
private int championships;
@OneToMany(mappedBy = "team")
@JsonIgnore
private List<Player> players;
}
public interface TeamRepository extends JpaRepository<Team, Long> {
}
@Entity
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private long number;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
}
public interface TeamRepository extends JpaRepository<Team, Long> {
}
Swagger config
- SwaggerConfiguration.java
@Configuration
public class SwaggerConfiguration {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.components(new Components())
.info(apiInfo());
}
private Info apiInfo() {
return new Info()
.title("APIs")
.description("Team API")
.version("1.0.0");
}
}
# Swagger
springdoc.swagger-ui.path=/api-docs
JPA 및 H2 DB 설정
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
Use