클라이언트와 서버는 어떤 방법으로 데이터를 주고받을까?
한 문장으로 요약하면, 서버는 용도에 따른 기능들을 만들어 그에 맞는 이름(URI)를 붙이고, 클라이언트는 필요에 따라 해당 이름(URI)에 요청을 보낸다. 이를 API라고 부른다.
서버는 http 요청을 받아 해당 API의 내용을 수행하고 응답을 돌려보낸다.
클라이언트는, http 요청을 보낼 수 있다면 누구든 그 서버와 통신이 가능하다. PC 앱, 모바일앱 등 상관없이 인터넷에 연결되어 있기만 하면 된다.
1. API 서버
서버는 미리 API를 정의해둔다. 예를 들어,
"우리 블로그의 Web 카테고리 목록의 글들을 보고 싶으면, Get이라는 method로, /category/Web 이라는 URI에 요청을 보내세요."
우리가 웹 브라우저 주소창에 치는 것은 Get method이다. 단순히 정보를 조회할 때에는 Get method를 쓴다.
주소창에 http://dev-ljp.tistory.com/category/Web 이라고 치면, dev-ljp.tistory.com 라는 서버의 /category/Web 이라는 URI에 요청을 보내게 된다.
그러면, 보는 그대로 Web 카테고리의 글 목록을 보게 된다.
이처럼 서버에서는 굉장히 다양한 기능들을 URI 단위로 만들어둔다.
예를 들어서, 커피 목록을 관리하는 서버를 계획한다면, 간략히 아래처럼 구성할 수 있다.
No. |
API |
URI |
Method |
Request(요청) example | Response(응답) example |
1 |
커피 목록 가져오기 |
/coffees |
Get |
http://my-server.com/coffees | { "coffees": [ "아메리카노", "카푸치노" ], "code": 200 }
|
2 |
새 커피 추가 | /coffees/:name |
Post |
http://my-server.com/coffees/americano | { "code": 200 } |
3 |
커피 삭제 | /coffees/:name |
Delete |
http://my-server.com/coffees/americano | { "code": 200 } |
아주 단순히 계획해서 3개만 만들었지만, 제대로 서비스를 계획한다면 수십 개의 API를 디자인하게 된다.
서버는 위처럼 Method와 URI를 보고, 어떤 일을 수행해서 응답을 해줄지 결정한다. 이외에도 Parameter 정보를 받기도 한다.
그리고 이를 구현할 땐, Node.JS로 예를 들면 아래와 같이 코드를 작성한다. 위 2번 "새 커피 추가"를 예로 들었다.
app.post("/coffees/:name", function (req, res) { // 요청한 커피 이름 받기 var name = req.parames.name; // 새 커피 추가 coffees.push(name); // 응답 res.json({ "code": 200 }); }); |
실제 코드에서는 입력이 올바른지 여부 등을 따지기도 하고, DB와 연동하는 코드도 있고 훨씬 더 복잡하지만, 최대한 간략히 예를 들었다.
위처럼 API별로 구현해놓고 서버를 실행하면, 서버는 요청을 받을 준비가 되었다. 프로세스가 계속 살아있으면서 누군가 요청을 보내길 기다리고, 요청을 받으면 위 function을 수행해서 응답을 보낸다.
위 API들을 구현한, 실제로 동작하는 NodeJS 코드는 아래 링크에서 볼 수 있다. DB 연동은 없이, 배열 변수에 커피를 추가/제거하는 코드이다.
https://github.com/hyonzin/api-example/blob/master/app.js
Method |
http 요청의 method로는 4가지가 많이 쓰인다. Post: 새로운 정보 삽입 Get: 정보 조회 Put: 정보 수정 Delete: 정보 삭제
위 4개를 통틀어서, CRUD (Create, Read, Update, Delete) 라고 부른다. |
프레임워크 |
API 서버를 구현하기 쉬운 서버 프레임워크가 많이 있다. javascript 언어 기반의 프레임워크인 NodeJS, (노드 제이에스) python 언어 기반의 프레임워크인 Django, (장고) java 언어 기반의 프레임워크인 Spring 이외에도 많은 종류가 있다. |
2. 클라이언트
1.처럼 서버를 잘 구성했다면, 클라이언트는 어떻게 만들면 될까?
서버의 API들을 잘 구성해놓았다면, 클라이언트가 어느 종류이든 누구나 서버와 소통할 수 있다.
구글 크롬과 같은 웹 브라우저뿐만 아니라, 어떤 운영체제(Windows, Mac, Android, IOS 등)에서든, 어떤 언어(C/C++, Java, Swift, Python 등)든 상관없이, HTTP 요청을 보낼 수만 있다면 서버에게 요청을 보내고 응답을 받을 수 있다.
클라이언트의 예시를 보고싶다면, 구글에 "안드로이드 http request", "IOS http request", "javascript http request" 등으로 검색하면 예제 코드를 많이 볼 수 있다.
웹페이지에서 javascript로 요청을 보내는 예제 코드는 아래 링크에서 볼 수 있다.
https://github.com/hyonzin/api-example/blob/master/static/index.html
포스트맨 (Postman) |
Server의 API를 잘 디자인해서 구현까지 끝내고, 이를 테스트하려고 할 때 클라이언트를 구현할 필요 없이, Postman을 이용하면 http 요청을 보내고 응답을 확인할 수 있다. Method와 URI를 입력하고 보내면 그 응답을 쉽게 확인할 수 있다. |
'Web' 카테고리의 다른 글
웹페이지 랭킹 알고리즘: HITS vs PageRank (4) | 2019.05.19 |
---|---|
Web에 대한 주저리 (0) | 2019.03.08 |