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로 적용함으로써 프록시 객체를 생성하게 해줄 수 있다.
'Spring&IntelliJ' 카테고리의 다른 글
API설계 오류관련 Validation Failed 오류 (0) | 2024.06.17 |
---|---|
알기쉽게 정리한 @NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor (0) | 2024.06.11 |
@Requestbody, @ResponseBody에 대하여 (0) | 2024.06.10 |
@Controller와 @RestController 어노테이션 (0) | 2024.06.10 |
Web Server와 WAS의 차이와 웹 서비스 구조 (0) | 2024.04.10 |