지난 시간에는 REST API를 Spring Boot 내부에서 호출해서 결과를 JSON Type으로 받아오는 방법을 알아보았습니다. GET이던 POST던 REST Template을 통해서 비동기식으로 가져왔습니다.
2019/12/07 - [SpringBoot] - [Spring Boot] 15. USE other REST API (2) - RestTemplate
[Spring Boot] 15. USE other REST API (2) - RestTemplate
지난 시간에는 REST API를 제공하는 공공데이터포털에 대해서 알아보고 실질적으로 해당 API를 호출해서 확인했습니다. 2019/12/04 - [SpringBoot] - [Spring Boot] 14. USE other REST API (1) [Spring Boot] 14...
ayoteralab.tistory.com
그럼 JSON Type으로 받아온 데이터를 DB에 저장을 하던 다른곳에 사용을 하려면 결국 각 변수명에 따른 값을 추출해서 사용을 해야합니다. 이를 파싱(Parsing)해야하는데... 어떤 방법을 통해서 사용을 해야할까요??
이때 사용할 수 있는게... 바로 GSON입니다. GSON은 Google에서 제공하는 JSON Parser입니다. 이를 사용하기 위해서는 아래의 절차로 준비하면 됩니다. 몇줄의 코드로 ResponseEntity로 반환된 결과값을 Java Entity로 변환되는 장면을 목격하실 수 있습니다.
- Maven Dependency 추가
- 받아온 JSON 결과를 분석하여 Java Entity 생성
- fromJSON( ) 메서드를 사용해서 JSON결과를 Entity로 변환
1. Maven Dependency 추가
기존처럼 Maven Repository (https://mvnrepository.com/) 사이트에 접속해서 GSON을 검색해서 받아올 수 있습니다. 하지만 역시 사용법이나 관련된 풍부한 자료를 얻기위해서 Google에서 공식적으로 제공하는 Github에 접속해서 살펴보도록 하겠습니다.
https://github.com/google/gson
google/gson
A Java serialization/deserialization library to convert Java Objects into JSON and back - google/gson
github.com
들어가보면, 친절하게 Gradle, Maven 각 각 dependency 적용 방법을 설명해 줍니다. 그렇다면 나와 있는 방법대로 pom.xml에 해당 내용을 추가해 줍니다.
[pom.xml]
<!-- GSON dependency -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
저장을 하게되면, Eclipse에서 자동으로 해당 라이브러리를 받아옵니다. 실제로 Package Explorer에서 확인해보면....
gson-2.8.6.jar를 확인할 수 있습니다.
2. Entity 생성
우선 받아온 JSON이 어떻게 생겼는지 확인합니다.
해당 JSON은 list라는 변수에 배열형태로 "_returnType" ~ "ver"을 가지고 있는 Entity를 인자로 가지는 형태입니다. 그렇다면 어떻게 생성을 해야할까요??
Root Entity는 ArrayList로 "list":[ { } , { } ] 변수만 하나 생성하고, Leaf Entity는 그냥 String의 집합으로 원하는 항목의 변수만 생성합니다. 그래도 알아서 잘 들어오네요~ 역시 Google 입니다. 그럼 최종적으로 생성한 내용은 아래와 같습니다.
[RealTimeAirList.java]
import java.util.ArrayList;
public class RealTimeAirList {
ArrayList<RealTimeAirContents> list = new ArrayList<>();
public ArrayList<RealTimeAirContents> getList() {
return list;
}
public void setList(ArrayList<RealTimeAirContents> list) {
this.list = list;
}
}
[RealTimeAirContents.java]
public class RealTimeAirContents {
private String dataTime;
private String khaiGrade;
private String khaiValue;
private String mangName;
private String no2Grade;
private String no2Value;
public String getDataTime() {
return dataTime;
}
public void setDataTime(String dataTime) {
this.dataTime = dataTime;
}
public String getKhaiGrade() {
return khaiGrade;
}
public void setKhaiGrade(String khaiGrade) {
this.khaiGrade = khaiGrade;
}
public String getKhaiValue() {
return khaiValue;
}
public void setKhaiValue(String khaiValue) {
this.khaiValue = khaiValue;
}
public String getMangName() {
return mangName;
}
public void setMangName(String mangName) {
this.mangName = mangName;
}
public String getNo2Grade() {
return no2Grade;
}
public void setNo2Grade(String no2Grade) {
this.no2Grade = no2Grade;
}
public String getNo2Value() {
return no2Value;
}
public void setNo2Value(String no2Value) {
this.no2Value = no2Value;
}
@Override
public String toString() {
return "RealTimeAirContents [dataTime=" + dataTime + ", khaiGrade=" + khaiGrade + ", khaiValue=" + khaiValue
+ ", mangName=" + mangName + ", no2Grade=" + no2Grade + ", no2Value=" + no2Value + "]";
}
}
그리고 구조는 아래와 같습니다.
3. fromJSON( )을 사용해서 변환
Gson.fromJSON(JsonElement json, Class<T> classOft)은 요렇게 생겼습니다. 여기에 맞게 인자를 넣어주면 끝이지요.
[UserService.java]
public StationMiseDTO restCallById(String stationName) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
URI url = URI.create(restUrl);
HttpEntity<String> request = new HttpEntity<>(httpHeaders);
ResponseEntity<String> responseEntity = null;
responseEntity = restTemplate.postForEntity(url, request, String.class);
String res = responseEntity.getBody();
Gson gson = new Gson();
RealTimeAirList rtal = gson.fromJson(res, RealTimeAirList.class);
System.out.println(rtal.getList().size());
System.out.println(rtal.getList().get(3).toString());
return null;
}
인자에는 각 각 responseEntity.getBody( ) 와 신규로 생성한 Entity Class를 기재하면 됩니다.
해당 REST API는 Page별로 10개의 리스트를 가지고 오며, 실제로 작성한 Entity에 데이터를 꽉 채워서 가져오네요~!! 그렇다면 이제 할 일은 필요에 맞게 가공하여 사용하는 일입니다.
-Ayotera Lab-
댓글