
.Builder의 의미
.builder()는 주로 빌더 패턴을 사용하는 클래스에서 객체를 생성하는 메서드다. 이 메서드는 빌더 객체를 사용하여 설정된 필드 값을 기반으로 최종 객체를 생성하고 반환한다.
빌더 패턴
빌더 패턴은 복잡한 객체를 생성할 때 유용한 디자인 패턴으로, 객체의 생성 과정을 단계적으로 구성할 수 있게 해준다. 이 패턴은 다음과 같은 장점을 제공한다
- 가독성 향상: 객체의 필드를 명시적으로 설정할 수 있어, 어떤 값이 어떤 필드에 할당되는지 쉽게 이해할 수 있다.
2. 유연한 객체 생성: 필요한 필드만 설정할 수 있어, 선택적 필드를 쉽게 처리할 수 있다.
- 불변 객체 생성: 필드를 final 선언하고, 생성자에서만 값을 설정하여 객체의 상태를 변경할 수 없도록 할 수 있다.
예시
@Getter
@Setter
@Builder
public class QuestionDto {
private Long id;
private String subject;
private String content;
private String author;
private Status status;
public static QuestionDto from(Long id, String subject, String content, String author, Status status) {
return QuestionDto.builder()
.id(id)
.subject(subject)
.content(content)
.author(author)
.status(status)
.build(); // 최종 객체 생성
}
}
동작 방식
- 빌더 객체 생성: QuestionDto.builder()를 호출하면 QuestionDtoBuilder라는 빌더 객체가 생성됨.
- 필드 설정: .id(id), .subject(subject), .content(content), .author(author), .status(status) 메서드를 통해 각 필드에 값을 설정/
- 최종 객체 생성: .build() 메서드를 호출하면, 설정된 필드 값을 기반으로 QuestionDto 객체가 생성되어 반환.
결론
.build()는 빌더 패턴을 사용하여 최종 객체를 생성하는 메서드이다. 이 메서드는 설정된 필드 값을 기반으로 객체를 생성하고, 가독성과 유연성을 높이는 데 기여한다. 빌더 패턴을 사용하면 복잡한 객체를 쉽게 생성할 수 있으며, 선택적 필드와 불변성을 관리하는 데 유용하다.
장단점 비교: 빌더 패턴 vs. 전통적인 생성자 사용
아래에서는 빌더 패턴을 사용하는 것과 전통적인 생성자 방식을 사용하는 것의 장단점을 비교하여 설명한다.
[1. 빌더 패턴]
장점
- 가독성 향상:
각 필드를 명확하게 설정할 수 있어, 어떤 값이 어떤 필드에 할당되는지 쉽게 이해할 수 있다.
예시:
QuestionDto questionDto = QuestionDto.builder() .id(1L) .subject("Spring Boot 질문") .content("DTO와 Entity의 차이점은 무엇인가요?") .author("홍길동") .status(Status.NEW) .build();
- 선택적 필드 처리:
- 필요한 필드만 설정할 수 있어, 모든 필드를 제공할 필요가 없습니다. 이는 객체 생성 시 유연성을 높인다.
- 불변 객체 생성:
- 필드를 final로 선언하고, 생성자에서만 값을 설정하여 객체의 상태를 변경할 수 없도록 할 수 있다. 이는 멀티스레드 환경에서 안전성을 높인다.
- 복잡한 객체 생성 로직:
- 객체 생성 시 복잡한 로직이 필요한 경우, 메서드를 체이닝하여 설정할 수 있다. 이는 코드의 가독성을 높이고, 객체 생성 로직을 명확하게 표현할 수 있다.
단점
- 추가적인 코드:
- 빌더 패턴을 사용하면 추가적인 코드가 필요하다. 예를 들어, 빌더 클래스를 생성해야 하므로 코드가 다소 길어질 수 있다.
- Lombok 의존성:
- Lombok 라이브러리를 사용해야 하므로, 해당 라이브러리에 대한 의존성이 생긴다. 이는 프로젝트의 복잡성을 증가시킬 수 있다.
[2. 전통적인 생성자 사용]
장점
- 간단한 구현:
간단한 객체를 생성할 때는 생성자를 사용하는 것이 더 직관적이고 간단할 수 있다. 추가적인 코드가 필요하지 않다.
예시:
QuestionDto questionDto = new QuestionDto(1L, "Spring Boot 질문", "DTO와 Entity의 차이점은 무엇인가요?", "홍길동", Status.NEW);
- 의존성 없음:
- 외부 라이브러리(예: Lombok)에 의존하지 않으므로, 프로젝트의 복잡성을 줄일 수 있다.
단점
- 가독성 저하:
- 생성자의 매개변수가 많아지면 어떤 값이 어떤 필드에 할당되는지 이해하기 어려워질 수 있다. 특히 필드가 많거나 선택적 필드가 있는 경우 가독성이 떨어진다.
- 모든 필드 제공 필요:
- 모든 필드를 매개변수로 제공해야 하므로, 선택적 필드가 있을 경우 불필요한 값을 전달해야 할 수 있다.
- 불변성 유지 어려움:
- 객체의 상태를 변경할 수 있는 setter 메서드가 존재하므로, 불변 객체를 만들기 어렵다.
- 복잡한 초기화 로직:
- 객체 생성 시 복잡한 로직이 필요한 경우, 생성자에서 모든 로직을 처리해야 하므로 코드가 복잡해질 수 있다.
결론
빌더 패턴은 가독성을 높이고, 선택적 필드를 유연하게 처리하며, 불변 객체를 쉽게 만들 수 있도록 도와준다. 특히 필드가 많거나 선택적 필드가 있는 경우에 유용하다.
전통적인 생성자 사용은 간단한 객체를 생성할 때 직관적이고 간단하지만, 가독성이 떨어지고 선택적 필드를 처리하기 어려운 단점이 있다.
따라서, 객체의 복잡성과 요구 사항에 따라 적절한 방법을 선택하는 것이 중요하다.
'개발' 카테고리의 다른 글
테스트 코드의 중요성? (SpringBoot 기반 Mocking 학습) (0) | 2025.03.21 |
---|---|
Kafka+Docker 기반 SpringBoot 프로젝트 구축 방법 (0) | 2025.03.20 |
Spring Boot에 Mysql Docker 연결 (0) | 2024.05.14 |
Selenium (0) | 2024.05.13 |
BeautifulSoup (0) | 2024.05.13 |
IT/보안