OpenFeign 인터페이스 구성
OpenFeign은 인터페이스로 구성되어있으며 실제 동작할 때 구현체를 자동으로 생성해준다.
그런데 응답값을 받아올 때는 어떤 형식으로 받아오지? 라는 생각이 들었다. 풀어서 얘기하면 GetMapping으로 조회하여 데이터를 받아 올 때 응답 형식을 제대로 만들어주지 않는다면 오류가 난다.
@FeignClient(name = "instagram", url = "<https://graph.facebook.com/v15.0>")
public interface InstagramFeignClient {
@GetMapping("/{user_id}")
Map<String, Object> getFaceBookUserPages(
@PathVariable("user_id") String userId,
@RequestParam("access_token") String accessToken,
@RequestParam(name = "fields", defaultValue = "instagram_business_account") String fields);
}
실제로 테스트 해보니 응답값 포맷 형식을 받아올 수 있는 방법이 크게 3가지 존재하고 나는 3번 째 방식인 커스텀 DTO 방식을 활용하였다.
1. Map<String, Object> 방식 (Json도 Key:Value 형식이라 맵핑이 가능)
2. ResponseEntity 방식
3. 커스텀 한 DTO 방식
개발 중인 프로젝트에서는 페이스북 Open API를 활용하였고, API 문서를 보면 HTTP Response Body 형식을 볼 수 있다.
# 인스타그램 그래프 API 중..
{
"instagram_business_account": {
"id": "17841405822304" // Connected IG User ID
},
"id": "1348957937914" // Facebook Page ID
}
위와 같은 응답 형식이 있다고 가정한다면 JAVA에서 DTO로는 밑에 코드처럼 정의 해 줄 수 있다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class InstagramDto {
private Insta instagram_business_account;
private String id;
@Getter
@NoArgsConstructor
@AllArgsConstructor
static class Insta {
private String id;
}
}
- Json 포맷 형태에 맞추기 위해 inner class를 이용한다. 여기서 주의할 점은 inner class는 실제로 openFeign에서 호출하지 않는다. openFeign은 응답을 만들어줄 객체만 호출한다.
- 즉, inner class는 정적 클래스 (static class)로 만들어 주어야지만 사용 가능하다는 점이다.
만약 응답 필드 이름을 변경해서 프론트에게 전달해주고 싶다면?
현재까지 알아 본 결과로는 2가지 방법이 존재한다.
1. @JsonAlias
2. @JsonCreator, @JsonProperty
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class InstagramDto {
@JsonAlias("instagram_business_account")
private Insta insta;
@JsonAlias("id")
private String face_book_id;
@Getter
@NoArgsConstructor
@AllArgsConstructor
static class Insta {
@JsonAlias("id")
private String insta_id;
}
}
@JsonAlias 이용하면 필드에 직접 정의 하여 사용 할 수 있다.
@Getter
@NoArgsConstructor
public class InstagramDto {
private Insta insta;
private String face_book_id;
@JsonCreator
public InstagramDto(@JsonProperty("instagram_business_account") Insta insta, @JsonProperty("id") String face_book_id) {
this.insta = insta;
this.face_book_id = face_book_id;
}
@Getter
@NoArgsConstructor
public static class Insta {
private String insta_id;
@JsonCreator
public Insta(@JsonProperty("id") String insta_id) {
this.insta_id = insta_id;
}
}
}
@JsonCreator, @JsonProperty 이용하면 생성자에서 정의해서 사용 할 수 있다.
변경한 필드 JSON 응답 결과
{
"insta": {
"insta_id": "178414058223044" // Connected IG User ID
},
"face_book_id": "134895793914" // Facebook Page ID
}
'SpringBoot' 카테고리의 다른 글
| @EventListener을 통해 객체 간 결합도 낮추기 (0) | 2023.04.04 |
|---|---|
| SpringBoot + S3 연동하여 이미지 올리기 (2) | 2023.04.04 |
| 스프링 예외 처리 Guide (0) | 2023.04.04 |
| SpringBoot + STOMP 웹소켓 고도화 (0) | 2023.04.03 |
| SpringBoot + STOMP 웹소켓 구현 (0) | 2023.04.03 |