본문 바로가기
Web/Web 이론

REST(Representational State Transfer) API

by DUSTIN KANG 2020. 9. 21.

웹의 동작

우리가 웹 사이트에서 어떠한 기능을 이용할 때 클라이언트와 서버 간의 요청, 응답이 이루어진다.

클라이언-서버 구조는 개발 분야에 상관없이 알아야할 개념이다. 다음 그림과 같이 클라이언트와 서버 통신 과정이 이루어진다.

클라이언트와 서버의 요청 및 응답 구조

 

클라이언트(고객)은 요청을 보낸 후, 응답할 때까지 기다린다. 그리고 서버는 받은 요청을 처리한 후, 클라이언트에게 응답을 전송하는 구조이다. 이때, 전달하는 자원의 주소는 URI에 따라 다르게 정해진다. 

조금 더 깊에 들어가면, 서버에는 정적인 콘텐츠를 처리하는 Web Server가 있고 동적인 콘텐츠를 처리하는 WAS(Web Application Server)가 있다. 반드시 WAS나 웹서버가 필요하진 않지만 유연한 비즈니스 처리를 위해 사용하는 것이 좋다. 

  • Web Server : 클라이언트에게 요청을 받아 경로와 일치한 정적인 콘텐츠(이미지, html, 폰트등)를 반환한다. (Ngnix)
  • WAS(웹 애플리케이션 서버) : DB 조회나 비즈니스 로직 처리, 로그인 처리를 요구하는 동적인 콘텐츠를 제공하기 위해 만들어진 서버이다.(Gunicorm, uWSGI, Express.js)

물론, 다양한 구조 방식을 가질 수 있지만 효율적인 기능 분산 처리를 위해 사용하면 서버에 대한 부담을 줄일 수 있다.

Django는 WAS가 아닌가?
Django나 Flask와 같은 웹 개발 프레임워크는 개발용 WAS 서버이다. 만약, 해당 프로덕트를 배포하고자할 경우, WSGI 서버를 사용해야한다. WSGI는 파이썬에서 애플리케이션과 웹서버와 통신하기 위한 인터페이스이며 미들웨어라고 생각하면 된다. 
Django에서는 `wsgi.py` 파일이 프로젝트 파일에 있는데 이 설정 정보를 통해 gunicorn을 구동시켜 ngnix와 같은 웹서버와 연결시킨다. 
WSGI로 배포하는 방법 - Djagno 공식문서↗

 

HTTP

HTTP(Hypertext Transfer Protocol)은 클라이언트와 서버 사이에서 데이터를 주고 받기 위한 프로토콜(통신 규약)이다.

클라이언트 목적에 따라 적절한 HTTP 메서드를 요청(Request)에 사용한다.

HTTP Method 설명 예시
GET 데이터 조회 요청 페이지 접속 및 검색
POST 데이터 생성 요청 가입, 포스트 작성
PUT 데이터 수정 요청 수정(PATCH : 부분 수정)
DELETE 데이터 삭제 요청 삭제

 

파이썬에서 `requests` 라이브러리를 사용하면 웹 사이트에 정보를 요청할 수  있다. 이전에는 `urlib` 패키지를 사용했었지만 최근 친화적인 문법을 사용하고자 requests를 많이 사용한다고 한다. 주로 데이터 분석을 위해 크롤링 및 스크레이핑을 할 때 많이 사용한다.

더보기

크롤링과 스크레이핑의 차이

  • 스크레이핑(Scraping) : 웹 사이트에 특정 정보(세부적인 정보)를 추출하는 기술
  • 크롤링(Crawling) : 다양한 웹 사이트를 자동으로 탐색과 수집하는 과정(큰 규모의 데이터 수집)
import requests
request = requests.get("https://www.google.co.kr/") # 요청 객체 생성(GET)
request.status_code # 상태코드 : 200
request.rause_for_status() # 상태코드가 200(정상)이 아닌경우 에러 발생

html = request.text.strip() # HTML 소스코드를 추출
request.encoding # 인코딩 정보 확인

 

웹 사이트를 파싱하고자 하는 경우 `BeautifulSoup` 라이브러리를 사용하면 파싱 할 수 있다. 예전에는 BeautifulSoup으로 임포트했지만 지금은 더이상 개발되지 않고 지원도 끊겼기 때문에 `bs4`를 통해 불러와야 한다.

from bs4 import BeautifulSoup

# HTML 코드를 파서를 이용해 BeaultifulSoup 객체로 변환한다.
soup = BeautifulSoup(html, 'html.parser')

BeautifulSoup 공식문서↗

 

  • 웹 페이지의 개발자 도구는 `F12`(Chrome), `⌥ + ⌘ + I` (Safari)를 통해 확인할 수 있다.
더보기

HTTP 상태 코드

  • 1XX : 요청 정보 응답 처리 중인 상태
  • 2XX : 성공적으로 응답을 한 상태
    • 200(OK) : 클라이언트가 보낸 요청을 정상적으로 처리했을 경우 
    • 201 : 
  • 3XX : 리다이렉션 응답 상태
    • 301(Moved Permanently)
    • 302(Found)
  • 4XX : 클라이언트 측 오류로 응답한 상태
    • 400(Bad Request) : 요청 구문이 잘못되었음을 나타낸다. 보통 서버에서 지정한 구문과 다른 경우 발생한다.
    • 401(Unauthorized) : HTTP 인증 정보가 필요한 경우 나타낸다. 비회원이 회원권한 페이지에 접근한 경우 발생한다.
    • 403(Forbidden) : 리소스 접근이 거부될 때 나타낸다. 파일 시스템 권한이 없을 때 발생한다.
    • 404(Not Found) : 요청한 리소스가 서버에 없을 경우 발생한다.
  • 5XX : 서버 측 오류로 응답한 상태
    • 500(Internal Server Error) : 서버에서 요청 도중 에러가 발생한 경우 발생한다.
    • 503(Service Unavaliable) : 일시적인 서버 과부화나 점검 상태일 때 발생한다.

JSON

그렇다면 웹은 어떤 형식으로 데이터를 응답하는 걸까?

주로 JSON이나 XML과 같은 형식으로 데이터를 응답한다. JSON과 XML은 데이터를 전달하기 위해 만들어진 문서이다.

  • XML : HTML과 유사한 문서로 이해하기 쉽게 되어 있다.
  • JSON : XML에 비해 비교적 길이가 짧으며 배열로 사용이 가능해 유용하다는 장점이 있다.

JSON과 XML에는 각기 장단점이 존재하기 때문에 어떤 문서가 우세하다고는 말할 수 없다. JSON는 XML과 다르게 태그를 사용하지 않고  해당 문서를 바로 파싱하기 때문에 빠른 응답을 할 수 있다는 장점을 가지고 있다. 반면 XML은 XML DOM을 아용해 문서에 접근해야한다. 그러나 스키마를 사용해 무결성을 검증할 수 있다는 장점이 있다. JSON은 사용자가 직접 검증을 해야한다. 

 

 

JSON과 XML - TCPSCHOOL.com

JSON vs XML Difference Between Them - GURU99↗

JSON 인코더와 디코더 - 파이썬 공식문서↗

JSON 객체 저장 및 사용하기

  • JSON 객체로 변환하기
import json

user = {
	"id" : "duddudu",
    "password": "du1234"
}

data = json.dump(user, indent=4)
  • JSON 파일 저장
with open("data.json", "w", encoding="utf-8") as file:
	data = json.dump(user, file, indent=4) 
    # indent : JSON을 Pretty하게 만들기 위해 들여쓰기하는 스페이스 횟수를 말함.

 

REST API

REST(Representational Safe Transfer)는 HTTP 프로토콜을 이용해 자원의 상태에 대한 정보를 주고받는 개발방식, 스타일을 말한다. REST의 요소는 "자원", "행위", "표현"으로 구성된다. 이 세가지를 이용해 통신한다.

  • 자원 : URI로 표현한다. ex) 회원(user)
  • 행위 : HTTP 메서드를 이용한다. ex) 회원 가입(POST)
  • 표현 : 페이로드(Payload)를 이용한다. ex) 아이디, 비밀번호
URI는 무엇일까?
URL과 URI는 다르다. URL은 네트워크 상의 위치를 말하고 URI는 리소스의 식별자를 의미한다. URN과 URL을 합쳐 URI라고 한다. 그리고 위치와 상관없이 리소스의 이름이나 ID만을 포함하는 것을 URN이라고 한다. 
그러나 모든 URI가 URL을 반드시 포함하는 것은 아니다. 참고자료: Understanding Difference Between URI, URL, and URN - GEEKFLARE 

 

API(Application Programming Interface)는 프로그램과 사용자간의 상호작용을 위한 인터페이스이다. API는 일반적으로 다음과 같은 예를 들 수 있다. 사용자가 앱에서 날씨를 확인하려면 날씨 데이터베이스를 직접적으로 탐색하는 것이 아니라 API를 통해 알 수 있는 것이다. API의 종류로는 REST API 뿐만 아니라 Websocket API 등이 있다. Websocket API는 클라이언트와 서버간 양방향 통신을 지원하는 API이다. 해당 포스팅에서는 REST API를 중심으로 다루려고 한다.

 

즉 REST API를 호출한다는 말은 REST한 아키텍처를 따르고 있는 서버에 요청을 전송하는 행위를 말한다. 

그렇다면 REST한 API를 설계하기 위해 주의할 점은 무엇이 있을까?

REST API 설계시 주의할 점

  1. URI의 마지막은 슬래시(`/`)를 포함하지 않는다.
    • URI는 유일한 식별자로 사용되어야 하기 때문에 슬래시를 사용하게되면 다른 리소스와 혼동이 될 수 있다.
  2. URI 경로에는 소문자를 사용하며 가독성을 위해 `-`(하이픈)을 사용한다. 
  3. 메세지 바디에는 파일 확장자(`photo.jpg`)를 넣지 않는다. Accept header에 넣는 것이 바람직하다.
  4. 자원을 컬렉션과 도큐먼트로 작성하면 이해하기 쉬워진다. 여기서 컬렉션은 문서(도큐먼트, document)의 집합을 말한다. 컬렉션은 복수로 사용하게 되면 이해하기 쉬운 URI를 설계할 수 있다. 

REST API 목킹 사이트(JSON Placeholder)↗

 


☕️ 포스팅이 도움이 되었던 자료

오늘도 저의 포스트를 읽어주셔서 감사합니다.

설명이 부족하거나 이해하기 어렵거나 잘못된 부분이 있으면 부담없이 댓글로 남겨주시면 감사하겠습니다.

'Web > Web 이론' 카테고리의 다른 글

전반적인 웹 통신 과정  (0) 2023.12.10
JWT(Json Web Token)에 대한 이론적 이해  (0) 2023.12.06