2023년 1학기 캡스톤 디자인 프로젝트를 하면서, 다른 동기가 있는 조에서 dto마다 인스턴스들을 초기화시키는 생성자가 있어야 하는 이유는 너무 당연한데, 도대체 인스턴스 없이 만드는, NoArgsConstructor가 왜 존재해야 하는가를 궁금해했던 적이 있었다.
우리 조원들에게도 그 부분에 대해 알까 싶어 물어봤지만, 모른다는 이야기를 들었다.
그래서 이에 대해 정리를 해보려고 한다.
일단, JPA의 특성중에 프록시와 지연로딩에 대해서 먼저 알고오면 쉽다.
프록시는 엔티티를 상속받아 정의된다.
프록시에서는 실제 엔티티와 같은 인스턴스들이 초기화되지 않고 만들어지게 된다.
인스턴스 없는 생성자가 무엇일까?
그게 NoArgsConstructor이다!!!(이렇게 블로그 내용 돌려막다 보면 언젠가는 링크만 달아주고 끝날 수 있겠다ㅎㅎㅎ)
그런데 하나 유의해야 할 사항이 있다.
@NoArgsConstructor에서 괄호에 추가된 부분이 있다.
access = AccessLevel.PROTECTED라고 추가된 부분이 있는데, 이는 이 프록시를 호출하는 경우를 생각해보아야 한다.
실제로 코딩을 할 때의 경우에 예시를 들어보자.
Post(게시물)이라는 객체는 Member(작성자)를 인스턴스로 가진다.
이럴 때 Post를 데이터베이스에서 호출할 때, 인스턴스 Member는 지연로딩에서 프록시로 불러온다.
이렇게 프록시를 불러오기 위해선, 저 Member의 자리를 NoArgsConstructor를 이용해 프록시 객체로 생성해주어야 한다.
그런데, 이게 private이면, 생성을 할 수 없다. private 함수는 해당 클래스 내에서만 사용할 수 있기 때문이다.
그래서 protected로 보통 많이 사용한다. (public을 써도 되지만, 굳이 다른 곳에서 쓸 일이 없으니까)
'개발공부 > 받은 질문들' 카테고리의 다른 글
받았던 질문 : getter를 쓰는 것을 지양하라는 이유는 무엇일까? (0) | 2023.03.30 |
---|---|
받았던 질문 : ExceptionAdvice? 이거 어떻게 동작하는거임? (0) | 2023.03.25 |