inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

QueryDSL에서 발생한 예외 처리 관련 질문

해결된 질문

1241

iii

작성한 질문수 1

1

QueryDSL 사용도중, QueryDSL에서 발생한 예외를 @ExceptionHandler를 이용해 처리할 수 있는지 궁금해서 질문드렸습니다.

예를들어, QueryDSL + 게시글의 아이디를 이용해 하나의 게시글을 조회하려 하는데

retrun jpaQueryFactory.selectFrom(post).where(post.id.eq(postId)).fetchOne();

이런식으로 조회를 하려고 할 때 , 만약 존재하지 않는 postId를 입력하면 NPE(NullPointException)이 발생하는데, 이 이러한 예외가 발생했을 때 @ExceptionHandler에서 어떻게 처리할 수 있는지 궁금합니다.

(단건 조회관련 별도의 QueryDSL을 쓰는 이유는 단건 조회시, 조회된 엔티티의 연관관계 조회가 따로 필요가 없을 경우는 findById()로 처리하고, 필요한 경우는 QueryDSL의 join().fetchJoin()을 이용해 한 번에 처리하려고 합니다.)

 

제가 생각한 방법으로는 첫 번째 방법은 @ExceptionHanlder(NullPointException.class)을 이용해 처리하는 건데, 이러한 방법은 다른 상황에서 발생한 NullPointException 마저도 동일하게 처리하기 때문에 문제가 될 수 있을 거 같고, 두 번째 방법은 findById()에 @EntityGraph를 이용해 연관관계를 처리한 다음, 예외처리 관련해서 기존 방법과 같이 findById().orElseThrow(()->new PostNotFound());를 쓰는 것 같습니다. 그러나 이방법은 단건 조회시 항상 연관관계도 조회해야 하는 단점이 있는것 같습니다.

 

어떤 방식이 효율적인지 궁금해 여쭤보고자 합니다.

JPA spring-boot aws Spring Security vuejs

답변 1

0

호돌맨

안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.

저라면 @ExceptionHandler로 처리하겠습니다. 단, Repository에서 예외가 발생하지 않게 할것 같습니다.

fetchOne()

    @Nullable
    @SuppressWarnings("unchecked")
    @Override
    public T fetchOne() throws NonUniqueResultException {
        try {
            Query query = createQuery(getMetadata().getModifiers(), false);
            return (T) getSingleResult(query);
        } catch (javax.persistence.NoResultException e) {
            logger.trace(e.getMessage(),e);
            return null;
        } catch (javax.persistence.NonUniqueResultException e) {
            throw new NonUniqueResultException(e);
        } finally {
            reset();
        }
    }

내부 동작을 보시면 결과가 존재하지 않는경우 NoResultException를 catch하고 null을 반환해줍니다. (정확히 기억나지 않지만, 예전 버전에서는 null을 반환하지 않고 그냥 예외를 던졌던것 같습니다. 그리고 질문자님은 이 문제를 겪는것 같습니다.)
그렇다면 간단하게 Repository에서 Entity를 Optional로 감싸 던지면 어떨까요?

    @Override
    public Optional<Post> get(Long id) {
        return Optional.ofNullable(jpaQueryFactory.selectFrom(post)
                .where(post.id.eq(id))
                .fetchOne());
    }

그러면 받는 (Service)쪽에서 postRepository.get(55L).orElseThrow로 NotFound 예외를 던지면 될것 같습니다.

감사합니다.

0

iii

아 QueryDSL 구현 세부 사항을 면밀히 살펴보면, 좀 더 깊게 생각해보고 질문드릴 수 있었을 거 같네요.

정성스러운 답변 감사합니다!

Deprecated 관련 사항들

0

105

2

깃헙 collaboator 초대 관련

0

89

1

강의 듣다가 도커 이미지 생성시 각각도 가능하나 그렇게 사용하는데가 많은지 모르겠다라는 말을 듣고 남김니다

0

158

2

logout 후에 login 페이지 이동은 어디서 시켜주는건가요?

0

233

1

다중 데이터를 삭제 할 때

0

271

2

querydsl Q class 이슈

0

417

2

Windows WSL Vue 설정

2

247

1

Dip, @transactional

0

189

1

[vite] http proxy error: /auth/login

0

1047

2

로그인 하고 나서 GET요청으로 메인페이지 요청

0

234

2

GitHub Collaborator 초대 관련

0

258

2

Window에서 Vue.js 설정

0

322

2

collaboator로 초대받을 수 있을까요??

0

283

2

SecurityMockContext 로부터 유저 정보를 가져오기

0

262

1

섹션9 프론트의 코드를 보고싶습니다,,,

0

423

1

Spring Security - defaultSuccessUrl 질문

0

627

1

강의 화면이 나오지 않습니다. 음성과 자막만 나와요

0

303

1

JPAQueryFactory(em)의 객체 생성자 오류에 대해서 질문이 있습니다ㅜㅜ

0

690

2

ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상

0

1182

2

섹션10 언제 나오나요?

0

485

1

CommentService에서 Repository를 호출하지 않는데도

0

345

1

Editor....를 활용한 패턴에 질문있습니다.

0

496

1

섹션9 vue

0

456

2

Post에 edit 메서드 삼항연산자 질문

0

476

2