아카이브

[스프링 기반 REST API 개발] Event 도메인 구현 본문

Spring/스프링 기반 REST API 개발

[스프링 기반 REST API 개발] Event 도메인 구현

주멘이 2021. 1. 5. 22:34
package me.jumen.demoinflearnrestapi.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 = EventStatus.DRAFT;


}

1.  왜 @EqualsAndHasCode에서 of를 사용하는가

- 복잡한 양방향 연관관계일 경우 ToString을 호출하면 무한루프가 발생할 수 있다.

- 모든 필드를 사용해서 equals(), hashCode()를 구현하기 때문에, 양방향 연관관계일 경우 무한루프가 발생할 수 있다.

2.  왜 @Builder를 사용할 때 @AllArgsConstructor가 필요한가

- 클래스에 @Builder 어노테이션을 사용하면 전체 파라미터를 갖는 생성자를 자동으로 만들어 준다.

- 클래스에 사용하는 경우, default 생성자로 생성이 되어 다른 패키지에서 이를 사용하기 곤란하다.

- @AllArgsConstructor는 모든 필드에 대해서 파라미터를 받는 생성자를 만들어 낸다. 예를 들어, id의 경우 auto_increment에 의존하고 있을 때 어노테이션을 통해 id를 넘겨받을 수 있기 때문에 문제가 발생할 수 있다.

- 되도록이면 조건에 따라 파라미터를 받는 생성자를 생성하고 @Builder를 이곳에 붙이는 것이 바람직하다.

public class Member {
    @Builder
    public Member(String email, String name) {
        this.email = email;
        this.name = name;
    }
}

3. @Data를 쓰지 않는 이유

- 복잡한 양방향 연관관계일 경우 ToString을 호출하면 무한루프가 발생할 수 있다.

- @Data는 모든 어노테이션을 자동으로 설정해 주는 것(@ToString 포함)

- 한쪽 객체에서 다른 쪽 객체에 대해 @ToString(excluded={“propertyName”}) 형태로 제외토록 만들어야 한다.