@RequiredArgsConstructor와 @Builder와의 차이

2025. 4. 22. 22:35Back-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;
}

이 구조의 장점

  • 생성자 주입 방식으로 불변성 보장
  • 테스트 코드 작성 시에도 의존성 주입이 명확하고 유연
  • 의존성이 변경되면 컴파일 타임에 오류가 발생해, 유지보수가 쉬움
반응형