나만의 개발 로그 | 고민 로그
Lombok @NoArgsConstructor(force = true) 본문
1. Lombok @NoArgsConstructor(force = true)
1-1. 왜 필요한가?
- JPA, 직렬화, 프레임워크 프록시 등은 기본 생성자가 반드시 있어야 객체를 만들 수 있다.
- 하지만 final 필드가 있으면 Lombok이 기본 생성자를 자동 생성하지 못한다.
- force = true 옵션을 주면 Lombok이 final 필드에도 임시 디폴트 값(0/false/null)을 강제로 넣어 주면서 기본 생성자를 만들어 준다.
1-2. 예시 : JPA 엔티티
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
public class ImageMeta {
@Id
@GeneratedValue
private Long id;
private final String fileName;
private final long size;
// 비즈니스용 생성자
public ImageMeta(String fileName, long size) {
this.fileName = fileName; this.size = size;
}
}
| 상황 | 동작 |
| 애플리케이션 코드 → new ImageMeta("logo.png", 2048) | 정상 생성, final 값 유지 |
| JPA 프록시/리플렉션 → new ImageMeta() | Lombok이 생성한 숨은 기본 생성자 호출 → fileName=null, size=0 으로 임시 세팅 |
⚠️ 주의
강제로 들어간 null/0 값은 비즈니스 로직에서 사용하지 않도록 보호 로직(Assert) 또는 후속 초기화 코드가 필요
'웹 개발' 카테고리의 다른 글
| JPA 기본 (0) | 2023.04.06 |
|---|---|
| Postman 테스트? NO! 테스트 코드를 활용하자! (0) | 2023.02.17 |
| Lombok + Jackson 사용 시 boolean 필드 네이밍 주의(isIsActive...!?) (0) | 2023.02.15 |
| 왜 JPA에서 @DynamicInsert를 쓰면 Statement 캐싱 효율이 떨어질까? (0) | 2023.02.10 |
| 배열 <깊은 복사, 얕은 복사> (0) | 2023.01.13 |
Comments