본문 바로가기

Java, JavaScript/Node

[Node] http 모듈을 사용하여 간단한 API 만들기

728x90

express를 공부하기 전에 http 모듈만을 사용하여 간단한 API를 만들어보겠습니다. 우선, 전체적인 코드를 구조를 살펴보고 GET, POST, PUT, DELETE는 따로 알아보겠습니다. 다음은 전체적인 코드입니다. (🧨 코드가 길어 주석 부분은 따로 나누어서 설명하겠습니다)

 

const http = require('http');

const foods = {}
let index = 0;
http.createServer(async (req, res) => {
    try {
        console.log(req.method, req.url);
        // 여기서 부터 GET, POST, PUT, DELETE 추가

    } catch (e) {
        console.error(e);
        res.writeHead(500);
        res.end(e);
    }
}).listen(8080, () => {
    console.log('8080 포트에서 대기 중입니다.');
})

 

foods와 index는 API 요청 정보를 저장하고, 반환할 때 사용될 변수입니다. http 모듈의 createServer는 요청이 들어올 때마다 콜백 함수를 실행시켜 요청에 맞는 응답을 처리합니다. req.method는 http method를 저장하고, req.url은 요청한 url을 저장합니다. catch에서는 요청에 맞는 응답을 처리하지 못했다는 의미로 500 서버 에러를 응답합니다. 마지막으로 listen 함수를 사용하여 8080 포트로 통신을 진행합니다.

 

다은은 GET 요청입니다. GET 요청은 foods에 저장된 모든 데이터를 보여줍니다.

 

...
if (req.method === 'GET') {
  res.writeHead(200);
  return res.end(JSON.stringify(foods));
...

 

http://localhost:8080에 GET 요청이 오면 상태코드를 200 성공으로 설정하고, foods에 저장된 데이터를 JSON으로 반환해줍니다. 결과는 다음과 같습니다.

 

// request - GET http://localhost:8080

// response
{"1":"돈가스","2":"쫄면","3":"스테이크","4":"수정과"}

 

다음은 POST 요청입니다. POST 요청은 foods에 새로운 데이터를 저장합니다.

 

...
} else if (req.method === 'POST') {
  let body = ''
  req.on('data', (data) => {
    body += data;
  });
  return req.on('end', () => {
    const {name} = JSON.parse(body);
    foods[index] = name;
    index += 1;
    res.writeHead(201);
    res.end(foods[index - 1]);
  })
...

 

req.on('data')를 통해 요청과 함께 넘어온 데이터를 body에 저장해줍니다. const {name} = JSON.parse(body)를 실행시켜 body에 저장된 key 값이 name인 값을 name에 저장해줍니다. 그리고 foods에 데이터를 저장한 후에 상태 코드 201 생성됨으로 설정한 후에 방금 저장된 foods 값을 반환합니다. 결과는 다음과 같습니다.

 

//request - POST http://localhost:8080
{
    "name": "수정과"
}

//response 
수정과

 

다음은 PUT 요청입니다. PUT은 이미 생성된 foods의 데이터를 다른 데이터로 바꿉니다.

 

...
} else if (req.method === 'PUT') {
  const key = req.url.split('/')[1];
  let body = ''

  req.on('data', (data) => {
    body += data;
  });

  return req.on('end', () => {
    const {name} = JSON.parse(body);
    foods[key] = name;
    res.writeHead(200);
    res.end(foods[key]);
  });
...

 

PUT의 경우 이미 생성된 foods를 수정하는 것이므로 key값이 필요합니다. 따라서 http://localhost:8080/4과 같이 url에 key값을 넘겨줍니다. 해당 요청의 req.url의 값은 /0입니다. 따라서 split('/')[1]을 사용하여 key 값인 4를 const key에 저장해줍니다. 이후의 동작은 POST와 같습니다. 실행 결과는 다음과 같습니다.

 

//request - PUT http://localhost:8080/4
{
    "name": "식혜"
}

//response
식혜

 

마지막은 DELETE 요청입니다. DELETE는 foods 데이터를 삭제할 때 사용합니다.

 

} else if (req.method === 'DELETE') {
  const key = req.url.split('/')[1];
  delete foods[key];
  return res.end(JSON.stringify(foods));
}

 

PUT과 마찬가지로 key값을 저장한 후에 delete를 사용하여 foods에서 key에 맞는 값을 삭제하고 foods 값을 반환합니다. 실행 결과는 다음과 같습니다.

 

// request - DELETE http://localhost:8080/4

// response
{"1":"돈가스","2":"쫄면","3":"스테이크"}

 

이렇게 node를 사용하여 간단한 API를 만들어보았습니다.

728x90

'Java, JavaScript > Node' 카테고리의 다른 글

[Node] 비동기 처리 - async/await  (0) 2021.10.14
[Node] 비동기 처리 - Promise  (0) 2021.10.06