개발강의정리/Spring

[스프링 기반 REST API 개발] 1-5. 이벤트 도메인 구현

nineDeveloper 2019. 12. 27.
728x90

스프링 기반 REST API 개발

1. REST API 및 프로젝트 소개

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/spring-rest-api-study/tree/chap01-05-event_domain

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/spring_rest-api/dashboard

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

5. 이벤트 도메인 구현

Event 생성 API

다음의 입력 값을 받는다

  • name
  • description
  • beginEnrollmentDateTime
  • closeEnrollmentDateTime
  • beginEventDateTime
  • endEventDateTime
  • location (optional) 이게 없으면 온라인 모임
  • basePrice (optional)
  • maxPrice (optional)
  • limitOfEnrollment

Lombok 설치

  1. Lombok plugin 설치
  2. Build, Excution, Depolyment - Annotation Processors - Enable annotation processing

Builder

  • 내가 입력한 문자열이 무슨 입력값인지 알기 쉬움
  • 점으로 연결되서 코딩하기도 쉬움
  • Builder 로는 기본생성자가 생성이 안됨(모든 파라메터를 다 가지고 있는 생성자만 생성)
  • public이 아니고 default 생성자로 생성이 되어 다른 패키지에서 이 이벤트에 대한 객체를 만들기 애매함

Lombok 애노테이션 설정

  • @AllArgsConstructor, @NoArgsConstructor, @Getter, @Setter
  • 기본 생성자와 파라메터를 모두 가진 생성자 그리고 getter, setter을 만들기 위해 어노테이션 설정
  • Lombok 애노테이션은 Meta애노테이션으로 동작하지 않기 때문에 연관되는 애노테이션을 다 합쳐서 줄여서 사용할 수 없음
    @Builder @AllArgsConstructor @NoArgsConstructor
    @Getter @Setter @EqualsAndHashCode(of = "id")
    public class Event {}

@EqualsAndHashCode(of = "id")

  • id 값만으로 EqualsAndHashCode를 비교하라 라는 의미
  • 필요하다면 다른 필드를 더 추가할 수도 있지만 다른 Entity와의 묶음을 만드는 것은 좋지 않음
  • EqualsHashCode를 구현할 때 모든 필드를 기본적으로 다 사용함
  • 나중에 Entity 간에 연관관계가 있을 때 상호참조하는 관계가 되면
  • EqualsAndHashCode를 구현한 코드 안에서 서로간의 메소드를 계속 호출하다가 스택오버플로우가 발생할 수도 있음

@Data

  • 모든 애노테이션을 자동으로 설정해주는 @Data라는 애노테이션은 Entity 위에서 사용하는 것을 권장하지 않음
  • @EqualsAndHashCode 를 모든 필드를 다 사용해서 구현하기 때문에 상호참조 때문에 스택오버플로우 문제가 발생할 수 있으므로 권장하지 않음

Event 도메인 구현 로직 작성

1. Event 도메인 코드 작성

package me.freelife.rest.events;

import lombok.*;

import java.time.LocalDateTime;

@Builder @AllArgsConstructor @NoArgsConstructor
@Getter @Setter @EqualsAndHashCode(of = "id")
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; // 이벤트 상태
}

2. EventStatus enum 클래스 작성

package me.freelife.rest.events;

public enum EventStatus {

    DRAFT, PUBLISHED, BEGAN_ENROLLMENT;

}

3. Event 테스트 코드 작성

package me.freelife.rest.events;

import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class EventTest {

    @Test
    public void builder() {
        Event event = Event.builder()
                .description("REST API development with Spring")
                .build();
        assertThat(event).isNotNull();
    }

    @Test
    public void javaBean() {
        // Given
        String name = "Event";
        String description = "Spring";

        // When
        Event event = new Event();
        event.setName(name);
        event.setDescription(description);

        // Then
        assertThat(event.getName()).isEqualTo(name);
        assertThat(event.getDescription()).isEqualTo(description);
    }
}
728x90

댓글

💲 추천 글