<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에 대한 처리를 담당한다.
- .filterGraphQLErrors 는 GrahpQLError가 아닌 경우에 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()));
}
}
'공부 > GraphQL' 카테고리의 다른 글
<GraphQL> 5. 비동기 처리 / N+1 문제 with Spring Boot (0) | 2022.04.06 |
---|---|
<GraphQL> 4. 동물원 예제 만들기 with Spring Boot (0) | 2022.04.02 |
<GraphQL> 2. Query와 Type with Spring Boot (2) | 2022.03.26 |
<GraphQL> 1. 설정하기 with Spring Boot (2) | 2022.03.14 |
<GraphQL> 0. GraphQL 이란 (0) | 2022.03.14 |
블로그의 정보
57개월 BackEnd
BFine