[JPA] @Entity 의 추가 내용

Coodori·2023년 4월 3일
0

CherishU

목록 보기
20/29

@Entity

일단 테이블과 자바의 클래스를 연결해주는 어노테이션이다.
근데 최근 어노테이션 기능에 대해서 전체적으로 다시 공부해보는 중인데 신기한 사실을 발견하고 주의할 점이 있을 듯하여
작성을 해보려고한다!

주의사항!

  • 기본 생성자는 필수다(파라미터가 없는 public 또는 protected 생성자).
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안된다.

@Entitiy 어노테이션은 내부적으로 기본생성자를 만들어준다.

java의 ORM 기술인 JPA는 기본적으로 스펙상 기본 생성자를 요구한다.
하지만 @Entity가 내부 생성자를 만들어주는데 우리는 왜 코드를 이렇게 짜는걸까?

@NoArgsConstructor( access = AccessLevel.PROTECTED)
@Getter
@Table( name = "member" )
@AllArgsConstructor
@Entity
public class Member {

그것은 전 글과 같은 것이다.
내부적으로 만들어주는 생성자 같은 경우 public 으로 다른 곳에서 접근이 가능하다.
그래서 직접 코드로 Jpa 가 인식할 수 있는 최대 수준의 생성자를 만들어주는 것이다.

그렇다면 @AllArgsConstructor는 왜 작성하는 것일까?

보통 무분별한 변경 지점과 핵심 엔티티의 변경관리를 하기 위해 Setter는 닫아 놓는다.
그렇게 되면 생성자 생성 혹은 빌더 생성을 해야하는데 생성자 생성보다는 빌더 생성이 파라미터에 대해서 안전하고 개발자가 더 명시적으로 객체 생성을 할 수 있다.(생성자 생성은 순서를 맞춰야함)

그래서 저번 글에 이어서 이미 생성자가 만들어져있는데 접근을 하려고하니 PROTECTED여서 에러가 나게 된다.(파라미터도 없으니깐...)
그래서 모든 파라미터에 대한 생성자를 만들어줘서 Builder가 접근 가능하게 만들어준다.

그러면 @NoArgsConstructor를 지우면 되지 않은가?
그것도 결국은 @AllArgsConstructor 가 생성자로 존재하기 때문에 @Entity가 생성자를 만들지 않아서 기본 생성자가 없다.

결론

늘 애매하게 가지고 있던 Entity 위의 어노테이션에 대해서 앞에 글과 함께 정리를 하였다.
사용은 이렇게 하는게 가장 베스트 같다.

@NoArgsConstructor( access = AccessLevel.PROTECTED)
@Getter
@Table( name = "member" )
@AllArgsConstructor
@Entity
public class Member {

REFERENCE

https://gwonbookcase.tistory.com/37
https://velog.io/@gowjr207/Entity-%EC%97%90-%EC%93%B0%EC%9D%B4%EB%8A%94-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640

0개의 댓글