Open Api를 스프링 부트에서 사용

유요한·2023년 3월 1일
0

Spring Boot

목록 보기
12/25
post-thumbnail

API란?

Application Programming Interface의 약자로, 특정 프로그램을 만들기 위해 제공되는 모듈(함수 등)을 의미한다. API란 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신 할 수 있게하는 메커니즘 입니다. 예를들어, 기상청의 소프트웨어 시스템에는 일일 기상 데이터가 들어 있습니다. 휴대폰의 날씨 앱은 API를 통해 이 시스템과 "대화"하고 휴대폰에 매일 최신 날씨 정보를 표시합니다.

애플리케이션(응용프로그램)에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 즉, 애플리케이션이 어떤 프로그램이 제공하는 기능을 사용할 수 있게 만든 매개체다.

컴퓨터와 인간을 연결시키는 사용자 인터페이스(UI)와 반대로, API는 컴퓨터나 소프트웨어를 서로 연결한다.

서버는 프로그램에게 자신이 제공하고자 하는 데이터나 기능을 제어할 수 있는 API로 만들면, 접근 권한이 있는 프로그래머나 프로그램이 API를 통해 서버에서 제공하는 데이터를 요청해서 사용할 수 있게 된다. 예로 날씨 정보 앱을 만들려면, 기상청(서버)이 제공하는 API에 원하는 날씨 정보를 요청해 데이터를 받은 다음 UI 형태로를 사용자에게 날씨 정보를 제공할 수 있다. 더 자세히는 기상청이 DB서버에 날씨 정보를 보관해놓고, 다른 응용 프로그램들이 DB서버에서 날씨 데이터를 조회하고 조작할 수 있도록 API를 미리 개발해놓는다. API의 한 가지 목적은 서버 시스템이 동작하는 방식에 관한 내부의 프로세스를 숨기는 것으로, 내부의 세세한 부분이 나중에 변경되더라도 프로그래머가 유용하게 사용할 수 있고 일정하게 관리할 수 있는 부분들만 노출시킨다.

API 의미

API는 Application Programming Interface(애플리케이션 프로그램 인터페이스)의 줄임말입니다. API의 맥락에서 애플리케이션이라는 단어는 고유한 기능을 가진 모든 소프트웨어를 나타냅니다. 인터페이스는 두 애플리케이션 간의 서비스 계약이라고 할 수 있습니다. 이 계약은 요청과 응답을 사용하여 두 애플리케이션이 서로 통신하는 방법을 정의합니다.

API 생성 방법

  1. API 계획

    OpenAPI와 같은 API 사양은 API 설계를 위한 블루프린트를 제공합니다. 다양한 사용 사례를 미리 생각하고 API가 현재 API 개발 표준을 준수하는지 확인하는 것이 좋습니다.

  2. API 빌드

    API 디자이너는 상용 코드를 사용하여 API 프로토타입을 생성합니다. 프로토타입이 테스트되면 개발자는 내부 사양에 맞게 이를 사용자 지정할 수 있습니다.

  3. API 테스트

    API 테스트는 소프트웨어 테스트와 동일하며 버그 및 결함을 방지하기 위해 수행되어야 합니다. API 테스트 도구로 사이버 공격에 대비하여 API를 강화할 수 있습니다.

  4. API 문서화
    API는 그 자체로 설명이 필요 없지만 API 문서는 사용 편의성은 높이는 가이드 역할을 합니다. 다양한 기능과 사용 사례를 제공하는 잘 문서화된 API는 서비스 지향 아키텍처에서 더 많이 사용되는 경향이 있습니다.

  5. API 마케팅
    Amazon이 소매용 온라인 마켓플레이스인 것처럼 API 마켓플레이스는 개발자가 다른 API를 사고 팔기 위해 존재합니다. API를 나열하여 수익을 창출할 수 있습니다.

네이버개발자센터

  1. 여기에 들어가서 애플리케이션 등록을 해준다.

  2. 여기서 자신이 필요한 것을 찾아서 등록하면 된다.

  3. 상단에서 서비스 API의 검색으로 들어가면 자바 코드를 확인할 수 있습니다.

// 네이버 검색 API 예제 - 블로그 검색
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;


public class ApiExamSearchBlog {


    public static void main(String[] args) {
        String clientId = "YOUR_CLIENT_ID"; //애플리케이션 클라이언트 아이디
        String clientSecret = "YOUR_CLIENT_SECRET"; //애플리케이션 클라이언트 시크릿


        String text = null;
        try {
            text = URLEncoder.encode("그린팩토리", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("검색어 인코딩 실패",e);
        }


        String apiURL = "https://openapi.naver.com/v1/search/webkr?query=" + text;    // JSON 결과
        //String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text; // XML 결과


        Map<String, String> requestHeaders = new HashMap<>();
        requestHeaders.put("X-Naver-Client-Id", clientId);
        requestHeaders.put("X-Naver-Client-Secret", clientSecret);
        String responseBody = get(apiURL,requestHeaders);


        System.out.println(responseBody);
    }


    private static String get(String apiUrl, Map<String, String> requestHeaders){
        HttpURLConnection con = connect(apiUrl);
        try {
            con.setRequestMethod("GET");
            for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
                con.setRequestProperty(header.getKey(), header.getValue());
            }


            int responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
                return readBody(con.getInputStream());
            } else { // 오류 발생
                return readBody(con.getErrorStream());
            }
        } catch (IOException e) {
            throw new RuntimeException("API 요청과 응답 실패", e);
        } finally {
            con.disconnect();
        }
    }


    private static HttpURLConnection connect(String apiUrl){
        try {
            URL url = new URL(apiUrl);
            return (HttpURLConnection)url.openConnection();
        } catch (MalformedURLException e) {
            throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
        } catch (IOException e) {
            throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
        }
    }


    private static String readBody(InputStream body){
        InputStreamReader streamReader = new InputStreamReader(body);


        try (BufferedReader lineReader = new BufferedReader(streamReader)) {
            StringBuilder responseBody = new StringBuilder();


            String line;
            while ((line = lineReader.readLine()) != null) {
                responseBody.append(line);
            }


            return responseBody.toString();
        } catch (IOException e) {
            throw new RuntimeException("API 응답을 읽는 데 실패했습니다.", e);
        }
    }
}

이부분이 JSON으로 할지, XML로 할지 결정하는 것이다.


여기는 내 애플리케이션에서 애플리케이션 정보에서 Client IDClient Secret을 확인하면 됩니다.




공공(오픈) 데이터 API

공개 데이터 API를 오픈 데이터 API라고 합니다.


Open API를 사용해보자

승인이 된 후 1~2시간 정도 뒤에 Api쓸 수 있다는 알림이 나타납니다.

개발계정 상세보기 창이 나타나는데 여기서 일반 인증키 - 사진에서는 비어있지만 인증키가 들어있습니다. 이것은 api를 호출할 때 파라미터로 들어가게 됩니다.

EndPoint - 호출 url 입니다. 이 두가지와 Api에서 정해놓은 파라미터들을 이용해 데이터를 가져올 수 있습니다. 활용신청 상세기능 정보에 있는 미리보기란에서 어떤 Request를 했을 때 어떤 Response가 오는지 확인할 수 있고 위에서 말한것처럼 승인이 되고 Api사용까지 시간이 좀 걸리는데 Api사용 인증이 아직 되어있지 않다면 미리보기에서 오류가 발생하게 됩니다. 이 부분은 보통 기다리시면 해결되는 것 같습니다.

저 미리보기를 눌러서 데이터를 받아오면 Response된 데이터들을 볼 수 있습니다. 여기까지가 Open API 신청입니다.


Open API를 Spring Boot와 연결하기

Api에서 데이터를 확인하기 위해 RestController를 하나 생성합니다.

매핑할 url은 원하시는대로 작성해주시면 되고 String urlStr의 첫 부분을 신청한 OpenApi의 EndPoint를 넣어줍니다. 끝 부분에 " ? "를 삽입해주세요.

이 후의 파라미터를 살펴보면 serviceKey= 저는 지워놔서 비어보이지만 이 부분에 마찬가지로 신청한 Api의 serviceKey를 넣어줍니다. pageNo= 표시할 페이지번호, numOfRows=표시할 데이터의 수, type= xml 혹은 json 원하는 방식으로 리턴하게 합니다. (xml이나 json만을 지원하는 것도 있음)

url(urlString)으로 url을 생성하고 설정 작업을 마친 후 url을 통해 받아온 json코드를 StringBuilder인 result에 담은 뒤에 urlConnection.disconnect()로 연결을 끊어주고 return result.toString()이 동작하게 된다면 주소창에 localhost:8080/api를 입력했을 때

이런 화면이 나온다면 데이터를 받아오는것이 완료되었습니다.

하지만 이 데이터들을 사용하려면 가공을 해야하기 때문에 JSON-parsing을 해야합니다. 많은 JSON 라이브러리가 있지만, 저는 간편한 json-simple이란 라이브러리를 사용합니다.

profile
발전하기 위한 공부

0개의 댓글