해결된 질문
작성
·
791
·
수정됨
3
토이프로젝트나 회사에서 엔티티 설계 하면서 고민되는 부분이 있어서 문의드립니다.
엔티티에 @Setter 나 @Setter 가 포함된 @Data 애노테이션을 추가하지 않는 것이 좋다고 강의에서 들어서 설계 시 해당 부분을 제외하고 있습니다.
@Entity
@Getter
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "book")
public class Book extends BaseDateEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "book_id", updatable = false)
private Long id;
@Column(name = "title", length = 200, nullable = false)
private String title;
@Column(name = "author")
private String author;
@Column(name = "price")
private int price;
@Column(name = "publisher")
private String publisher;
@Column(name = "publish_at")
private LocalDate publishAt;
@Column(name = "isbn", nullable = false)
private String isbn;
@Column(name = "sort", nullable = false)
private String sort;
@Column(name = "image", columnDefinition = "TEXT")
private String image;
@Column(name = "link", columnDefinition = "TEXT")
private String link;
}
@Builder는 엔티티 클래스에 붙이고 있는데, 이렇게 되면 사실 점층적 생성자가 있는것과 다를바 없이 객체를 생성할 수 있기 때문에 좋은 방법이 아닌거 같아 문의드립니다.
실무에서는 보통 어떤 식으로 사용하시는지 궁금하여 문의드립니다.
별도의 of, create 메서드를 static으로 만들어서 생성하기도 하는데요. 이렇게 되면 테스트 코드 작업 시 @BeforeEach로 초기 데이터를 추가하기 쉽지 않더라고요. 어느정도 수준으로 실무에서 사용하는 것이 적절할지 궁금합니다.
public static Reservation create(String userName, String phoneNumber, Performance performance, PerformanceSeat performanceSeat) {
return Reservation.builder()
.userName(userName)
.phoneNumber(phoneNumber)
.title(performance.getTitle())
.round(performance.getRound())
.amount(performance.getPrice())
.status(ReservationStatus.APPLY)
.performance(performance)
.performanceSeat(performanceSeat)
.build();
}
[문의 내용 정리]
Q1) JPA Entity 클래스에 @Builder 애노테이션을 추가하는 것은 좋지 않은 방식일까요? 그렇다면 어떻게 사용하는것이 적절할까요?
Q2) @Builder 패턴, 기본 생성자, setter 제외한 경우 테스트 코드에서 @BeforeEach로 초기 데이터를 추가 시 어떻게 하는 것이 좋을까요?
답변 1
3
안녕하세요. wony님
명확한 생성자로 한번에 값을 다 입력하는가 아니면, 빌더 같은 것을 통해서 좀 유연하게 입력을 받는가 인데요. 이 부분은 딱 정답이 없고 선택입니다.
따라서 각 선택에 따른 장단점이 있는 것으로 이해하시면 됩니다.
실무에서는 두 가지 방법을 각 상황에 맞추어 모두 사용합니다.
예를 들어서 너무 중요한 엔티티면 번거롭더라도 명확한 생성자를 사용하고, 단순 조회가 목적이거나 생성자가 크게 중요하지 않은 엔티티라면 빌더를 사용하는 것이지요.
감사합니다.
감사합니다!
제가 기준을 가지고 엔티티를 어떻게 설계하는 지에 따라 다르겠네요.
다시 한번 설계 시 고민해보겠습니다.
좋은 강의 다시 한번 감사합니다!