![[JPA] @Builder.Default](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCobk0%2FbtsM6iG3kXO%2FSxKFjCenvMLgkUsT81OXq0%2Fimg.png)
[JPA] @Builder.DefaultBack-End/JPA2025. 4. 4. 00:27
Table of Contents
@Builder.Default는 Lombok의 @Builder와 함께 사용할 때, 기본값이 무시되지 않도록 유지시켜주는 어노테이션이다.
일반적으로 @Builder를 사용하면, 필드에 직접 초기화한 값이 무시된다.
@Builder
public class Product {
private String name;
private int price = 1000;
}
위와 같이 price = 1000을 설정했더라도, Product.builder().build()를 실행하면 price는 0이 된다.
즉, 기본값 1000이 무시되는 것.
해결 방법
@Builder
public class Product {
private String name;
@Builder.Default
private int price = 1000;
}
이렇게 하면 Product.builder().build()를 했을 때, price 값이 명시적으로 지정되지 않으면 1000이 자동으로 설정된다.
어떻게 동작하나?
Lombok은 내부적으로 @Builder.Default가 붙은 필드를 빌더 내부에서 null 체크를 통해 기본값 유지하는 코드로 바꿔준다.
@Builder
public class User {
private String username;
@Builder.Default
private boolean active = true;
@Builder.Default
private List<String> roles = new ArrayList<>();
}
- User.builder().username("abc").build() → active == true, roles == []로 자동 설정됨
생성자 위에 @Builder를 붙이면 @Builder.Default는 필요 없다.
왜냐하면 생성자 기반 빌더는 필드 초기값이 아니라, 생성자 파라미터로 모든 값을 설정하기 때문이다.
즉, 초기값이 아예 사용되지 않기 때문에, @Builder.Default는 무의미하다.
public class Product { private String name; private int price = 1000; @Builder public Product(String name, int price) { this.name = name; this.price = price; } }
'Back-End > JPA' 카테고리의 다른 글
[JPA] 엔티티 클래스에서 @Builder 위치 (0) | 2025.04.03 |
---|---|
[JPA] 엔티티 공통 필드 상속(@MappedSuperclass) (0) | 2025.04.03 |
[JPA]PostgreSQL 사용시, 엔티티에 Enum 매핑 오류 (0) | 2024.11.21 |
[Spring Data JPA] Projections 과 Native Query (0) | 2024.08.16 |
[Spring Data JPA] 새로운 엔티티인지 구별하는 방법 (0) | 2024.08.15 |