ninishop 트러블 슈팅 - OpenFeign 타입오류

Jiyeon·2024년 6월 2일

ninishop

목록 보기
4/6

트러블 슈팅

서비스간 통신을 하는 과정에서 생긴 오류

  • A서비스에서 B서비스 데이터가 필요한 상황

필요한 로직을 다 구현하고 B서비스에서 내보내는 DTO와 같은 필드명으로 A서비스에서 받을 DTO까지 생성했는데

자꾸 이렇게 Type 에러가 발생

심지어 로그도 안 뜨고 그냥 저게 다임 저렇게 무심할 수가 없음;

메세지 읽어보니 데이터를 받는 A서비스 DTO클래스에 대한 오류였음

받아주는 클래스(DTO)에 빈생성자가 없어서 발생했던 것

해결방법

➡️ @NoArgsConstructor 어노테이션을 넣어서 해결

판단 미스로 받는 타입을 ApiUtills.ApiResult<T>로 포장해서 받아보려고 했었음.
해결방법 찾고 바로 DTO로 받을 수 있게 변경
✅ 빈생성자가있고, 필드명만 같다면 DTO로 받아도 문제없음

"Type definition error"가 발생하는 이유

Feign 클라이언트가 내부적으로 JSON 라이브러리(일반적으로 Jackson)를 사용해 HTTP 응답을 Java 객체로 변환하기 때문

1. Java 객체의 역직렬화

  • Jackson과 같은 라이브러리는 역직렬화 과정에서 빈 생성자를 사용하여 객체의 인스턴스를 먼저 생성한 후, 반사(Reflection)를 통해 JSON 데이터에서 읽은 값들로 객체의 필드를 설정함

    역직렬화(Deserialization): JSON 문자열을 Java 객체로 변환하는 과정

  • Jackson은 기본적으로 객체를 생성할 때 빈 생성자를 호출
    빈 생성자가 없으면 Jackson은 객체의 인스턴스를 생성할 수 없어 역직렬화 과정에서 실패하게 됨

2. Feign과 Jackson

  • Feign 클라이언트는 내부적으로 HTTP 응답을 자동으로 Java 객체로 변환하는 기능을 제공
    이때 Jackson 라이브러리를 사용하여 JSON 응답을 DTO로 변환하는데, DTO 클래스에 빈 생성자가 없으면 Jackson이 인스턴스를 생성할 수 없음.
  • 빈 생성자가 없는 경우 Jackson은 인스턴스화 과정에서 예외를 발생시키고, "Type definition error"로 표현됨. 예외 메시지는 특히 클래스가 private이거나 적절한 생성자가 없을 때 자주 발생
profile
개발자

0개의 댓글