mypage.com/friends/친구이름/assets/자산id - 특정 친구의 특정 자산 정보를 수정함
지금까지는 웹에서 데이터를 가져와 원하는 형식으로 보는 보여주는 코드만 작성했다. 그렇다면 궁금하지 않은가? 웹에서 어떻게 데이터를 제공하는지?
이번엔 우리가 데이터를 제공해보자. 지난 번 글에서 구글 뉴스를 크롤링 했다. 크롤링한 뉴스 정보를 REST API로 제공하는 서비스를 구현해보자.
설명하기에 앞서서 REST API에 대해 알아야 한다.
세종대왕께서 한글을 창제하시고 우리는 그 한글로 글을 읽고 쓸 수 있게 되었다. 한글처럼 우리가 어떠한 데이터를 제공하는 서비스를 만들었다면 사용자에게 매우 편리하고 쉽게 사용할 수 있도록 규칙(인터페이스)을 제공해야 할 것이다. 네이버를 예로 들어보자. 네이버는 사용자의 검색에 대한 검색 결과를 반환한다. API로 내가 네이버 포탈에 query=검색어 라고 요청을 한다면 그 검색어로 매칭되는 결과를 반환해야 할 것이다.
스마트폰이 출시되고 초창기에 여러 앱들이 출시되었다. 홈페이지에서 기능을 제공하더라도스마트폰용, 태블릿용 앱을 다시 만들어야 했다. 안드로이드로 통일되었으면 다행이었겠지만 아이폰 앱, 아이패드 앱도 개발해야 한다. 문제는 화면 크기가 계속 변하기 때문에 그 크기에 맞는 앱을 다시 구현해야 되는 것이 문제이다.
앱을 새로 개발하고 배포하는 것은 매우 힘드므로 웹앱이라는 기술이 나오게 되었다. PC, 스마트폰, 태블릿에 모두 웹이 있으니 웹을 앱처럼 해동하게 하는 것이다. 그리고 웹 브라우저에서 화면의 크기를 받아 크기에 맞춰 페이지 구성 방식을 바꿔서 사용자에게 제공한다.
REST API는 여기에서 강점을 보인다. 모든 것이 웹으로 제공되는 만큼 API도 웹기반 (HTTP 프로토콜)으로 제공하자는 것이다. 원격에 있는 서버에 데이터를 요청(API를 이용)하려면 소켓통신을 해야한다. 하지만 웹 브라우저는 소켓통신을 하기에 적절하지 않다. 그래서 소켓통신 대신 웹페이지를 사용자에게 제공하듯이 브라우저 뒷단에서 웹 데이터를 사용자에게 제공한다면 매우 적절할 것이다.
REST API는 웹기반으로 데이터를 제공하는 API이다. 웹서버에 적절한 데이터를 요청하려면 어떻게 해야할까? 웹주소를 통해 어떤 데이터를 요청할 것인지 구분해야 할 것이다.
데이터를 읽고 쓰고 삭제하고 수정하는 것은 어떻게 표현해야 할까? 브라우저 개발자도구로 request header를 본적이 있는가? 이 안에는 요청할 주소정보가 들어가는데 추가적으로 method필드가 존재한다. 여기에 무엇을 할지 (읽기-get, 생성-post, 수정-put, 삭제-delete) 함께 전달한다. post와 put요청은 http request의 데이터 필드에 데이터를 함께 전달할 수 있다.
예를들어 내 친구정보를 가져오는 API를 만들어보자. 그럼 API를 구현하기 전에 문서를 작성해볼까?
조회: GET
mypage.com/friends - 요청하면 나의 친구 이름을 모두 제공한다. 동명이인은 없다고 가정
mypage.com/friends/친구이름 - 요청하면 친구의 상세정보를 제공한다. 없으면 에러메시지를 반환
생성: POST
mypage.com/friends - 새로운 친구 정보를 생성, http request의 데이터 필드에 친구 정보를 함께 전달
수정: PUT
mypage.com/friends/친구이름 - 친구 정보를 수정함. 수정할 내용은 http request의 데이터 필드에 같이 전달
삭제: DELETE
mypage.com/friends/친구이름 - 친구 정보를 삭제함
친구의 자산을 관리해주는 API를 만들고 싶다면 어떻게 해야할까?
위의 주소에 추가적으로 assets라는 것을 붙인 뒤 친구정보를 생성, 삭제, 조회, 수정했던 것처럼 자산 정보도 동일한 방식으로 생성, 삭제, 조회, 수정하자
:name에는 친구이름을 넣어주면 되고 asset-id에는 자산 아이디를 넣어주면 된다.
조회: GET
mypage.com/friends/친구이름/assets - 특정 친구의 자산 목록을 자산id와 함께 간단히 제공
mypage.com/friends/친구이름/assets/자산id - 특정 친구의 특정 자산에 대한 상세정보를 조회
생성: POST
mypage.com/friends/친구이름/assets - 특정 친구의 신규 자산 정보 생성
수정: PUT
mypage.com/friends/친구이름/assets/자산id - 특정 친구의 특정 자산 정보를 수정함
삭제: DELETE
mypage.com/friends/친구이름/assets/자산id - 특정 친구의 특정 자산 정보를 삭제함
예를들어 철수에게 돈 100만원이라는 자산을 생성하고 싶다면 다음과 같이 전달하면 된다.
URL: mypage.com/friends/철수/assets
Method: POST
Payload: { money: "100만원"}
이제 구글 크롤링한 정보를 제공해주는 코드를 구현해보자. flask를 이용할 것인데 flask는 파이썬 언어에서 웹서버기능을 제공해주는 모듈이다.
키워드를 생성하는 요청을 보낼 때 해당 키워드에 대해 새롭게 크롤링을 돌려주고 싶었는데 코드가 길어져서 그 부분을 추가하지 않았다.
API문서는 다음과 같다.
조회: GET
127.0.0.1/api/keywords: 어떤 키워드에 대해 뉴스를 크롤링 했는지 키워드 목록 전체를 반환해주는 기능
127.0.0.1/api/keywords/키워드: 특정 키워드에대한 크롤링 상세 정보
생성: POST
127.0.0.1/api/keywords: 새로운 키워드를 생성함
삭제: DELETE
127.0.0.1/api/keywords/키워드: 키워드를 삭제하고 크롤링한 모든 뉴스 데이터를 삭제함
flask 사용법은 다음과 같다.
# 반환양식은 google_news_fields에 정의한 양식으로 반환해준다.
google_news_fields = {
'published': fields.String,
'source': fields.String,
'title': fields.String,
'link': fields.String
}
# Flask의 Resource를 상속받은 클래스를 구현하여 무엇을 할지 기능을 작성한다.
# get으로 조회요청을 받으면 크롤링한 뉴스정보를 데이터베이스에서 조회한 뒤 반환해주는 코드이다.