@NoArgsConstructor는 Lombok에서 제공하는 어노테이션으로 기본 생성자(파라미터가 없는 생성자)를 자동으로 생성해준다.
@NoArgsConstructor
public class User {
// public User() {} 와 동일한 기본 생성자 생성
}
하지만 다음의 경우에는 컴파일러가 기본 생성자를 자동으로 생성하지 않으므로 @NoArgsConstructor를 반드시 명시적으로 붙여줘야 한다.
@Builder를 사용하는 경우JPA와 함께 사용할 때 : @NoArgsConstructor(access = AccessLevel.PROTECTED)
기본 생성자를 만들되, 접근 제어를 제한함
JPA에서는 프록시기술 등을 위해 기본 생성자가 필수이다. 하지만 외부에서 이 기본 생성자를 통해 객체를 직접 생성하는 것을 방지하고 싶을 때는 접근 제어자를 PROTECTED로 설정한다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
이렇게 하면 JPA는 내부적으로 객체를 생성할 수 있지만, 외부에서는 new User()와 같은 호출을 막을 수 있어 불변 객체나 빌더 패턴과 병행하여 사용할 때 안전하다.
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Builder
public class User extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
private String password;
private String nickname;
}
@Entity: JPA 엔티티로 선언@NoArgsConstructor(access = AccessLevel.PROTECTED): 외부 생성을 막으면서 JPA에서 사용할 수 있도록 기본 생성자 제공@Builder: 생성자 대신 빌더 패턴으로 객체 생성@AllArgsConstructor: 모든 필드를 받는 생성자| 상황 | 설명 |
|---|---|
| 기본 생성자가 필요 없는 경우 | @NoArgsConstructor 생략 가능 |
| JPA 엔티티인 경우 | @NoArgsConstructor(access = AccessLevel.PROTECTED) 필수 |
@Builder사용하는 경우 | 기본 생성자 따로 만들어야 함(@NoArgsConstructor 필수) |