공연예술통합전산망의 Open API에서 공연 정보를 받아오고, 데이터를 이용해 요청에 응답하려고 한다. 공공데이터포털를 주로 사용하지만, 활용신청하고 1-2시간 정도 지나야 이용가능해서 위의 데이터를 이용하였다.
링크에서 인증키 발급신청을 한다.
입력한 이메일로 인증키가 발급된다. 해당 인증키를 저장해 둔다.
Spring Initializr
를 이용하여 프로젝트를 빌드한다.
root 디렉토리에 api
패키지를 추가하고, 아래 KpiApi
클래스를 추가한다.
@Component
public class KpiApi {
@Value("${openapi.kpikey}")
private String key;
public String getPerform() throws IOException {
System.out.println(key);
StringBuilder urlBuilder = new StringBuilder("http://kopis.or.kr/openApi/restful/pblprfr"); /*URL*/
urlBuilder.append("?" + URLEncoder.encode("service","UTF-8") + "=" + URLEncoder.encode(key, "UTF-8")); /*Service Key*/
urlBuilder.append("&" + URLEncoder.encode("stdate","UTF-8") + "=" + URLEncoder.encode("20160101", "UTF-8")); /*페이지번호*/
urlBuilder.append("&" + URLEncoder.encode("eddate","UTF-8") + "=" + URLEncoder.encode("20160630", "UTF-8")); /*한 페이지 결과 수*/
urlBuilder.append("&" + URLEncoder.encode("rows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*지역코드*/
urlBuilder.append("&" + URLEncoder.encode("cpage","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*계약월*/
URL url = new URL(urlBuilder.toString());
System.out.println(url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
BufferedReader rd;
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
System.out.println(sb.toString());
return sb.toString();
}
}
@Value
값에 주입될 것이다. openapi:
kpikey: password
그리고 보안을 위해 진짜 인증키를 yml에 적지 않고, 환경 변수로 넘겨줄 것이다.
OPENAPI_KPIKEY=[진짜인증키]
📌
@Value
스프링 컨테이너 내부에서 빈을 등록할 때@Value("${}")
안에 맞는 값을 application.yml파일에서 찾아서 넣어준다. 따라서 스프링 빈에 등록되지 않은 객체에서는 @Value 값이 등록되지 않는다.
그리고 처음에는 main 메서드에서 실행했는데, static 변수로 선언된 변수에는 injection할 수 없다고 한다.
@RestController
@RequiredArgsConstructor
public class ApiController {
final private KpiApi kpiApi;
@GetMapping(value = "/api/performs")
public String getPerform() {
String result;
try {
result = kpiApi.getPerform();
} catch (IOException e) {
throw new RuntimeException(e);
}
return result;
}
}
실행한다.
출력화면
Postman에서 요청을 보낸다.