@RequiredArgsConstructor와 @Builder와의 차이
2025. 4. 22. 22:35ㆍBack-End/JAVA
반응형
@RequiredArgsConstructor와 자주 비교되는 롬복 어노테이션 중 하나가 바로 @Builder다.
두 어노테이션 모두 객체 생성을 도와주지만, 쓰임새와 철학이 조금 다르다.
1. @Builder: 복잡한 객체 생성을 유연하게
@Builder
public class ArticleResponse {
private Long articleId;
private String title;
private String content;
private LocalDateTime createdAt;
}
이렇게 선언하면 다음과 같이 객체를 만들 수 있다.
ArticleResponse res = ArticleResponse.builder()
.articleId(1L)
.title("제목")
.content("내용")
.createdAt(LocalDateTime.now())
.build();
- 필드가 많거나 선택적일 때 유용하다.
- 파라미터 순서에 의존하지 않고, 가독성이 좋다.
- DTO나 응답 객체 등에 자주 쓰인다.
2. @RequiredArgsConstructor: 의존성을 명확하게 주입
@RequiredArgsConstructor
public class ArticleService {
private final ArticleRepository repository;
}
- 필수 의존성을 명확하게 드러낼 수 있다.
- 스프링의 의존성 주입 구조와도 잘 맞는다.
- 보통 Service, Component, Configuration 같은 "주체 객체"에 자주 쓰인다.
🧠 두 어노테이션의 핵심 차이
항목 | @Builder | @RequiredArgsConstructor |
목적 | 값 조합이 유연한 객체 생성 | 의존성 명시를 통한 안전한 생성 |
사용 위치 | DTO, 응답 객체 | 서비스, 컴포넌트, 설정 객체 |
생성 방식 | .builder().xxx().build() | new 혹은 스프링 DI |
선택적 필드 | 매우 유리 | 불가능 (필수만 생성자에 포함) |
@Component와 함께 쓰는 방식
Spring에서는 클래스를 빈(bean)으로 등록하기 위해 @Component, @Service, @Repository 등을 사용한다.
이때 @RequiredArgsConstructor를 함께 사용하면, 의존성을 생성자 주입 방식으로 자동 연결할 수 있다.
@Component
@RequiredArgsConstructor
public class FileWatchWorker {
private final LogicService logicService;
private final PathRepository pathRepository;
}
이 구조의 장점
- 생성자 주입 방식으로 불변성 보장
- 테스트 코드 작성 시에도 의존성 주입이 명확하고 유연
- 의존성이 변경되면 컴파일 타임에 오류가 발생해, 유지보수가 쉬움
반응형
'Back-End > JAVA' 카테고리의 다른 글
Java record 간결하고 안전한 데이터 구조 (0) | 2025.05.02 |
---|---|
final 필드와 @RequiredArgsConstructor는 왜 같이 쓰는가? (0) | 2025.04.22 |
자바 enum, 상수가 전부가 아니었다 (0) | 2025.04.17 |
Runnable이란? 비동기 워커 설계에서 마주친 첫 스레드 인터페이스 (0) | 2025.03.23 |
메서드 참조 :: (0) | 2024.11.22 |