해결된 질문
작성
·
97
2
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
querydsl 강의를 듣고 복습하면서 적용해보고 있는데, memberRepository 부분에서 @RequiredArgsConstructor을 사용했더니 compileJava부분에서 em의 초기값이 없다는 예외가 발생했습니다.
생성자를 활용해서 해결되긴 했는데 그 전의 코드에서 왜 작동이 안되었는지 궁금해서 질문드립니다.
@RequiredArgsConstructor을 사용한다던가 하는 더 간단한 방법도 있는지 궁급합니다.
코드파일입니다
https://drive.google.com/file/d/1ezwW4PrReG_BX-lmAC1uiOL8Syk3GbFW/view?usp=sharing
답변 1
1
안녕하세요. jungbeen님, 공식 서포터즈 OMG입니다.
아래와 같이 작성하려던 게 맞을까요?
@Repository
@RequiredArgsConstructor
public class MemberRepository {
private final EntityManager em;
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
// private final JPAQueryFactory queryFactory;
/*
public MemberRepository(EntityManager em) {
this.em = em;
this.queryFactory = new JPAQueryFactory(em);
}
*/
이렇게 작성하신게 맞다면, em은 생성자주입을 통해 구현 객체를 주입받는데요,
컴파일 시점에는 em이 초기화되지 않아 variable em might not have been initialized
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
이와 같은 오류가 발생합니다.
이를 해결하기 위해
(1) 코드 처럼 명시적으로 생성자 코드를 작성한다.(생성자로 초기화)
(2) @RequiredArgsConstructor를 사용하면서 @PostConstruct를 사용하여 em이 먼저 의존관계가 주입되고나서 queryFactory의 초기화를 진행한다.(초기화 시점을 조절)
@Repository
@RequiredArgsConstructor
public class MemberRepository {
private final EntityManager em;
private JPAQueryFactory queryFactory;
@PostConstruct
public void init() {
this.queryFactory = new JPAQueryFactory(em);
}
감사합니다.
감사합니다!