공부 기록/JavaScript

[강의 정리] Node.js에서 API 서버 만들기 by 개발자의 품격

naraewool 2023. 2. 6. 20:55
728x90

* Reference Video: https://www.youtube.com/watch?v=8XpVJaEWesM

node.js 기반으로 API 서버 만들기, REST API으로 구현

(03:54)

express을 기반으로 웹 서버 구축

*express는 node.js 기반으로 웹 서버를 구축해주는 하나의 모듈이다.

ㄴ 참고: https://naraewool.tistory.com/314

특정 url path로 서버로 호출했을 때 시스템에 있는 데이터를 사용자에게 전달해주는 프로그램을 짜보자.

(04:41)

터미널에서 node api.js 입력하면 서버 연결됨!

다음과 같이 get()을 정의하고 수정한 값 반영되도록 서버 다시 띄우기!

const express = require('express');
const app = express();

const server = app.listen(3001, () =>{
  console.log('Start server : localhost:3001');
}); // 포트가 3001인 서버 띄우기

app.get('/api/user/:type', async (req,res)=>{ // url path, async (요청, 응답)
  res.send('connect.'); // 성공 시 보여지는 응답
})

포스트맨을 이용하여 localhost:3001/api/user/1로 GET 요청을 보내면, 지정한 메시지 나옴(connect.)

:type은 무엇이냐? :type 에 들어오는 값을 파라미터로 받을 수 있음

(06:23)

다시 코드를 이렇게 수정해보서 postman을 이용하여 요청을 보내보면,

app.get('/api/user/:type', async (req, res)=>{
  // res.send('connect.');
  let {type} = req.params;

  console.log(type);
  res.send('ok');
})

성공 시 'ok'를 보여주고, 요청 시에 :type 위치에 지정한 파라미터(1) 값이 콘솔 로그에 출력된다.

배운 걸 이용하여 다음과 같은 코드를 짜볼 수 있다.

const express = require('express');
const app = express();

const server = app.listen(3001, () =>{
  console.log('Start server : localhost:3001');
});

app.get('/api/user/:type', async (req, res)=>{
  // res.send('connect.');
  let {type} = req.params;

  if (type=='seoul'){
    let data = [{
      name: "홍길동",
      city: "seoul"
    },
    {
      name: "김철수",
      city: "seoul"
    },
    ];
    res.send(data);
  } else if (type == 'jeju'){
    let data = [{
      name: "박지성",
      city: "jeju"
    },
    {
      name: "손흥민",
      city: "jeju"
    },
    ];
    res.send(data); 
  } else{
  res.send(data);
  }
})

(12:31)

path만 입력하면 다 호출할 수 있으므로 보안을 위해 API 키가 있는 클라이언트만 요청을 허용하도록 해보자.

(13:45)

https://www.npmjs.com/package/uuid-apikey 을 참고하여 설치(npm install uuid-apikey)

생성하는 메서드 호출 시, key &uuid가 만들어짐. 웹서비스할 때는 이 값들을 DB에 저장하면됨

(15:36)

공부할때는 코드 내에 변수로 관리하기로

파라미터에서 apikey 받아올 수 있도록 변수로 선언. 올바른 apikey를 통해 path에 접근한 호출만 허용하도록 url도 수정.

(16:27)

isAPIKey() or check() 이용하여 API Key 검증(문서에 각 method 설명과 샘플 있음)

(19:41)

const express = require('express');
const app = express();
const uuidAPIKey = require('uuid-apikey');

const server = app.listen(3001, () =>{
  console.log('Start server : localhost:3001');
});

//console.log(uuidAPIKey.create()); // API 키 생성하는 메서드


//발급받은 키와 uuid. 실제 서비스엔 별도의 DB로 관리
const key = {
  apiKey: '08R9NZG-60R40KA-Q1K2421-AKYC7E2',
  uuid: '02309afe-3030-404d-b866-220854fcc3b8'
};


app.get('/api/user/:apikey/:type', async (req, res)=>{
  let {
    apikey,
    type} = req.params;

  //API키가 아니거나 할당된 키가 아닐 경우 에러 메시지 띄우기
  if(!uuidAPIKey.isAPIKey(apikey) || !uuidAPIKey.check(apikey, key.uuid)){ 
    req.send('apikey is not valid.');
  } else { //그렇지 않으면, 즉 검증된 API 키라면 다음 데이터 반환
  if (type=='seoul'){
    let data = [{
      name: "홍길동",
      city: "seoul"
    },
    {
      name: "김철수",
      city: "seoul"
    },
    ];
    res.send(data);
  } else if (type == 'jeju'){
    let data = [{
      name: "박지성",
      city: "jeju"
    },
    {
      name: "손흥민",
      city: "jeju"
    },
    ];
    res.send(data); 
  } else{
  res.send(data);
  };
};
});