본문 바로가기

Spring&IntelliJ

@NoArgsConstructor에 대하여

NoArgsConstructor를 설명하는 매우 좋은글. 매우 쉽게 씌어짐:  https://velog.io/@kevin_/%EB%82%B4%EA%B0%80-NoargsConstructor-access-AccessLevel.PROTECTED%EB%A5%BC-%EC%99%9C-%EC%9E%91%EC%84%B1%ED%96%88%EC%9D%84%EA%B9%8C

알아두기: 객체는 참조를 통해서 연관된 객체들을 마음껏 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. Hibernate와 같은 JPA 구현체들은 이 문제를 해결 하기 위해서, 프록시라는 기술을 사용한다. 프록시를 사용하면, 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스로부터 조회를 할 수 있다(내 생각에 이것이 지연로딩임. 맞음. 다음 포스팅 보면 확인할 수 있음. https://velog.io/@kevin_/%EB%82%B4%EA%B0%80-%EC%A7%80%EC%97%B0-%EB%A1%9C%EB%94%A9%EC%9C%BC%EB%A1%9C-%EC%9E%91%EC%84%B1%ED%96%88%EB%8D%98-%EC%9D%B4%EC%9C%A0  이 글에서는 Proxy에 대해서도 다루어준다). JPA 의 요점은 데이터베이스와 객체간 패러다임의 불일치를 어떻게 해결했는지이다.

지연로딩에서는 프록시 객체를 생성하지만 즉시로딩에서는 실제 객체를 생성한다.

  • 프록시 객체는 실제 객체에 대한 참조를 보관한다.
  • 프록시 객체의 메서드를 호출하면, 프록시 객체는 실제 객체의 메서드를 호출한다.

프록시 클래스의 코드를 보면 실제 객체에 대한 참조가 null인 것을 볼 수 있다.

Post targetPost = null;


프록시 객체는 user.getName() 처럼 실제 엔티티가 사용될 때 데이터베이스를 조회해서 실제 엔티티 객체를 생성해서 참조하는데 이 것을 프록시 객체의 초기화라고 한다.

  • 프록시 객체의 초기화 이후에는 Post targetPost = post; 가 된다.

 

 

@NoArgsConstructor(access = AccessLevel.PROTECTED): “아무런 매개변수가 없는 생성자를 생성하되 다른 패키지에 소속된 클래스는 접근을 불허한다”라는 뜻. 접근 권한을 private가 아니라 protected로 적용함으로써 프록시 객체를 생성하게 해줄 수 있다.