본문 바로가기
SpringBoot

[Spring Boot] 16. USE other REST API (3) - GSON

by 청양호박이 2019. 12. 10.

지난 시간에는 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-

댓글