인프런 커뮤니티 질문&답변

jungbeen님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

회원 기능 테스트

MemberRepository querydsl 적용 질문입니다

해결된 질문

작성

·

97

2

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

querydsl 강의를 듣고 복습하면서 적용해보고 있는데, memberRepository 부분에서 @RequiredArgsConstructor을 사용했더니 compileJava부분에서 em의 초기값이 없다는 예외가 발생했습니다.

  1. 생성자를 활용해서 해결되긴 했는데 그 전의 코드에서 왜 작동이 안되었는지 궁금해서 질문드립니다.

  2. @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);
    }

 

감사합니다.

jungbeen님의 프로필 이미지
jungbeen
질문자

감사합니다!

jungbeen님의 프로필 이미지

작성한 질문수

질문하기