자바에서 객체를 생성하고 데이터를 다루는 방식은 크게 Builder 패턴과 **Record(레코드)**로 나뉩니다. 두 기능은 목적과 사용 사례가 다르기 때문에 상황에 맞춰 선택하는 것이 중요합니다.
1. Builder 패턴 (Lombok @Builder)
Builder 패턴은 복잡한 객체를 안전하고 편리하게 생성하기 위해 사용됩니다. 주로 계층이 있고 필드가 많은 클래스에 적합합니다.
특징
- 가독성: 필드가 많을 때 어떤 값이 어떤 필드에 들어가는지 명확히 알 수 있습니다.
- 선택적 매개변수: 모든 필드를 채울 필요 없이 필요한 값만 세팅할 수 있습니다.
- 불변성 유지: 객체 생성 후 값을 바꿀 수 없도록(Setter 없음) 설계하기 좋습니다.
코드 예시
Java
@Builder
@Getter
public class User {
private final String name;
private final int age;
private final String email;
}
// 사용 예시
User user = User.builder()
.name("홍길동")
.age(30)
// email은 생략 가능
.build();
2. Record (자바 14 이상)
Record는 **"순수하게 데이터 전달만을 위한 객체(DTO)"**를 위해 도입된 새로운 클래스 타입입니다.
특징
- 간결함: 클래스 선언 한 줄로 Constructor, Getter, equals, hashCode, toString이 자동 생성됩니다.
- 불변 객체: 모든 필드가 private final로 선언되며, 수정이 불가능합니다.
- 상속 불가: 다른 클래스를 상속받을 수 없습니다. (인터페이스 구현은 가능)
코드 예시
Java
public record UserRecord(String name, int age, String email) {}
// 사용 예시
UserRecord user = new UserRecord("이순신", 40, "lee@test.com");
System.out.println(user.name()); // get이 아닌 필드명으로 호출
3. Builder vs Record 핵심 비교
| 구분 | Builder 패턴 (Lombok) | Record (Java Standard) |
| 주요 목적 | 객체 생성의 편의성 및 가독성 | 데이터 전달용(DTO) 객체의 간결함 |
| 가변성 | 가변/불변 선택 가능 | 무조건 불변 (Immutable) |
| 생성 방식 | 체이닝 방식 (.name().age()) | 생성자 방식 (new Record(...)) |
| 코드 양 | @Builder 등 어노테이션 필요 | 키워드 하나로 모든 메서드 자동 생성 |
| 필드 개수 | 필드가 많을수록 유리함 | 필드가 많으면 생성자 파라미터가 길어짐 |
4. 언제 무엇을 써야 할까요?
Builder를 써야 할 때
- 생성자 파라미터가 5개 이상으로 많을 때
- 객체 생성 시 필수 값과 선택 값이 나뉘어 있을 때
- 이미 정의된 클래스(Entity 등)를 불변으로 만들고 싶을 때
Record를 써야 할 때
- API 응답/요청을 위한 DTO를 만들 때
- 단순히 데이터를 담아서 전달하는 목적일 때
- 자바 표준 기능만 사용하여 코드를 간결하게 유지하고 싶을 때
💡 꿀팁: Record와 Builder 함께 쓰기
최근에는 Record에 @Builder를 붙여서 사용하는 방식이 가장 인기가 많습니다. Record의 간결함과 Builder의 생성 편의성을 모두 챙길 수 있기 때문입니다.
Java
@Builder
public record UserDto(String name, int age, String email) {}
// 사용 시
UserDto dto = UserDto.builder().name("김철수").build();
'IT > 프로그래밍' 카테고리의 다른 글
| Filter ,Interceptor , AOP (0) | 2026.03.28 |
|---|---|
| [JPA/Hibernate] IN 절 파라미터 패딩(Parameter Padding) (0) | 2026.02.06 |
| @Transactional의 동작 (0) | 2025.12.13 |
| 상태 변수 이름 state, status 차이 (0) | 2025.10.23 |
| Offset Pagination과 Cursor Pagination (0) | 2024.03.27 |