Lombok에서 제공하는 어노테이션으로 빌더 패턴을 자동으로 구현해줌
어떤 필드에 어떤 값이 설정되는지 명확하게 볼 수 있으며 (가독성 좋음)
필드의 순서에 관계없이 객체를 생성 가능
객체 생성 후 내부 상태를 변경할 수가 없기에, 불변 객체를 쉽게 생성할 수 있음
🤔 하지만 상속 관계인 경우 부모 클래스의 필드는 자식 클래스의 빌더에 포함될 수 없음
📝 사용 예시
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BoardDto {
private String boardTitle;
private String boardContent;
}
BoardDto.builder()
.boardTitle("Test 제목")
.boardContent("Test 내용")
.build();
@SuperBuilder란
상속 관계에서 자식 객체가 부모 객체의 필드를 builder 패턴으로 사용할 수 있게 해주는 어노테이션
SuperBuilder 를 사용하기 위해서는 부모와 자식 클래스 모두 어노테이션을 추가해줘야함
📝 사용 예시
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class BoardDto extends BaseDto{
private String boardTitle;
private String boardContent;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class BaseDto {
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
BoardDto.builder()
.boardTitle("Test 제목")
.boardContent("Test 내용")
.createdAt(LocalDateTime.now())
.build()
생성자를 직접 호출하여 객체를 생성하는 방식과는 무슨 차이가 있을까?
BoardDto boardDto = new BoardDto();
boardDto.setBoardTitle("Test 제목");
boardDto.setBoardContent("Test 내용");
객체를 먼저 생성한 이후 각 필드에 대해 set 메소드로 값을 하나씩 설정
객체 생성 후 값을 변경할 수 있는 유연성이 높음
부모 클래스에 setter가 정의되어있다면 자식 클래스에서도 해당 setter로 호출하여 상속받은 필드도 설정 가능
하지만 불변 객체를 만들기 어려우며 (멀티 쓰레드 환경에서 동기화 문제 발생 가능)
코드 가독성이 떨어짐 (setter 호출을 여러번 해야함)
생성자 직접 호출 :
Builder :