[Spring REST API #3] Spring REST API 이벤트 도메인 구현

2021. 3. 26. 02:16 Spring Data/Spring Data REST

 

| 이벤트 도메인 구현

 

모든 소스 코드는 여기에서 보실 수 있습니다.

 

프로젝트 구조

+---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



출처: https://engkimbs.tistory.com/857?category=789178 [새로비]