본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

[O'REILLY] Node & Express - 15장 : REST API와 JSON

by VictorMeredith 2023. 4. 11.

- 지금까지 여러 REST API의 예제를 보아왔지만, 지금껏 '서버에서 데이터를 처리하고 클라이언트에게 html을 전송한다는 예제' 가 주를 이뤘다.

- 하지만 2023 현재 대세는 상당수가 HTML, CSS, JS 등의 렌더링 파일 자체는 정적으로 받아오고, 실제 데이터는 JSON으로 AJAX를 통해 받아서 HTML를 구성하는 SPA의 형태를 띄는 경우도 많다. 물론 SEO가 구려서 SSR이 다시 대두되고 있어서 프로젝트의 형태와 목적에 따라서 적절히 구성하는 것이 현명하다.

- 어쨌든 SSR 방식이더라도, 서버의 API는 매우 중요하며, API엔드포인트를 제공하는 방법을 알아야한다.

- 웹 서비스는 HTTP로 접근할 수 있는 어플리케이션 프로그래밍 인터페이스 (Application Programming Interface, API) 를 가리키는 범용적인 용어이다.

- REST는 representational state transfer (표현적인 상태 전송)의 약어이며, RESTful 은 REST의 원칙을 만족하는 웹 서비스를 가리키는 형용사화 된 거시기한(?) 용어이다.

- REST의 공식 정의에는 '서비스를 캐시할 수 있으며, 계층을 구성할 수 있다', 즉 REST API를 사용하면 그 아래에 다른 REST API가 존재할 수 있다는 의미를 가지고 있다.

- 실용적 관점에서 본다면 HTTP의 성격상 RESTful이 아닌 API를 만들기가 더 어려울 정도로 당연한 상식과 패턴의 선에서 RESTful 해질 수 있으며, 원칙을 알고 천천히 구현한다면 전혀 어렵지 않다.

 

1. JSON 과 XML

- API를 제공하려면 양쪽에서 공통으로 사용하는 언어가 필수이다. JSON!

- HTTP 를 사용한다는 조건을 만족하면, 언어는 골라서 사용할 수 있다.

- XML은 전통의 언어지만, 요새는 사장되고있다. 대세는 JSON이다. 편하고 간결하고 JS에 최적화되어있다.

 

2. API

- 설계 : API를 만들기 전에는 항상 계획을 철저하게 해야 한다.

- HTTP 동사는 여러개이다. 각 의도에 맞는 동사를 적절히 사용한다 GET(가져오기)/POST(생성)/DELETE(삭제)/PUT(전체수정)/PATCH(일부수정) 등.. 

- API 경로를 만드는 방법은 여러가지이다. 여기서는 HTTP 메서드와 경로를 조합해서 API 호출을 구분하고, 쿼리스트링과 바디의 매개변수를 통해 데이터를 전달한다.

- JSON:API 라는 표기법이 있어서 사람들이 많이 사용하기도 한다. 난 안좋아한다.

 

3. API 오류보고

- API의 오류는 상태코드로 보고한다.

- 200번대는 성공, 400번대는 클라이언트 잘못, 500번대는 서버 잘못이다. 다양한 코드가 있으니 이거는 chatGPT한테 적절히 물어보고 사용하면 코드를 잘 사용할 수 있다. 꼰대같이 구글링 하나하나 해서 번호 하나씩 다 찾아보고 그러지 말자.

- 심각한 오류 : 서버를 불안정, 또는 정의되지 않은 상태로 만드는, 한마디로 서버 다운시키는 오류다. 보통은 처리하지 않은 예외 때문에 발생한다. 저번에 포스팅한 실무환경 2번의 예외처리를 잘 확인해보자.

- 복구 가능한 서버오류 : 일시적일 수도, 영구적일 수도 있다. 500번대 에러가 적절하다.

- 클라이언트 오류 : 400번대가 적절하다. 404(없다), 401(인증안됨), 400(잘못된요청) 등이 있다. res.status(code).send(에러의 내용에 대한 적절한 메시지) 로 사용자에게 에러 메시지를 포함해야한다.

 

4. CORS(교차 출처 리소스 공유)

- 수많은 퍼블리셔, 프론트엔드 개발자들을 괴롭히는 CORS다. 서버에서 처리해주는 게 맞다.

- 크로스사이트HTTP 요청은 다양한 공격의 표적이 되어왔고, 그로 인해 스크립트 서버를 제한하는 동일 소스 정책으로 제한되었다.

- 프로토콜, 도메인, 포트가 반드시 일치해야 한다.

- API를 다른 사이트에서 사용하는 것이 불가능해지고, 이를 위해 CORS(Cross-Origin-Resource-Sharing)이 등장한다.

- CORS 제한은 건별로 도메인 리스트를 만들어 해제해주는 것이 가능하다.

- Access-Control-Allow-Origin 헤더를 통해 구현한다.

- 예제) API 전체를 노출하므로 /api로 시작하는 경로에만 CORS를 적용하는 경우

const cors = require('cors')
app.use('/api', cors());

 

나는 연습프로젝트에서 개발환경 전용 cors로 개발하고 마칠 때 다시 세팅한다.

허접하게 구글링해서 만든 코드

5. 테스트

- PostMan 만세

- 포스트맨같은 갓갓유틸리티와 관계없이 자동화된 테스트를 구현하는 것이 좋다.

- API 테스트를 만들기 전에 실제로 REST API를 호출할 방법이 필요하다.

- 이를 위해 브라우저의 fetch API를 흉내 내는 노드 패키지 node-fetch를 사용할 수 있다.

npm i --save-dev node-fetch

요렇게 사용하면 된다.

- JEST / Mocha 도 TDD로 주로 사용한다.

 

댓글