@NoArgsConstructor(access = AccessLevel.PROTECTED) 사용하기

SIHA·2025년 8월 6일

@NoArgsConstructor

@NoArgsConstructor는 Lombok에서 제공하는 어노테이션으로 기본 생성자(파라미터가 없는 생성자)를 자동으로 생성해준다.

@NoArgsConstructor
public class User {
    // public User() {} 와 동일한 기본 생성자 생성
}

하지만 다음의 경우에는 컴파일러가 기본 생성자를 자동으로 생성하지 않으므로 @NoArgsConstructor를 반드시 명시적으로 붙여줘야 한다.

  • @Builder를 사용하는 경우
  • 다른 생성자를 명시적으로 선언한 경우

@NoArgsConstructor(access = AccessLevel.PROTECTED)

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 필수)
profile
뭐라도 해보자

0개의 댓글