Entity 설계 시 고민되는 부분 문의드립니다.(@Setter, @Builder 미사용 시 테스트 등)
토이프로젝트나 회사에서 엔티티 설계 하면서 고민되는 부분이 있어서 문의드립니다.
엔티티에 @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님
명확한 생성자로 한번에 값을 다 입력하는가 아니면, 빌더 같은 것을 통해서 좀 유연하게 입력을 받는가 인데요. 이 부분은 딱 정답이 없고 선택입니다.
따라서 각 선택에 따른 장단점이 있는 것으로 이해하시면 됩니다.
실무에서는 두 가지 방법을 각 상황에 맞추어 모두 사용합니다.
예를 들어서 너무 중요한 엔티티면 번거롭더라도 명확한 생성자를 사용하고, 단순 조회가 목적이거나 생성자가 크게 중요하지 않은 엔티티라면 빌더를 사용하는 것이지요.
감사합니다.
안녕하세요 늦은 나이 늦깎이 개발자 지망생입니다.
0
21
1
질문있습니다.
0
65
1
리뉴얼 시기
0
135
2
변경감지(더티체킹) 이후 플러시할 경우의 쿼리
0
102
1
단일 테이블 시 null 값과 연관관계 필요성 질문
0
93
1
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
125
2
inheritance startegy 선택시 고려사항
0
90
1
Entity 동등성 비교
0
83
1
실무 조언 관련 질문입니다.
0
115
1
H2데이터베이스 파일 생성
0
129
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
1
125
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
106
1
JPQL 메소드와 락
0
108
1
Delivery @OneToOne
0
116
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
190
2
UnsupportedOperationException 발생
0
204
3
H2 Database 연결이 안됩니다.
0
157
2
연관관계 매핑 질문드립니다.
0
151
2
h2데이터베이스 실행오류
0
166
2
persistence.xml
0
206
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
146
1
영속성 컨텍스트
0
122
1
JPA 프록시
0
159
1
Native Query와 MyBatis
0
142
1





