[Spring/TIL] JPA Entity Class에서 @NoArgsConstructor(access = AccessLevel.PROTECTED) 왜 사용할까?

Marryakirise·2024년 1월 8일
0

Spring/TIL

목록 보기
1/5

✨ Chapter 0.

@NoArgsConstructor vs @AllArgsConstructor vs @RequiredArgsConstructor

1. @NoArgsConstructor: 파라미터가 없는 기본 생성자를 생성

2. @AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 생성

3. @RequiredArgsConstructor : final이나 @Nonnull인 필드 값만 파라미터로 받는 생성자를 생성
	- @Nonull : 데이터 값이 NULL이면 에러 반환

✨ Chapter 1.

JPA Entity Class에 @NoArgsConstructor가 필요한 이유

  • JPA는 DB 값을 객체 필드에 주입할 때 기본 생성자로 객체를 생성한 후 Reflection API를 사용하여 값을 매핑
  • 기본 생성자가 없다면 Reflection API는 해당 객체를 생성할 수 없으므로 JPA Entity Class에는 기본 생성자가 필요!

Reflection API 이란?

  • 자바에서는 JVM이 실행되면 작성된 자바 코드가 static 영역에 저장
  • 이 정보를 활용하여 클래스 이름을 통해 static 영역에서 그 클래스의 정보(메서드, 타입, 변수 등)에 접근 가능

근데 @Entity 어노테이션은 자동으로 기본 생성자를 만들어주는데..?
@NoArgsConstructor 없어도 되는거 아니야?

@NoArgsConstructor에 접근 제한 걸기

엔티티에는 @Setter어노테이션을 붙이지 않는다. 각 필드에 대해 일관성을 유지해야하기때문이다. 그러나 값은 넣어줘야하므로 안전하게 생성자를 쓰는 것이다.

따라서, @NoArgsConstructor를 활용해서 기본생성자를 추가하되, 접근제한을 걸어서 안전성도 높이는 것이다!

@AllArgsConstructor는 왜 사용안해?

@Entity는 생성자를 추가하는 코드를 쓰지 않아도 자동으로 기본생성자는 만들어주지만, 이미 생성자가 있는 경우에는 만들지 않는다.

그렇기 때문에 @AllArgsConstructor를 적용하고 나면 기본생성자가 만들어지지 않는 문제가 생겨버리는 것이다!


✨ Chapter 2.

access level를 private이 아닌 public or Protected로 제한하는 이유

  • JPA는 매핑한 Entity를 조회할 때 두가지 전략을 사용
  • EAGER : 즉시로딩

    • 연관된 Entity 객체들을 JOIN해서 즉시 조회하며, 엔티티자체를 조회
  • LAZY : 지연로딩

    • 조회시 연관된 Entity 객체는 Proxy 객체로 존재
      연관된 Proxy Entity 객체에 직접 접근할 때에 쿼리가 수행되며 실제 값을 가져옴

    지연로딩 방식을 사용하는 것을 권장

    • 즉시 로딩시, 연관된 모든 객체의 데이터까지 한번에 불러오므로 예상치 못한 SQL문이 처리됨

  • 지연로딩으로 설정하게 되면, 연관관계를 가지는 Entity 객체Proxy 객체로 가져오게 된다

이때 Proxy 객체는 Entity Class를 상속받아 만들어진 객체이므로 Entity의 기본 생성자에 대한 접근제어자가 Private일 시 Entity class를 상속받을 수 없어 Proxy 객체를 생성할 수 없다.


✨ Chapter 3.

access level를 public이 아닌 protected로 하는 이유

  • public 으로 기본 생성자를 열어두는 것은 무분별한 객체 생성을 야기할 수 있다.
profile
감자의 개발 일기

0개의 댓글

관련 채용 정보