[Spring] @Builder, @SuperBuilder

고병갑·2025년 2월 10일
post-thumbnail

@Builder란?

Lombok에서 제공하는 어노테이션으로 빌더 패턴을 자동으로 구현해줌
어떤 필드에 어떤 값이 설정되는지 명확하게 볼 수 있으며 (가독성 좋음)
필드의 순서에 관계없이 객체를 생성 가능
객체 생성 후 내부 상태를 변경할 수가 없기에, 불변 객체를 쉽게 생성할 수 있음

🤔 하지만 상속 관계인 경우 부모 클래스의 필드는 자식 클래스의 빌더에 포함될 수 없음

📝 사용 예시

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BoardDto {
	private String boardTitle;
	private String boardContent;
}


BoardDto.builder()
		.boardTitle("Test 제목")
		.boardContent("Test 내용")
		.build();

@SuperBuilder란?

@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 :

  • 가독성 높음
  • 불변 객체 생성 가능
  • 필드 수정 어려움
  • 변경이 필요 없는 불변 객체 생성할 때 추천
profile
노력 naver 배신🔥

0개의 댓글