You will be fine

<GraphQL> 3. Exception Handling with Spring Boot

by BFine
반응형

 

가. Graphql Exception Handling

 a. Exception 처리

  -  graphql 은 1차적으로 query에 대해서 유효성 검사를 진행하고 문제가 있을 경우 관련 내용을 전달하는 과정을 거친다.

  -  그 이후에 로직에서 Exception 발생하는 경우 여러 단계를 거쳐 GrahphQLError로 변환하는 작업을 거치며 동일한 Error 포멧을 제공하고 있다.

 

 b. 테스트

public MemberDTO member(Long id){
    Member member = memberRepository.findById(id).orElse(null);
    MemberDTO memberDTO = modelMapper.map(member, MemberDTO.class);
    memberDTO.setManager(SilverManager.builder().name("kim").score(5).build());
    return memberDTO;
}

  -  DB에 없는 데이터를 조회하였기 때문에 ModelMapper에서 IllegalArgumentException이 발생한다.
  -  query로 요청해보면 위와 같은 Error 포멧 형태로 return 하는 것을 볼 수 있다.   

 

 c. DefaultGraphQLErrorHandler

  -  별도의 설정을 하지 않았다면 DefaultGraphQLErrorHandler에서 GrahphQLError에 대한 처리를 담당한다.

  -  .filterGraphQLErrorsGrahpQLError가 아닌 경우에 List에 담지 않기 때문에 결국 return 은 디폴트 처리인 GenericGraphQLError가 된다.

 

나. Runtime Exception Handling

 a. GraphQLError로 변환하면 될까?

  -  위에 발생한 IllegalArgumentException 를 잡아서 변환해주면 되지않을까 했는데 보면 GraphQLError는 인터페이스 이다.

  -  구현해야할 메서드 목록을 보면 알 수 있듯이 매번 잡아서 변경하기에는 어려워보이고 불필요한 부분도 있어보인다.

  

 b. 설정 변경하기 

  -  Exception을 자체적으로 handler 할 수 있도록 설정을 변경할 수 있다.

  

 c. 테스트 

  -  위의 설정을 enable 시키고 동일한 query를 요청해보면 DefaultGraphQLErrorHandler 아닌 GraphQLErrorFromExceptionHandler 이 실행된다.

  -  DefaultGraphQLErrorHandler 와 다르게 검증하는 부분 없고 반대로 GraphQLError 로 변환하는 작업이 있는 것을 볼수 있다.

  -  실제로 발생했던 IllegalArgumentException 과 메세지를 포멧에 맞춰 return 해주는 것을 볼 수 있다.

 

 d. Exception Handler

  -  위에 보면 error를 너무 자세하게 보여준다는 느낌이 든다. 개발서버가 아니라면 저런 상세한 메세지가 클라이언트에 보여진다면 문제가 될 수 있다. 

  -  위의 문제는 간단하게 ThrowableGraphQLError를 이용하면 error 메세지를 custom 하여 처리할 수 있다. 

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    public ThrowableGraphQLError throwableGraphQLError(RuntimeException e){
        log.error("error : ",e);
        return new ThrowableGraphQLError(new RuntimeException("서버에 오류가 발생했습니다. 오류코드 C001",e.getCause()));
    }
}

 

참고 : https://youtu.be/bbfsak5i8Ok

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기