프로젝트 중에 오픈 API 로 데이터를 받아서 사용해야 하는 상황이 생겨서 최근 많이 사용된다는 Retrofit 을 공부했다
Retrofit은 네트워크로부터 전달된 데이터를 원하는 형태의 객체로 받을 수 있는 HttpClient Library이다
1. 의존성 추가(gradle)
여기서 converter-jackson 은 아래에서 사용할 JacksonConverterFactroy 의존성이다
2. 인터페이스에 HTTP API 명세를 기술
retrofit 은 interface 에 기술된 명세를 HTTP API 로 전환해주므로 interface에 요청할 API의 명세를 기술한다
'명세'를 기술한다는 것은 '요청할 주소'를 기술한다는 것이고, 아래의 servicekey는 직접 받아와야 한다
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
public interface SeoulAirQualityApi {
String servicekey = "비공개키";
@GET(servicekey + "/json/DailyAverageCityAir/1/25/{date}")
Call<SeoulAirQualityApiDtoIn.GetAirQualityResponse> getAirQuality(@Path("date") String date);
}
GET, POST, DELETE, PUT 중 원하는 방식의 요청과 명세를 Retrofit 어노테이션(@GET)과 함께 기술하되
URL의 스킴, 프로토콜, 호스트번호, port 번호는 제외하고 입력한다
반환은 Call<요청할 데이터의 객체타입> 의 형태로 기술하고, 메소드는 어떻게 데이터를 받아올지를 따로 구현한다
3. 인터페이스 구현
@Slf4j
@Component
public class SeoulAirQualityApiCaller implements KoreaAirQualityApiCaller {
private final SeoulAirQualityApi seoulAirQualityAPI;
public SeoulAirQualityApiCaller(@Value("${api.Seoul.baseUrl}") String baseUrl){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(JacksonConverterFactory.create(objectMapper))
.build();
this.seoulAirQualityAPI = retrofit.create(SeoulAirQualityApi.class);
}
우선 Json 으로 받아온 데이터를 Java 에서 사용할 수 있게 역직렬화(Deserialization) 하기 위해
직접 파싱하지 않고도 편리하게 직렬화 or 역직렬화 할 수 있는 ObjectMapper 객체를 생성한다
그리고 ObjectMapper 에 Feature 를 configure 하는데, 여러가지 Feature 중 여기서는 Json->Object(역직렬화) 변환시
존재하지않는 property가 있는경우에도 fail 하지 않게하는 특징을 configure 한다
마지막으로 retrofit 인스턴스를 이용해 retrofit 과 interface 연결하면 된다
Retrofit은 네트워크에서 전달된 데이터를 필요한 형태의 객체로 받게해주는 library로 아래의 기본적인 사용 형태를
응용하였다
아래는 GsonConverterFactory 를 이용했지만 나는 JacksonConverterFactory 를 이용했다
.baseUrl(요청할 서버의 기본URL)
.addConverterFactory() : Json->POJO클래스 형식으로 자동변환하는 데이터파싱 converter 추가, json 형태로
데이터 변환기능 제공
참고사이트) http://devflow.github.io/retrofit-kr/
참고사이트) https://galid1.tistory.com/617
참고사이트) https://soulduse.tistory.com/22
'Web API' 카테고리의 다른 글
[웹 API] JSON 과 XML (0) | 2021.09.11 |
---|