박상권의 삽질블로그

[AWS]API Gateway - RESTful API만들기 본문

IT/AWS

[AWS]API Gateway - RESTful API만들기

박상권 2016. 7. 20. 09:53

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여


블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기


이번에 '클린 아키텍처'를 주제로 온라인 강의를 개설하게 되었습니다 🎉
평소 오픈채팅방이나 여러 커뮤니티에서 '클린 아키텍처'와 관련된 질문들이 많았는데요. 이를 해결해줄 수 있는 마땅한 강의가 없었던것 같습니다.
평소 '클린 아키텍처' 에 대한 궁금증이나 관심이 있으셨던 분들이 수강해보시면 도움이 될것 같아요
강의 살펴보기



AWS Lambda의 소개 및 서버없이 Restful API서버구성을 만드는 방법이 궁금하시다면 아래 블로그부터 확인하시고 이 글을 따라오시길 권장합니다.

[IT/AWS] - [AWS]서버없이 Lambda와 API Gateway로 서버API 만들기






REST API가 뭐지?

REST는 Representational state transfer의 약자로, 월드와이드웹과 같은 분산 하이퍼미디어 시스템에서 운영되는 소프트웨어 아키텍처스타일입니다.

2000년에 Roy Fielding에 의해 처음 용어가 사용되었는데, 이 분은 HTTP/1.0, 1.1 스펙 작성에 참여했었고 아파치 HTTP 서버 프로젝트의 공동설립자이기도 합니다.


REST는 HTTP/1.1 스펙과 동시에 만들어졌는데, HTTP 프로토콜을 정확히 의도에 맞게 활용하여 디자인하게 유도하고 있기 때문에 디자인 기준이 명확해지며, 의미적인 범용성을 지니므로 중간 계층의 컴포넌트들이 서비스를 최적화하는 데 도움이 됩니다.

REST의 기본 원칙을 성실히 지킨 서비스 디자인은 “RESTful 하다.” 라고 흔히 표현합니다.


spoqa 기술블로그 'REST 아키텍처를 훌륭하게 적용하기 위한 몇 가지 디자인 팁' 에서




용어에 대한 정의는 항상 읽어도 읽어도 공대생인 저에게는 어려운 말입니다...








RESTful 하게 API를 구성했다고 하는건 여러가지 필요한것들이 있겠지만,

HTTP method인 POST, GET, PUT, DELETE에 해당하는 액션만 잘 이해하고 있어도 반이상은 구성하셨다고 볼 수 있습니다.


여기서 각 method는 아래와 같은 의미입니다.

- POST: 새로 생성(Create)

- GET: 조회(Read)

- PUT: 수정(Update)

- DELETE: 삭제(delete)


또한 같은 method이더라도 API에서 사용하는 url인 resource주소가 어떻게 구성되느냐에 따라서 각각 다른 동작을 수행하도록 되어있습니다.

아래의 표를 제대로 이해하고 계신다면 RESTful API를 구성하실 준비는 끝났다고 봐도 됩니다.




사실 RESTful하게 API를 구성하시려면 이 외에도 좀더 많은것을 아셔야 할 부분이 있습니다.

아래 블로그를 참고하시면 도움이 되실겁니다.


REST 아키텍처를 훌륭하게 적용하기 위한 몇 가지 디자인 팁 

RESTFul이란 무엇인가?

당신의 API가 Restful 하지 않은 5가지 증거







API Gateway로 RESTful API구성하기




기본설정


사실 API Gateway는 여기로 들어온 요청을 지정된곳으로 리다이렉트해주는 개념정도로 볼 수 있습니다.

우리는 POST, GET, PUT, DELETE로 요청된 resource를 일반적인 http로 보내는것이 아니라 Lambda Function을 실행하도록 구성할 것입니다.

Lambda를 구성하는 방법에 대해서 궁금하시다면 아래 포스팅을 한번 읽고 시작하시는것이 좋습니다.

[AWS]Lambda의 시작 - 'Hello World' 출력하기




1. AWS콘솔에서 API Gateway서비스로 이동합니다.

2. 처음 만드시는 경우라면 [Get Started Now]버튼을 눌러 시작합니다.



이전에 만드신적이 있다면 [Create API]를 클릭합니다.







3. API이름과 설명을 적으신후 [Create API]를 클릭합니다.







4. 위의 예제처럼 /dogs 라는 resource를 생성해주기위헤 [Create Resource]를 클릭해줍니다.





5. Resource Name으로 'dogs'를 입력해주면 아래에 path도 함께 같은 내용으로 채워집니다.







6. resource가 만들어졌다면 POST, GET, PUT, DELETE에 맞게 각각 [Create Method]를 클릭해서 생성해주는 작업을 하면됩니다.








POST



[Create Method]를 클릭한뒤 POST를 선택하고 체크아이콘을 클릭해줍니다.






Integration type에서 'Labmda Funtion'을 선택해 줍니다.

미리 POST에 해당하는 Lambda Funtion을 만드셨다면 선택하면 되겠지만, 처음 시작할때는 당연히 없을겁니다.






GET,PUT,DELETE도 마찬가지로 Lambda function을 먼저 만들고 그뒤에 API Gateway에서 각각에 맞는 Lambda function으로 할당해주어야 합니다.

그렇기때문에 우리는 먼저 Lambda Funtion을 구성해주어야 합니다.





Lambda function을 새로 만들때 'Configure triggers' 라는 단계가 새로 생겼습니다.

예전에는 API Gateway에서 resource와 method를 만들고 Lambda를 만들었지만,

지금은 거꾸로 Lambda를 만드는 시점에 API Gateway의 resource와 method를 만들어 줄수도 있습니다.





위에서 우리가 만든 API name과 resource name 그리고 POST method를 선택하고 [Next]를 클릭합니다.






Lambda code에는 요청에 대해서 무조건 성공응답을 보내고 request를 출력해보기 위해서 console.log()를 찍는 소스코드를 넣어줍니다.






작성한 내용을 확인하고 [Create funtion]을 클릭합니다.





function을 만들고 나면 아래와 같이 Lambda를 trigger 시키는 것들에 대해서 보여지게 됩니다.

우리는 API Gateway를 연결해두었기 때문에 해당 resource의 url로 POST 전송을 하면 동작할 것입니다.

위의 [Test]버튼을 눌러 테스트를 해보겠습니다.





테스트에 들어갈 event 내용은 원하시는 형태로 아무거나 테스트로 넣으시면 됩니다.






테스트 결과는 아래와 같습니다.

우리가 Lambda function 코드에서 항상 ""을 리턴해주고 event로 들어온값을 로그로 찍어준것처럼 아래에 그대로 로그와 응답으로 넘어오게 됩니다.





기본적인 POST로의 연동은 끝났습니다.

나중에 실제 구현하실때는 /dogs의 POST는 dog 데이터를 생성해주는 작업을 하는 API이므로 event에서 받은 값들을 우리의 DB에 저장하는 코드를 Lambda function 코드에 넣어주면 됩니다.









GET



GET의 방법도 위의 POST를 구성하는 방식과 동일합니다.

/dogs의 GET은 dog 와 관련된 테이블의 모든 데이터 리스트를 리턴해주는 작업을 해주어야 하므로 DB에서 해당 dog 데이터들을 불러와서

context.succeed()함수 결과에 데이터리스트들을 리턴시켜주면 됩니다.






PUT

DELETE


PUT과 DELETE는 /dogs 가 아닌 /dogs/1 과 같은 특정 dog의 id에 대한 동작입니다.

PUT /dogs/1 은 1번 데이터에 해당하는 dog 정보를 수정하는 작업이고,

DELTE /dogs/1 은 1번 데이터에 해당하는 dog 정보를 삭제하는 작업입니다.



그렇기때문에 아래 그림처럼 /dogs 아래에 새로운 resource를 생성해줍니다.






여기서 /dogs 아래에 생기는 resource이름이 중요합니다.

PUT, DELETE의 경우 수정,삭제하고자 하는 db id를 path로 넘겨줄것입니다.


PUT /dogs/1

PUT /dogs/123

PUT /dogs/123456

PUT /dogs/7777


그렇기때문에 우리는 resource path에 {id} 로 만들어주어 어떤 path parameter도 받아줄 수 있도록 구성합니다.

그림에도 이와같은 설며이 잘 나와 있습니다.







이제 resource를 만들었으니 PUT,DELETE를 위한 Lambda funtion을 만들어줍니다.

POST에서 만들던 방법대로  resource name과 method를 선택해줍니다.










PUT,DELTE Lambda코드에서는 특별히 id라는 path 파라미터가 들어오기때문에 이 파라미터를 잘 가져올수 있는지를 보기 위하여 받아온 id를 리턴하는 코드로 작성해 보겠습니다.











POST,GET에서는 위의 단계까지만 하면 끝이었지만 PUT,DELETE는 오류가 발생합니다.

Request의 정보들을 각각 body와 path 그리고 기타 request와 관련된 정보들을 함께 넣어주는 템플릿 개념을 추가해주어야 합니다.

자세한 설명은 아래에 하겠습니다.




API Gateway에서 [Integration Request]를 눌러줍니다.









아래의 [Body Mapping Templates]에서 요청하는 request의 Content-Type을 지정해주시고 가장 기본으로 되어있는 템플릿을 지정합니다.

자신만의 템플릿을 위해서 해당 템플릿을 가지고 원하시는대로 수정하실 수 있습니다.









requst를 위한 integration을 거치고 [Test]를 수행해줍니다.









path 파라미터에 12345를 넣는다는 의미는 PUT /dogs/12345를 실행한다는 의미와 같습니다.








이렇게 실행을 해주면 우리가 앞서 코드에 넣어둔대로 path로 받은 12345의 id를 결과로 리턴해주게 됩니다.

그 뿐만 아니라 로그를 보시면 우리가 설정한 템플릿에 나와있는대로 각각 body,params 그리고 기타 context들을 출력해주게 됩니다.





PUT,DELTE에서 /dogs/12345로 요청하면서 body에 {"id": "gun0912"}로 들어오고 로그를 찍는것까지 해보았습니다.

실제 dogs의 12345데이터를 수정,삭제하는 작업은 그 다음단계에서 DB와 연동해서 작업을 해주시면됩니다.








Lambda와 API Gateway의 화면이나 구성하는 방법이 계속 바뀌기 때문에 이 글을 읽는 시점에서 위의 단계가 맞지 않을 수도 있습니다...




하지만 이 블로그 포스팅을 참고하셔서 각각 POST / GET / PUT / DELETE API를 구성하는 원리를 이해하시고 만드신다면 좀더 이해가 빠르실 겁니다.




지금까지 아래와 같은 단계를 통해 포스팅이 이루어졌습니다.

[AWS]서버없이 Lambda와 API Gateway로 서버API 만들기

[AWS]Lambda의 시작 - 'Hello World' 출력하기

[카카오톡 옐로아이디]자동응답API 설정하기



맨 마지막에는 이 모든걸 종합해서 옐로우아이디에서 채팅을 보내면 보낸내용을 그대로 보내주는 봇을 구성하는 포스팅을 작성해 보겠습니다.

( 옐로아이디 <-> API Gateway  <-> Lambda )








이미 적용되어있는  옐로아이디를 테스트해보고 싶으시다면

아래 예시처럼 친구찾기에서 '박상권'을 검색하신뒤 친구추가하시고 테스트해보시거나 아래 링크를 따라서 친구추가해보시면 됩니다.

http://plus.kakao.com/home/ltrrr3dq



                







감사합니다.

Comments