@Builder
@Data
public class MilestoneResponse {
private final Long id;
private final String title;
private final String description;
private final String completionDate;
}
from. 리뷰어 왕민
dto 클래스에 builder 패턴은 오버스펙으로 보입니다.
빌더패턴 사용 이유에 대해서 알아봅시다 :)
@Data
Getter, Setter, RequiredArgsConstructor, ToString, EqualsAndHashCode, Value
😶 @Data ➜ @Getter, @RequiredArgsConstructor
@RequiredArgsConstructor
@Getter
public class MilestoneResponse {
private final Long id;
private final String title;
private final String description;
private final String completionDate;
}
dto
패키지를 별도로 둬서 작업하고 있었다.from. 리뷰어 왕민
toDto 메소드에서는 엔티티가 dto클래스를 알고있어야 하네요.
dto는 도메인 객체에서 알고 있을 필요는 없다고 생각합니다.
현재 구조는 dto 클래스 변경이 있을 경우 entity객체도 변경이 필요하죠.
domain.toDto가 아닌 dto.from(entity)같은 형식으로 도메인 객체에서 dto 의존성을 제거하는건 어떨까요?
@Entity
public class Milestone {
MilestoneResponse toDto() {
return MilestoneResponse.builder()
.id(this.milestoneId)
.title(this.milestoneTitle)
.description(this.description)
.completionDate(this.completionDate.toString())
.build();
}
}
@Getter
@Builder(access = AccessLevel.PRIVATE)
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class MilestoneResponse {
private final Long id;
private final String title;
private final String description;
private final String completionDate;
}
public static MilestoneResponse from(Milestone milestone) {
return MilestoneResponse.builder()
.id(milestone.getId())
.title(milestone.getTitle())
.description(milestone.getDescription())
.completionDate(milestone.getCompletionDate())
.build();
}
If a certain field/parameter is never set during a build session, then it always gets 0 / null / false.
@Builder.Default - @Builder 사용하면서 필드별로 기본값으로 초기화 시킬 수 있다.
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Pojo {
@Builder.Default
private String name = "짱구엄마";
private String nickname;
private List<PojoTwo> pojoTwos = new ArrayList<PojoTwo>();
}
public static void main(String[] args) {
Pojo pojo = Pojo.builder().nickname("짱구친구").build();
System.out.println(pojo.toString());
Pojo pojo1 = new Pojo();
System.out.println(pojo1.toString());
}
Pojo(name=짱구엄마, nickname=짱구친구, pojoTwos=null)
Pojo(name=짱구엄마, nickname=null, pojoTwos=[])
@Builder(toBuilder = true)
public class Pojo {
private String name = "foo";
private boolean original = true;
}
1. 필요한 데이터만 설정할 수 있음
4. 불변성을 확보할 수 있음
0 / null / false
👍 refernce