REST API
REST + API
REST 아키텍처를 준수하는 웹 API
RESTful API라고 부르기도 한다.
API
Application Programming Interface
어떤 프로그램에서 다른 프로그램을 사용함에 있어서 이 프로그램이 어떻게 동작하는지는 알 필요 없이 어떤 것을 요청하면 어떤 것을 돌려준다 하는 하나의 약속이다.
서비스나 프로그램 간에 미리 정해진 기능을 실행 할 수 있도록 하는 규약이다.
운영체제 API, 프로그램언어 API, 웹 API 등이 있다.
REST
REpresentational State Transfer
웹에서 어떤 API의 모습만 봐도 무슨 역할을 하는지를 표현하기 위한 하나의 약속의 약속이다.
API를 사용하고 만드는 사람은 제각각이기 때문에, 약속을 정의할 때 규격에 맞춰 약속을 정하자는 것이다.
REST API는 사실 약속이기 때문에 특정한 규칙이 존재하진 않는다.
웹에서 자료를 전송하기 위한 표현 방법에 대한 아키텍쳐다.
REST를 정확하게 구현하기 위해선 많은 제한조건이 있지만,
기본적인 REST 가이드를 따르면 조금 더 좋은 구조의 API를 구성할 수 있다.
REST API 기본 가이드
HTTP Method의 사용
HTTP라고 하는 요청과 응답을 보내는 웹 상의 프로토콜에 대해서 어떤 정보를 요청하겠다고 하는 정보를 담은 것이 HTTP method다.
REST API는 API의 동작을 HTTP method + 명사형 URL로 표현한다.
/posts 라는 URL은 '게시글'이라는 자원을 가리킨다고 할 때, 'GET - 가져오기, POST - 새로 만들기, PUT - 수정하기, DELETE - 삭제하기' 의 HTTP method와 결합하여 API 동작을 정의하여야 한다.
URL 표현법
REST API URL의 자원은 복수형으로 표현되며, (post (x) -> posts(o)) 하나의 자원에 대한 접근은 복수형 + 아이디를 통해 특정 자원에 접근한다./posts는 '게시글 전체'를 칭하는 URL이라고 할 때, /posts/1은 '1번 게시글'이라는 자원을 표현한다.
계층적 자원
REST API는 URL을 통해 자원을 계층적으로 표현한다. /users/1/posts 라는 URL은 '1번 유저의 게시글 전체'라는 자원을 나타낸다.
REST API 정리
REST API는 REST 아키텍쳐를 준수하는 웹 API를 의미하며,URL을 통한 자원의 표현 방법과 HTTP method를 통한 API 동작의 정의 정도만 사용해도 훌륭한 REST API를 구현할 수 있다.
JSON
JavaScript Object Notation
자바스크립트에서 객체를 표현하는 표현식으로 시작한다.
데이터를 표현하는 방법이 단순하고 이해하기 쉬워서 웹 API에서 데이터를 전송할 때 표현식으로 주로 사용된다.
웹 API는 기본적으로 데이터를 문자열로 전송하게 된다.
어떤 객체를 웹 API를 통해 문자열로 전달하기 위해 JSON을 사용한다.
JSON이 더욱 적은 표현식을 사용하여 데이터를 효과적으로 표현한다.
JSON 가이드 - object
JSON에서 Obejct는 {key : value}로 표현한다.
value에는 어떤 값이라도 사용될 수 있다. (문자열, 숫자, JSON 객체 등)
ex) { name : 'brighstar', age : 5, nationality : 'korea' }
JSON 가이드 - Array
여러 정보를 한 키에 담아야 할 때 array를 사용한다.
JSON에서 Array는 [item1, item2]로 표현한다.
item에는 어떤 값이라도 사용될 수 있다(문자열, 숫자, JSON 객체 등)
ex) ['first', 10, {name : 'bob'}]
Express.js로 REST API 구현하기
목표
데이터베이스 없이 Node.js 모듈 활용
간단한 메모의 작성, 수정, 삭제, 확인기능 API 구현
express-generator를 사용하지 않고 MVC 패턴 구현
MVC 패턴
MVC 패턴은 웹 서비스의 가장 대표적인 프로젝트 구성 패턴으로 프로젝트의 기능들을 어떻게 분리할지에 대한 하나의 구성 방법이다. 대중적인 방법으로 많이 사용된다. Model - View - Controller를 구분하여 프로젝트 구조를 구성하는 것이다.
- Model
Model은 데이터에 접근하는 기능 또는 데이터 그 자체를 의미한다. 데이터의 읽기, 쓰기는 Model을 통해서만 이루어지도록 구성해야 한다.
- View
View는 데이터를 표현하는 기능을 의미한다. 주로 Controller에 의해 데이터를 전달받고 전달받은 데이터를 화면에 표시해주는 기능을 담당한다.
- Controller
Controller는 Model을 통해 데이터에 접근하여, 처리 결과를 View로 전달하는 기능을 의미한다. 웹 서비스에선 주로 라우팅 함수가 해당 기능을 수행한다. 하나의 중간 관리자 역할 느낌이다.
Express.js로 MVC 패턴 구현하기
Node.js의 모듈화를 이용하여 MVC 패턴을 구현할 수 있다. (M 부분 따로, V 부분 따로, C 부분 따로)
JSON API를 구현하는 경우, Node.js는 기본적으로 JSON을 처리하는 방법을 가지고 있기 때문에 View는 생략될 수 있다.
프로젝트 구현 사항
JavaScript의 Array 함수를 사용하여 데이터 처리 구현
router와 router handler를 사용하여 HTTP 요청, 응답 처리 구현
오류처리 미들웨어를 사용하여 오류를 처리하는 방법 구현
정의되지 않은 라우팅에 대해 404 오류 처리(Not Found) 구현
메모 목록 구현하기
정보를 관리하고 저장하는 부분과 요청을 다루는 부분을 구분해서 작성했다.
메모 상세 구현하기
특정 메모를 가지고 오는 기능을 구현하는 부분이다.
'/:id' 표현은 파라미터 URL에 마치 변수처럼, id라고 하는 하나의 변수가 처리된 것을 의미한다.
노트가 없으면 에러를 발생시키고, next(e)의 경우 인자가 있어서 오류처리 핸들러로 넘어간다.
메모 작성 구현하기
post를 사용하여 미들웨어를 작성한다. lastId가 지금까지 있었던 메모의 다음 메모로 지정된다.
메모 수정 구현하기
Number로 문자열을 숫자로 바꿔준다. 메모가 있는지 없는지를 체크해서 메모가 없으면 에러를 내보낸다.
수정에서의 핵심은 어떤 요소를 찾는 것, 없으면 에러, 특정 아이디와 함께 주어진 요소를 수정해서 갱신하는 것이다.
메모 삭제 구현하기
id를 써주고 해당 요소가 있는지를 체크한다. note.id !== id 인 note만 가져와서 특정 노트를 삭제한다.
JSON 데이터 처리 미들웨어 사용하기
express.js는 기본적으로 HTTP body에 전달되는 JSON 데이터를 처리하지 못한다.
app.use에 express에서 기본적으로 제공해 주는 express.json() 미들웨어를 사용해야 JSON 데이터를 사용할 수 있다.
오류 처리 미들웨어 구현하기
가장 마지막 미들웨어로 오류 처리 미들웨어를 적용하면 모든 라우팅에 공통적인 오류처리 로직을 적용할 수 있.
정의되지 않은 라우팅에 404 오류 처리하기
앞선 오류처리 핸들러의 경우에는 작동을 하다가 오류가 발생했을 때 실행하는 미들웨어고, 특정 라우팅이 정의가 되어있지 않는 듣도보도 못한 새로운 자원을 요청하거나 이미 있는 자원이지만 요청 방법이 잘못된 경우에는 404 오류를 처리한다.
모든 라우팅이 적용된 이후에 사용되는 미들웨어는 설정된 경로가 없는 요청을 처리하는 Route Handler로 동작한다.
Express.js는 기본적인 404 페이지를 가지고 있지만, 직접 처리가 필요한 경우 이와 같은 Route Handler를 추가해야한다.
https://github.com/ChoiKyubum/rest-api-example.git
GitHub - ChoiKyubum/rest-api-example: 데이터베이스 없이 구성한 간단한 rest-api 예제
데이터베이스 없이 구성한 간단한 rest-api 예제. Contribute to ChoiKyubum/rest-api-example development by creating an account on GitHub.
github.com
'AI / DL > 엘리스 SW 코딩 훈련 트랙' 카테고리의 다른 글
[SW 코딩 훈련] Express.js와 MongoDB 04. Mongoose 활용하기 (0) | 2022.11.30 |
---|---|
[SW 코딩 훈련] Express.js와 MongoDB 03. MongoDB와 Mongoose (0) | 2022.11.29 |
[SW 코딩 훈련] Express.js와 MongoDB 01. Express.js의 미들웨어 (0) | 2022.11.26 |
[SW 코딩 훈련] Node.js와 Express.js 04. 웹과 Express.js (0) | 2022.11.25 |
[SW 코딩 훈련] Node.js와 Express.js 03. NPM과 모듈 (0) | 2022.11.24 |
댓글