본문 바로가기
Development/데브코스(TIL, 회고록 등등...)

[데브코스 웹 풀스택 과정 TIL] 4주차 - REST API, Node.js, 그리고 Express.js

by Polaris_ 2023. 12. 12.

이번 글부터는 주 단위로 정리할 예정이다.

일 단위로 적으려 했는데 솔직히 매일 적기에는 들어가는 시간도 그렇고 좀 무리이고 중간에 특강을 들으면서 학습 내용을 통으로 적기보다는 요약과 학습 과정 및 회고 위주로 적는 것이 좋다는 조언을 듣고 생각을 해 본 결과 TIL은 주 단위로 배운 내용들을 요약해서 어느 때라도 들여다봤을 때 기억날 수준으로 적는 게 낫다는 판단이 들어서이다.


API

Application Programming Interface의 약자이다. 위키백과에서의 정의는 다음과 같다.

컴퓨터나 컴퓨터 프로그램 사이의 연결이다. 일종의 소프트웨어 인터페이스이며 다른 종류의 소프트웨어에 서비스를 제공한다.

 

그렇다면 인터페이스는 무엇일까.

인터페이스는 서로 다른 복수의 시스템들이 서로 정보나 신호를 주고받는 등의 접점 내지는 경계면이다.

이 둘을 합해보면 두 소프트웨어 사이에서 서로 정보를 주고받게 하는 일종의 접점이 될 것이다.


REST API

REST(Representational State Transfer) API는 HTTP 상에서 쓰이는 REST 설계 양식을 따르는 API로 자원을 이름으로 구분하여 자원의 상태(혹은 정보)를 주고받는 모든 방식을 말한다.

REST는 URI를 통해 자원을 명시하고, HTTP 메서드(POST - Create, GET - Read, PUT - Update, DELETE - Delete)를 통해 자원에 대한 CRUD Operation을 적용하는 것이다.

REST의 특징과 REST API의 명명 규칙은 공부를 하던 중 잘 정리된 자료를 찾아 공유하고자 한다. (링크)

또 RESTful API라는 것이 있는데 이는 REST API의 설계 규칙을 충실하게 반영한 API를 의미한다.


Node.js

Node.js는 이전 글에서도 설명했다시피 프런트엔드에서만 쓰이던 JS로 백엔드까지 구현할 수 있게 해주는 프로그램(플랫폼)이다.

Node.js의 특징은

  1. 싱글 스레드
  2. 논블로킹 I/O
  3. 이벤트 기반

이렇게 세 가지로 볼 수 있다. 위 특징을 한 문장으로 정리하면 다음과 같다.

Node.js는 단일 프로세스로 작동(싱글 스레드)하며, 비동기 방식으로 I/O 작업을 처리하여 작업 효율성을 높였고(논블로킹 I/O), 특정 이벤트 발생 시 지정한 콜백 함수실행(이벤트 기반)한다.

NPM

NPM을 알아보기 전에 먼저 라이브러리와 프레임워크를 짧게 짚고 넘어가자.

라이브러리다른 개발자들이 특정 기능을 수행하기 위해 미리 만들어둔 코드 묶음(모듈)으로, 사용자가 원하는 기능들을 직접 찾아서 사용할 수 있다.

한편 프레임워크모듈들의 묶음으로, 라이브러리와 달리 소프트웨어 제작 시 사용되는 구조를 제공하여 여러 컴포넌트와 라이브러리들을 제공한다.

다시 돌아와서 NPM을 알아보면, Node.js의 패키지 관리자(링크)로 JS 라이브러리를 포함한 여러 패키지를 찾을 수 있으며, npm 명령어로 프로젝트에 바로 적용하는 것도 가능하다.


Express.js

Express.js는 Node.js에 내장된 http 모듈을 바탕으로 웹 서버 구성 시 필요한 함수와 설정들을 미리 구성하여 http 모듈을 사용했을 때 보다 간편하게 웹서버를 구성할 수 있게 해 주는 모듈이다.

Node.js에서는 npm install express로 설치하여 사용할 수 있다.

가장 기초적인 예제를 살펴보자.

/* index.js */

const express = require('express');
const app = express();  // Express.js 모듈 불러오기

/* / 경로에 대해 GET 요청 시 처리 */
app.get('/', function (req, res) {  // 함수(경로, 콜백 함수) 구조
    res.send('Hello!');
})

/* 3000번 포트로 서버 열기 */
app.listen(3000);  //'address already in use (주소):(포트)' 에러가 뜨면 포트 번호를 다른 포트 번호로 변경

get() 외에도 기본적인 CRUD 기능을 하는 post(), put(), delete() 함수가 있다.

http 모듈과의 차이점이라면 http 모듈에서는

/* server.js */

let http = require('http');

function start() {
    function onRequest(req, resp) {
        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write('Hello!');
        response.end();
    }
    http.createServer(onRequest).listen(8080);  //localhost:8080
}

처럼 Head와 Body를 작성하고 직접 응답을 닫아주어야 하나 Express에서는 그럴 필요 없이 추가적인 응답이 없으면 자동으로 닫아준다.

또 Express의 res.send()는 응답으로 보내는 객체의 타입을 자동으로 판단하기 때문에 객체의 타입에 크게 구애를 받지 않는다. res.json() 같은 고정 타입 메서드도 있으나 send() 메서드에서 처리 가능하기 때문에 send() 메서드를 써도 무방하다)

Express로 직접 웹 애플리케이션을 구성할 수도 있으나 Express application generator(express-generator)를 사용하여 웹 애플리케이션 기본 구조를 생성하여 구성할 수도 있다.

설치 및 사용법은 여기여기를 참고하면 좋다.

JSON

JavaScript Object Notation의 약자로 JS의 리터럴, 배열, 스칼라 데이터 등을 객체로 묶어 텍스트 형식으로 나타내는 표기법이다.

이를 바탕으로 웹에서 데이터 전송 시 여러 타입의 데이터를 객체로 묶어 한번에 전송할 수 있다는 장점이 있다.

아래는 JSON의 예시이다.

/* reference: https://en.wikipedia.org/wiki/JSON#Syntax */

{
    "first_name": "John",
    "last_name": "Smith",
    "is_alive": true,
    "age": 27,
    "address": {
        "street_address": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postal_code": "10021-3100"
    },
    "phone_numbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "office",
            "number": "646 555-4567"
        }
    ],
    "children": [
        "Catherine",
        "Thomas",
        "Trevor"
    ],
    "spouse": null
}

특징으로는 JS의 객체로 JSON 데이터를 만들 수 있으며, 반대로 JSON 데이터로 JS 객체를 생성할 수 있다는 것이다.

차이점이라면 JS의 객체JS 엔진(ex. Node.js) 메모리 상에 존재하는 자료 구조이고, JSON이를 기술하기 위한 텍스트 파일이라는 것이다.