@NoArgsConstructor의 AccessLevel 역할과 종류

LeeYulhee·2024년 7월 14일

👉 @NoArgsConstructor 이란?


  • 명시적으로 생성자를 작성하지 않아도 자동으로 기본 생성자를 생성
  • 기본 생성자 예시
    // @NoArgsConstructor 사용
    
    @NoArgsConstructor
    public class Example {
        private int number;
        private String message;
    }
    // @NoArgsConstructor가 만드는 생성자 형태
    
    public Example() {
        super(); // 부모 클래스의 생성자를 호출
        // 생성자 내에서 추가적인 초기화 코드를 실행할 수 있지만, 기본적으로는 비어있음
    }
    


👉 AccessLevel 이란?


  • Lombok에서 제공하는 열거형(enum)이며, 기본 생성자의 접근 수준을 설정할 수 있음
  • 기본적으로 AccessLevel 미사용 시, public으로 생성
  • AccessLevel을 통해 클래스의 인스턴스화를 제어하고, 객체 생성을 제한하거나 특정 클래스 설계 의도를 명확히 표현할 수 있음
    • ⇒ 캡슐화를 강화하는 데 도움



👉 AccessLevel 종류


  • PUBLIC
    @NoArgsConstructor(access = AccessLevel.PUBLIC)
    public class Example {}
    • 생성자를 public으로 설정
    • 어느 클래스에서나 접근 가능

  • PROTECTED
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    public class Example {}
    • 생성자를 protected로 설정
    • 동일 패키지의 클래스와 하위 클래스에서만 접근 가능

  • PACKAGE
    @NoArgsConstructor(access = AccessLevel.PACKAGE)
    public class Example {}
    • 생성자를 패키지 접근(접근제어자 중 default랑 같음)으로 설정
    • 같은 패키지 내의 클래스에서만 접근 가능

  • PRIVATE
    @NoArgsConstructor(access = AccessLevel.PRIVATE)
    public class Example {}
    • 생성자를 private으로 설정
    • 해당 클래스 내에서만 사용 가능

  • NONE
    @NoArgsConstructor(access = AccessLevel.NONE)
    public class Example {}
    • 생성자를 생성하지 않음



👉 Entity에서 @NoArgsConstructor(access = AccessLevel.PROTECTED) 를 사용하는 이유


  • 엔티티와 프록시 객체
    • 엔티티는 데이터베이스의 테이블을 Java 클래스로 표현한 것
    • 필요에 따라 데이터베이스에서 엔티티 정보를 즉시 모두 로드하는 것이 아니라, 필요할 때 가져오도록 설정할 수 있음
    • ⇒ 지연 로딩

  • 지연 로딩과 프록시 객체의 역할
    • 지연 로딩을 구현할 때, JPA는 엔티티 대신 프록시 객체를 사용
      • 지연 로딩 : 데이터베이스와 같은 비용이 많이 드는 리소스에서 데이터를 요청할 때, 실제로 데이터가 필요할 때까지 데이터 로드를 지연시키는 방식
      • 프록시 객체 : 원본 객체를 대신하여 다른 객체와의 상호 작용을 관리하는 객체
    • 이 프록시 객체는 실제 엔티티의 데이터를 처음으로 접근할 때까지 데이터를 로드하지 않음
    • 프록시 객체는 실제 엔티티와 같은 인터페이스를 가지며, 데이터에 접근하는 순간 실제 데이터베이스에서 데이터를 로드하는 역할

  • 기본 생성자의 역할
    • 프록시 객체를 사용하기 위해서 JPA 구현체(Hibernate 등)는 엔티티의 기본 생성자를 호출하여 프록시 객체를 생성
    • 만약 엔티티의 기본 생성자가 private으로 설정되어 있다면, 프록시 객체를 생성할 수 없게 됨
      • ⇒ 이는 JPA 구현체가 엔티티 클래스 외부에서 접근할 수 없기 때문
    • JPA 구현체 Hibernate 같은 경우, 엔티티 클래스와 같은 패키지 내에 있지 않아도 protected 생성자에 접근할 수 있음
      • Java 리플렉션 API를 사용하여 구현되기 때문
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글