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