@Builder
는 Lombok에서 제공하는 어노테이션으로, 객체 생성 시 생성자 또는 메서드에 직접 값을 하나씩 넣지 않고, 가독성 좋고 유연한 방식으로 객체를 생성할 수 있도록 도와준다. 특히 파라미터가 많은 객체를 생성할 때 매우 유용하다.
✅ 기본 개념
@Builder
public class User {
private String name;
private int age;
private String email;
}
위와 같이 @Builder
를 붙이면, 다음과 같은 방식으로 객체를 만들 수 있다
User user = User.builder()
.name("AA")
.age(27)
.email("aa@example.com")
.build();
✅ 동작 원리
@Builder
는 내부적으로 다음과 같은 Builder 패턴을 자동 생성한다
public class User {
private String name;
private int age;
private String email;
public static class UserBuilder {
private String name;
private int age;
private String email;
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder email(String email) {
this.email = email;
return this;
}
public User build() {
return new User(name, age, email);
}
}
public static UserBuilder builder() {
return new UserBuilder();
}
}
✅ 생성자, 메서드에 적용 가능
1. 생성자에 적용
public class Post {
private final String title;
private final String content;
@Builder
public Post(String title, String content) {
this.title = title;
this.content = content;
}
}
2. 메서드에 적용
public class QueryParams {
private String keyword;
private int page;
@Builder
public static QueryParams of(String keyword, int page) {
QueryParams qp = new QueryParams();
qp.keyword = keyword;
qp.page = page;
return qp;
}
}
✅ 장점
- 파라미터가 많을 때 순서를 기억하지 않아도 됨
- 선택적 파라미터 설정 가능 (null 방지)
- 코드 가독성 향상
- 불변 객체 생성에 유리함 (final + builder)
✅ 주의 사항
- 기본 생성자
@NoArgsConstructor
와 함께 사용하면 충돌할 수 있음 - 필드가 많을 경우, 클래스 크기가 커질 수 있음
- Lombok이 없는 환경에서는 작동하지 않음 (ex. Kotlin, 일부 IDE 설정)
✅ 그 밖의 사항
1. DTO, 응답 객체에 자주 사용
2. 테스트 코드 작성 시 객체 셋업에 용이
3. Controller → Service → Entity 변환 시 각 계층마다 @Builder
조합으로 유연하게 대응 가능
✅ 결론
@Builder
는 코드의 가독성과 유지보수성을 크게 높여주는 강력한 도구이다. 적절히 활용하면 객체 생성 로직을 깔끔하게 정리할 수 있다. 하지만 남용보다는 필요한 곳에 선별적으로 사용하는 것이 좋다.
@Builder
는 특히 Spring 프로젝트에서 DTO나 Entity, Response 객체를 생성할 때 자주 사용되며, 가독성과 생산성을 동시에 향상시켜준다. 프로젝트 초반부터 일관되게 사용하는 습관을 들이면 유지보수가 훨씬 편해진다
'백엔드 부트캠프 > TIL' 카테고리의 다른 글
[내일배움캠프Spring-41일차] 오버헤드란? (2) | 2025.04.15 |
---|---|
[내일배움캠프Spring-40일차] 객체지향 (0) | 2025.04.14 |
[내일배움캠프Spring-38일차] JWT (0) | 2025.04.10 |
[내일배움캠프Spring-37일차] 클린아키텍처 (1) | 2025.04.09 |
[내일배움캠프Spring-36일차] Race Condition (경쟁 조건) 정리 (0) | 2025.04.08 |