[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/#

소스 코드 : https://github.com/engkimbs/spring-rest-api


이 글을 공유하기

댓글(0)

Designed by JB FACTORY