inner static class 의 private 메소드에서 발생하는 EntityManager null exception
493
작성한 질문수 5
안녕하세요? 좋은 강의 감사합니다.
예제 코드를 따라 하던 중
내부 클래스 static class InitService 의 dbInit2() 메소드를 private 으로 바꿔보았는데 EntityManager 가 null 예외가 발생하더라구요
이유가 궁금하여 질문 드립니다.
감사합니다.
@Component
@Transactional
@RequiredArgsConstructor
static class InitService {
private final EntityManager em;
public void dbInit1() {
Member member = createMember("userA", new Address("서울", "1", "1111"));
em.persist(member);
}
private void dbInit2() { // InitDB 클래스의 내부 스태틱 클래스 InitService 안에 선언된 private 메소드
Member member = createMember("userB", new Address("진주", "2", "2222"));
em.persist(member); // EntityManager null exception
}
답변 3
5
안녕하세요. 준드래곤님
우선 스프링 AOP에 관해서 어느정도 아신다고 가정하고 답변을 드리겠습니다. (스프링 AOP까지 설명하려면 수십장이...)
@Transactional이 붙으면 스프링에서 AOP가 동작합니다. 그래서 다음과 같이 원본 클래스 앞에 트랜잭션 처리를 위한 프록시 클래스가 생성됩니다.
client -> 프록시 -> 원본
그래서 우리가 호출한 initService.dbInit1()은 사실 프록시 객체를 호출한 것이지요. 프록시 객체는 이때 트랜잭션에 필요한 AOP 처리를 하고 원본 객체의 dbInit1()을 호출합니다.
그런데 프록시가 이렇게 원본 객체로 위임하는 경우는 public 메서드인 경우만 위임합니다.
private 메서드는 위임을 하지 않습니다. 따라서 프록시의 private 메서드를 강제로 호출하게 되면 위임을 하지 않으므로, 프록시 객체 자체가 되고, 이 프록시 객체에는 사실 EntityManager 필드에 데이터가 없습니다. (원본 객체에 가면 있습니다.)
dbInit1(), dbInit2() 메서드에 각각 다음 코드를 넣어보시면, 해당 내용을 이해할 수 있습니다.
System.out.println("Init1" + this.getClass()); -> 원본 인스턴스
System.out.println("Init2" + this.getClass()); -> 프록시 인스턴스
감사합니다^^
강의 관련 외 질문입니다.
0
65
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
0
86
1
BeanCreationException
0
86
3
Update 후 UpdateMemberResponse 매핑할 때
0
46
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
98
2
페이징 + 검색조건 관련해서 질문드립니다.
0
70
1
Query Dsl Q파일 질문입니다.
0
81
1
루트 쿼리라는것은
0
58
1
메서드를 분리하는 기준
0
62
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
108
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
83
2
fetch join과 영속화와 OSIV의 관계
0
84
2
Distinct 사용 전 결과에 대한 의문
0
113
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
56
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
78
2
dto 필드 속 엔티티 여부
0
58
1
뷰템플릿 사용 시
0
76
2
Result 클래스 관련 질문
0
56
1
@PostConstruct 프록시 관련 질문드립니다
0
85
1
DTO 대신 Form 사용은 안되나요?
0
133
1
OSIV ON 상태일 때
0
95
1
fetch join VS fetch join 페이징 궁금증
0
179
2
양방향 연관관계 알아보는 법?
0
104
1
16강 17강 간단 정리 이게 맞을까요 ?
0
165
2





