REST API 및 프로젝트 소개

  • REST 란? 이라는 질문을 굉장히 어디서 많이 듣기도 하고 보기도 한다.
    • 사실 해당 질문을 받았을 때, 굉장히 어물쩡하게 넘어간 적이 많다. 그냥 위키에 나와있는대로 아키텍쳐 스타일이라는 정도로만 이해하고 있었기 때문에 해당 질문에 대한 개념적인거나 REST의 존재 의의나 목적에 대한 이해는 하지 못했기 때문이다.
    • 백기선님이 강의내에서 언급하고 정리해서 알려주시긴 하지만, 직접 해당 스피치의 링크르 따라 들어가 내용을 정리해 보았다.
    • DEVIEW 스피치
    • 정리글

1. Project 생성

  • 프로젝트 생성시에, Self-descriptive Message를 달성하기 위한 Spring REST Docs 의존성과 HATEOAS를 달성하기 위한 Spring HATEOAS 의존성을 추가해 주었다.
  • HTTP 통신 테스트를 위해 Postman 혹은 Chrome 플러그인인 Tanlend API를 사용한다.

2. Domain 생성하기

Event 도메인

Event라는 도메인, EventStatus라는 Enum을 생성했다.

public enum EventStatus {

    DRAFT, PUBLISHED, BEGAN_ENROLLMENT;

}
@Entity
@Getter @Setter @Builder @AllArgsConstructor @NoArgsConstructor
@EqualsAndHashCode(of = "id")
public class Event {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long 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;
    
    @Enumerated(EnumType.STRING)
    private EventStatus eventStatus = EventStatus.DRAFT;
}

  • @EqualsAndHashCode에서 of를 사용하는 이유
    • @EqualsAndHashCode가 모든 필드를 기본적으로 참조하는데, 엔티티 연관관계가 묶여있는 필드가 들어가게 되면 스택오버플로우 발생한다.
  • @Data를 사용하지 않는 이유
    • @EqualsAndHashCode가 기본적으로 적용되기 때문
  • Lombok은 메타 어노테이션으로 동작하지 않아서 커스텀으로 줄일 수 없다.

테스트 코드


@Test
public void builder() throws Exception {
    Event event = Event.builder()
            .name("inflearn")
            .description("REST API")
            .build();

    assertThat(event).isNotNull();
}

@Test
public void javaBeanRule() throws Exception {
    Event event = new Event();
    event.setName("dboo");
    assertNotNull(event);
    assertThat(event.getName()).isEqualTo("dboo");
}

assertJ에서 제공하는 asssertThat을 이용했다. 테스트 내용은 객체생성이 잘 되는지, Setter,Getter가 잘 동작하는지 이다.

3. 이벤트 비즈니스 로직

  • basePrice와 maxPrice에 대한 조건은 아래와 같다.
basePrice maxPrice 상황
0 0 무료 이벤트
0 100 선착순 등록
100 0 무제한 경매
100 200 제한가 선착순 등록