1. 예제코드
System.out.println("=======start=======");
Optional<Article> article = articleRepository.getReferenceById(commentDto.getArticleId());
System.out.println("=======1. getReference()=======");
System.out.println("article.getId() = " + article.get().getId());
System.out.println("========2. getId()=========");
System.out.println("article.isPresent() = " + article.isPresent());
System.out.println("======3. isPresent()===========");
System.out.println("article.get().getTitle() = " + article.get().getTitle());
System.out.println("========4. getTitle()=========");
2. 결과
- 실제 SQL이 실행되는 시점은 getTitle()이 실행되는 시점(4번)이다.(프록시 초기화 시점)
- getReference()호출 시 전달한 Id값을 가진 프록시가 생성되므로 Optional의 isPresent()함수에서 true가 나오는 것을 볼 수 있다.
- 다만, 자바 ORM 표준 JPA 프로그래밍에서는 엔티티 접근방식이 필드방식일 경우 getId()호출 시점에도 초기화가 일어난다고 하였는데, 이번 실험 케이스에서는 getId()호출 시점에 프록시가 초기화되지 않았다.(추가적인 확인 필요)
- 관련글, 관련글2, 관련글3
- 관련글 3에 흥미로운 내용이 있다. 프록시 객체의 getId()를 호출할 경우 taget.getId()가 아닌 생성된 proxy의 getId()를 호출하는 듯 하다. 초기화 이후 getId()를 호출했을 때 엔티티에 정의된 getId()가 호출된다.
=======start=======
=======1. getReference()=======
article.getId() = 1
========2. getId()=========
article.isPresent() = true
======3. isPresent()===========
Hibernate:
select
article0_.article_id as article_1_0_0_,
article0_.created_at as created_2_0_0_,
article0_.last_modified_at as last_mod3_0_0_,
article0_.created_by as created_4_0_0_,
article0_.modified_by as modified5_0_0_,
article0_.content as content6_0_0_,
article0_.member_id as member_i8_0_0_,
article0_.title as title7_0_0_
from
article article0_
where
article0_.article_id=?
2023-06-12 22:56:07.342 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]
2023-06-12 22:56:07.361 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicExtractor : extracted value ([created_2_0_0_] : [TIMESTAMP]) - [2023-06-10T16:17:47.823648]
2023-06-12 22:56:07.362 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicExtractor : extracted value ([last_mod3_0_0_] : [TIMESTAMP]) - [2023-06-10T16:17:47.823648]
2023-06-12 22:56:07.364 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicExtractor : extracted value ([created_4_0_0_] : [VARCHAR]) - [1]
2023-06-12 22:56:07.364 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicExtractor : extracted value ([modified5_0_0_] : [VARCHAR]) - [1]
2023-06-12 22:56:07.367 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicExtractor : extracted value ([content6_0_0_] : [CLOB]) - [내용 1]
2023-06-12 22:56:07.368 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicExtractor : extracted value ([member_i8_0_0_] : [BIGINT]) - [1]
2023-06-12 22:56:07.369 TRACE 31360 --- [ Test worker] o.h.type.descriptor.sql.BasicExtractor : extracted value ([title7_0_0_] : [VARCHAR]) - [제목 1]
article.get().getTitle() = 제목 1
========4. getTitle()=========