[Spring REST API #3] Spring REST API 이벤트 도메인 구현
| 이벤트 도메인 구현
모든 소스 코드는 여기에서 보실 수 있습니다.
프로젝트 구조
+---src
| +---main
| | +---java
| | | \---com
| | | \---example
| | | \---springrestapi
| | | | SpringRestApiApplication.java
| | | |
| | | \---events
| | | Event.java
| | | EventStatus.java
| | |
| | \---resources
| | | application.properties
| | |
| | +---static
| | \---templates
| \---test
| \---java
| \---com
| \---example
| \---springrestapi
| | SpringRestApiApplicationTests.java
| |
| \---events
| EventTest.java
의존성 관리
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-mockmvc</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
테스트 코드
package com.example.springrestapi.events;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class EventTest {
@Test
public void builder() {
Event event = Event.builder()
.name("Spring REST API")
.description("REST API development").build();
assertThat(event).isNotNull();
}
@Test
public void javaBean() {
// Given
String name = "Event";
String description = "Spring REST API";
// When
Event event = new Event();
event.setName(name);
event.setDescription(description);
// Then
assertThat(event.getName()).isEqualTo(name);
assertThat(event.getDescription()).isEqualTo(description);
}
}
- 이벤트 도메인 객체에 대한 테스트를 작성하였다.
- builder 테스트는 이벤트 도메인 객체가 builder 메서드를 가지고 있는 지 확인하는 테스트이며 javaBean은 도메인 객체가 자바빈을 준수하였는지 확인하는 테스트이다.
소스 코드
package com.example.springrestapi.events;
import lombok.*;
import java.time.LocalDateTime;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@EqualsAndHashCode(of = "id") // Entity 간에 상호 참조하는 경우 Stack Overflow가 발생될 수 있으므로
// id로 비교하는 것이 바람직 @Data를 쓰지 않는 이유도 @EqualsAndHashCode를 재정의하려고
public class Event {
private Integer id;
private String name;
private String description;
private LocalDateTime beginEnrollmentDateTime;
private LocalDateTime closeEnrollmentDateTime;
private LocalDateTime beginEventDateTime;
private LocalDateTime endEventDateTime;
private String location; // (optional) 없으면 온라인 모임
private int basePrice; // (optional)
private int maxPrice; // (optional)
private int limitOfEnrollment;
private boolean offline;
private boolean free;
private EventStatus eventStatus = EventStatus.DRAFT;
}
- Event 도메인 객체를 나타내는 코드다. lombok 어노테이션을 통해서 코드량을 대폭 줄인 것을 볼 수 있다.
- @Builder 어노테이션을 통해서 빌더 패턴을 적용한 코드를 쉽게 적용할 수 있다.
- @Data 어노테이션을 이용하지 않고 위와 같이 적용한 이유는 도메인 객체간에 상호 참조하는 경우 같은 지 아닌 지 비교하는 로직에서 Stack Overflow가 발생할 수 있는 여지가 생기므로 따로 @EqualsAndHashCode 어노테이션을 커스터마이징 하기 위해 쓰지 않는 것이다.
- 위와 같이 이벤트의 특정 상태를 나타내는 데이터는 아래와 같이 Enum을 이용하여 나타낸다.
package com.example.springrestapi.events;
public enum EventStatus {
DRAFT, PUBLISHED, BEGAN_ENROLLMENT;
}
결과 화면
참조: https://www.inflearn.com/course/spring_rest-api/#
'Spring Data > Spring Data REST' 카테고리의 다른 글
[Spring REST API #8] Spring REST API 비즈니스 로직 적용 및 JUnitParam을 이용한 테스트 (0) | 2021.03.26 |
---|---|
[Spring REST API #7] Spring REST API Bad Request 처리 및 에러 응답 메세지 보내기 (0) | 2021.03.26 |
[Spring REST API #6] Spring REST API Bad Request 처리 (0) | 2021.03.26 |
[Spring REST API #5] Spring REST API 입력값 제한하기 및 에러 발생 처리 (0) | 2021.03.26 |
[Spring REST API #4] Spring REST API 테스트 클래스 생성 및 201 응답 받기 (0) | 2021.03.26 |
[Spring Rest API #2] 인텔리제이(IntelliJ)에서 스프링 REST API 프로젝트 시작하기 (0) | 2021.03.26 |
[Spring Rest API #1] REST API란? (0) | 2021.03.26 |
RestTemplate (정의, 특징, URLConnection, HttpClient, 동작원리, 사용법, connection pool 적용) (0) | 2021.03.22 |