API & REST API

2021. 11. 5. 12:20Web

웹 프로그래밍에 있어 필수적인 개념인 API, 그리고 REST API 에 대해 알아보겠습니다.

두 개념을 먼저 설명한 후 실습을 통하여 이해를 해보겠습니다.

실습코드, 예제는 밑에서 볼 수 있습니다.

 

REST API 란, RESTful API 라는 뜻으로 REST 아키텍처의 제약 조건을 준수하는 API 를 말합니다.

 

우선 API에 대해서 짚고 넘어가야 겠습니다.

 

API 란?

API(Application Programming Interface)의 사전적 정의는 애플리케이션 소프트웨어를 구축하고 통합하는 정의 및 프로토콜 세트입니다. 

API를 사용하면 사용자가 구현방식을 알지 못해도 생산자(서버)에게 필요한 정보를 요구할 수 있습니다.

 

 

무슨 내용인지 이해하기가 쉽지 않네요. 밑의 예를 보겠습니다.

  • 손님은 웨이터를 불러 음식을 주문한다.
  • 웨이터는 요리사에게 음식 주문을 요청(request) 합니다.
  • 요리사는 요리가 완료되면 웨이터에게 음식을 전달합니다.
  • 웨이터는 손님에게 음식을 제공합니다.

출처: Imgur: The magic of the Internet

웨이터가 손님이 필요한 리소스를 요리사에게 요청해 손님에게 가져다주는 모습입니다. 손님은 응용 프로그램, 요리사는 요리를 만들어 전달하는 운영체제라고 볼 수 있습니다. 이 둘을 연결하는 웨이터가 API입니다.

 

또 API란 응용 프로그램 간에 데이터를 주고 받기 위한 방법(규격) 으로,

 

특정 사이트에서

어떤 방식으로 정보를 요청(request) 해야 하는가?

어떤 데이터를 제공받을 수 있는가?

- 데이터를 주고받는데 정해진 규격, 메뉴얼

- 어떤 소프트웨어가 다른 소프트웨어로부터 지정된 형식으로 요청, 명령을 받을 수 있는 수단

을 의미하기도 합니다.

 

API 실습

 

Themoviedb api 를 사용하여 영화 프로그램을 만들어 보았습니다.

 

DB 출처: https://api.themoviedb.org

프로젝트 주소: Jungsu-lilly/9-JSProjects (github.com)

 

GitHub - Jungsu-lilly/9-JSProjects

Contribute to Jungsu-lilly/9-JSProjects development by creating an account on GitHub.

github.com

 

구현 기능

1.  영화 목록 로딩

2.  영화 검색하기

3. 각 영화 별 평점 및 영화 개요

 

자세한 설명이나 코드는 깃허브를 참고해주시면 되겠습니다.

 

 

SEARCH 하는 과정을 살펴볼까요?

 

사용자: Harry Potter 영화 시리즈를 알고 싶어! ㅡ> harry potter  검색

 

그러면 이 프로젝트는 

`https://api.themoviedb.org/3/search/movie?api_key=${KEY}&query=harry potter`;

라는 Search API 를 통해 해리포터 영화를 보여줍니다.

그리고 이 API는 themoviedb api 에서 정해진 규격에 따라 저희가 작성한 것입니다. 즉,

 

- 해당 사이트의 API에 따라서 해리포터 영화 목록을 보았다.

- API에 따라 영화 포스터 이미지, 평점을 볼 수 있음

 

API의 개념이 뭐였죠?

어떤 특정 사이트에서 특정한 데이터를 공유하는 경우

어떤 방식으로 정보를 요청(request) 해야 하는가?

어떤 데이터를 제공받을 수 있는가?

이러한 정해진 규격들이 API 입니다.

 

이뿐만이 아니라 우리는 다양한 목적에 맞는 API를 선택해서 다양하게 활용 가능합니다.

 

여유가 된다면 위의 themovie api주소로 가서 다양한 API를 활용해보시면 크게 도움이 될 것입니다.

 

API  KEY

근래 대부분의 서비스들은 API를 기반으로 통신합니다. 앱과 서버, 웹클라이언트와 서비스 간 대부분의 통신이 API를 통해 이루어지기 때문에 한 번 보안이 뚫리면 해커들, 나쁜 개인들이 개인정보를 악용할 수 있는 심각한 문제가 벌어지게 됩니다.

 

위 프로젝트에서는 API 인증 방식 중 하나인 API KEY 를 통해 moviedb 에 접근 권한을 얻고, API를 사용했습니다. 

 

API KEY

가장 기초적인 방법입니다. API KEY란 특정 사용자만 알 수 있는 문자열입니다.(key 값)

모든 클라이언트가 같은 API 키를 공유하므로, API 키가 한번 노출되면 전체 API가 뚫려버립니다. 따라서 높은 보안 인증이 필요할 때에는 권장되지 않습니다.

 

  • API를 사용하고자 할 때 사용자는 API를 제공하는 사이트, 페이지에서 API 키를 발급받습니다.
  • API를 호출할 때 API 키를 메시지 안에 넣어서 호출합니다.
  • 서버는 메시지 안에서 API키를 읽어 누가 호출했는지를 인증합니다.

 

REST API

RESTful API 라는 뜻으로, REST 형식을 따르는 API입니다.

 

REST 란?

자원을 이름으로 구분하여 해당 리소스의 상태 정보를 주고 받는 모든 것.

즉, 리소스의 표현(representation) 에 의한 상태 전달을 뜻합니다.

각 요청이 어떤 동작이나 정보를 위한 것인지를 그 요청의 모습 자체로 추론이 가능한 것입니다.

 

예를 들어, 한 개발자가 

"REST 그딴거 난 모르겠고! 기능만 잘 돌아가면 된거 아니야?"

라며 다음과 같은 API를 작성합니다.

 

https://(사이트도메인)/hello-myboy : 유저 리스트 불러오기

https://(도메인)/다람쥐 : 유저 정보 삭제.

 

나중에 이 프로젝트를 이어받을 다른 개발자들이나, 이 API를 사용하는 사람들은 정말 곤란할 것입니다.

"다람쥐 가 뭔데" 라며 이렇게 API를 작성한 개발자를 쌍욕을 할 수도 있겠죠.

위처럼 API를 작성하면 매우 곤란하다는 것을 아시겠나요?

 

API를 작성할 때에는 누가나 요청을 보면 대략적으로 알 수 있게, 코드를 RESTful 하게 짜는 것이 중요합니다.

 

 

RESTAPI = HTTP methods + URL    로 표현합니다.

 

우선 URL부터 살펴봅시다.

어떻게 요청하는 URL을 잘 작성할 수 있을까요?

 

URL 작성 규칙

1. Remove all verbs in URL : only nouns

2. 소문자를 사용한다.

3. Unique identifier (고유 식별자)

 

 

안좋은 API 작성예시를 봅시다. 아래 API는 영화 관련 API 들입니다.

  /createMovie

  /seeMovies

  /getMovie/Dewn

  /deleteMovie/Dewn

 

우리는 작성 규칙에 따라 위 4가지 URL을

 movies/dewn 으로 통일할 수 있겠습니다.

 

 

HTTP methods

REST API는 CRUD 기능을 수행하도록 설계해야 하는데요,이를 HTTP 메서드로 표현합니다.

 

CRUD :

Create, Read, Update, Delete

※ 모든 사이트가 CRUD 를 전부 포함하는 것은 아닙니다!

100%인 것을 없습니다. 사이트마다 사용하는 메서드가 다를 수 있습니다.

 

4 http request methods

GET - Read

POST - Create

PUT - Update

DELETE delete       ㅡ>      CRUD

 

 

REST API 작성 예시

 

GET  /movies    : get all movies list

GET  /movies/harry-potter/actors    : ‘Harry Potter’ 영화의 배우 정보 열람

 

POST  /movies     : 영화 생성

Delete  /movies/dewn     : delete ‘Dewn

PUT  /movies/dewn     :  ‘Dewn영화 수정

 

Search & filtering 을 하는 경우는 어떻게 작성할 수 있을까요?

Query Parameters 이용할수 있습니다.

GET  /movies?release_date=2021

GET  /movies?sort_by=popularity.desc

GET /movies?sort_by=popularity.asc&page=4&release_date=2021

'Web' 카테고리의 다른 글

Node.js 특징과 장단점  (0) 2021.11.01
정적 언어와 동적 언어  (0) 2021.10.12