API

유요한·2022년 11월 23일
1

API

목록 보기
1/3
post-thumbnail

API란?

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

API 의미

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

API 작동 방법

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를 나열하여 수익을 창출할 수 있습니다.

    	

Open API

공개 API라고도 불리우며, 누구나 사용할 수 있도록 공개된 API (주로 Rest API 기술을 
많이 사용함)
   








[브라우저 테스트 json, 브라우저 테스트 xml]

[자바 소스 json, 자바 소스 xml]보다시피 브라우저의 URL창에다가 직접 메시지(GET방식)를 날려도 응답이 오는 것을 확인할 수 있고, 자바로 간단하게 소스를 만들어서 요청해도 받아지는 것을 확인할 수 있다.자바 뿐만아니라 다양한 프로그래밍 언어에서 혹은 프레임워크에서 위와 유사한 방식으로 API를 호출하고 결과를 리턴할 수 있을 것이다.
끝으로 API호출하는 샘플 자바소스를 제공한다. (요새는 심지어 OPEN API 페이지에서 공식적으로 여러 언어로 지원한다... 내 원래 샘플코드를 삭제하고 가이드에 있는 코드를 가져왔다. 심지어 여러 언러(java, javascript, c++, php, curl object-c, python, nodejs)로도 샘플 코드를 지원한다.)

	/* Java 샘플 코드 */  
    
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.io.BufferedReader;
    import java.io.IOException; 
    
    public class ApiExplorer {
    	public static void main(String[] args) throws IOException {
        	StringBuilder urlBuilder = new StringBuilder("http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty"); /*URL*/
            urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "=서비스키"); /*Service Key*/        
            urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("10", "UTF-8")); /*한 페이지 결과 수*/        
            urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지 번호*/        
            urlBuilder.append("&" + URLEncoder.encode("stationName","UTF-8") + "=" + URLEncoder.encode("수내동", "UTF-8")); /*측정소 이름*/        
            urlBuilder.append("&" + URLEncoder.encode("dataTerm","UTF-8") + "=" + URLEncoder.encode("DAILY", "UTF-8")); /*요청 데이터기간 (하루 : DAILY, 한달 : MONTH, 3달 : 3MONTH)*/        
            urlBuilder.append("&" + URLEncoder.encode("ver","UTF-8") + "=" + URLEncoder.encode("1.3", "UTF-8")); /*버전별 상세 결과 참고문서 참조*/        
            
            URL url = new URL(urlBuilder.toString());        
            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());    
             }
          }

파라미터에서 "ServiceKey=~" 부분만 자신의 api key로 고치면 아주 잘 동작한다.* 2020.06.03 -> 요새는 ServiceKey값 자체가 URL인코딩이 된 상태로 제공하게 되어있는 것 같다.그래서 위 코드도 serviceKey값만 UTF-8로 인코딩하지 않고 연결하는 것을 볼 수 있다. (나머지 파라미터들은 인코딩 함)


Rest API

  • Representational State Transfer API의 약자로, HTTP프로토콜을 통해 서버 제공 기능을 사용할 수 있는 함수를 의미 일반적으로 XML, JSON의 형태로 응답을 전달(원하는 데이터 추출이 수월)

  • REST는 Representational State Transfer의 줄임말입니다. REST는 클라이언트가 서버 데이터에 엑세스 하는 데 사용할 수 있는 GET, PUT, DELETE 등의 함수 집합을 정의합니다. 클라이언트와 서버는 HTTP를 사용하여 데이터를 정의합니다.

  • REST API의 주된 특징은 '무상태'입니다. 무상태는 서버가 요청간에 클라이언트 데이터를 저장하지 않음을 의미합니다. 서버에 대한 클라이언트 요청은 웹 사이트를 방문하기 위해 브라우저에 입력하는 URL과 유사합니다. 서버의 응답은 웹 페이지의 일반적인 그래픽 렌더링 없는 일반 데이터입니다.

REST API 구성

REST API는 다음과 같이 구성된다.

  • 자원(RESOURCE) - URI

    모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다. 자원을 구별하는 ID는 ‘/groups/:group_id’와 같은 HTTP URI 다. Client는 URI를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.

  • 행위(Verb) - HTTP METHOD

HTTP 프로토콜의 Method(GET, POST, PUT, DELETE)를 사용한다.*

  • 표현(Representations) Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다. REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타내어 질 수 있다. 보통 JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.

💡 HTTP Method
POST : 특정 URI를 요청하면 리소스를 생성한다 (Create)
GET : 특정 리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다 (Read)
PUT : 특정 리소스를 수정한다 (Update)
DELETE : 특정 리소스를 삭제한다 (Delete)

REST API를 사용하면 장점

  1. 통합

API는 새로운 애플리케이션을 기존 소프트웨어 시스템과 통합하는데 사용됩니다.그러면 각 기능을 처음부터 작성할 필요가 없기 때문에 개발 속도가 빨라집니다. API를 사용하여 기존 코드를 활용할 수 있습니다.

  1. 혁신

새로운 앱의 등장으로 전체 산업이 바뀔 수 있습니다. 기업은 신속하게 대응하고 혁신적인 서비스의 신속한 배포를 지원해야 합니다. REST API를 사용하면 코드를 다시 작성할 필요 없이 API 수준에서 변경하여 이를 수행합니다.

  1. 확장

API는 기업이 다양한 플랫폼에서 고객의 요구 사항을 충족할 수 있는 고유한 기회를 제공합니다. 예를 들어 지도 API를 사용하면 웹 사이트, Android, iOS 등을 통해 지도 정보를 통합할 수 있습니다.

  1. 유지 관리의 용이성

API는 두 시스템 간의 게이트웨이 역할을 합니다. API가 영향을 받지 않도록 각 시스템은 내부적으로 변경해야 합니다. 이렇게 하면 한 시스템의 향후 코드 변경이 다른 시스템에 영향을 미치지 않습니다.

REST API를 보호하려면

  1. 인증 토큰

인증 토큰은 사용자에게 API를 호출을 수행할 수 있는 권한을 부여하는데 사용된다. 인증 토큰은 사용자가 자신이 누구인지 확인하고 해당 특정 API호출에 대한 엑세스 권한이 있는지 확인한다.

  1. API 키

API 키는 API를 호출하는 프로그램 또는 애플리케이션을 확인합니다. 즉, 애플리케이션을 식별하고 애플리케이션에 특정 API 호출을 수행하는 데 필요한 엑세스 권한이 있는지 확인합니다. API 키는 토큰만큼 안전하지 않지만 사용량에 대한 데이터를 수집하기 위해 API 모니터링을 허용합니다. 다른 웹 사이트를 방문할 때 브라우저 URL에서 긴 문자열과 숫자가 웹 사이트가 내부 API 호출을 수행하는데 사용하는 API키입니다.

REST API 설계 예시

Spring에서


	 // RestTemplate 에 MessageConverter 세팅
    List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
    converters.add(new FormHttpMessageConverter());
    converters.add(new StringHttpMessageConverter());
 
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setMessageConverters(converters);
 
    // parameter 세팅
    MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
    map.add("str", "thisistest");
 
    // REST API 호출
    String result = restTemplate.postForObject("http://localhost:8082/restTest/", map, String.class);
    System.out.println("------------------ TEST 결과 ------------------");
    System.out.println(result);

profile
발전하기 위한 공부

0개의 댓글