티스토리 뷰

 

Node. js와 express


  • Node.js는  V8 자바스크립트 엔진에서 실행되며 서버 측 JavaScript 런타임이다.
  • 주로 비동기 이벤트 기반 프로그래밍을 지원하여 매우 빠르고 확장성이 높은 네트워크 애플리케이션을 개발할 수 있도록 한다.
  • npm이라는 패키지 매니저를 사용하여 모듈화된 라이브러리를 쉽게 설치하고 관리할 수 있다.
  • Node.js는 공식 사이트 (https://nodejs.org/) 에 접속하여 LTS 버전 다운로드할 수 있다.
  • Express는 Node.js를 기반으로 하는 웹 프레임워크 중 하나로, Node.js의 핵심 기능을 보완하여 웹 애플리케이션을 보다 쉽고 빠르게 개발할 수 있도록 한다.
  • 간단하고 유연한 라우팅 기능을 제공하며, 미들웨어를 통해 요청과 응답의 처리를 중간에서 조작할 수 있다.
  • 이러한 기능들을 통해 개발자는 빠르게 웹 애플리케이션을 구축하고, 유지보수할 수 있습니다.

 

 

서버 시작


  • 본 글에서는 express 문법이 더 짧고, 가독성이 높으므로 express를 기준으로 작성한다.
npm install express
  • 제일 처음에는 express를 npm으로 설치한다.
const express = require('express');
const app = express();
  • 그 후 express 모듈를 불러와서 app에 할당한다.
  • 완성된 서버는 터미널에서 node app.js 명령어로 실행 할 수있다.
  • 이전 글에서 작성한 CORS 또한 여기에 들어간다.

2023.04.09 - [코딩/server] - CORS

 

CORS

CORS란? Cross-Origin Resource Sharing의 줄임말로 교차 출처 리소스 공유를 의미한다. 출처는 프로토콜, 호스트, 포트의 조합으로,이 중 하나라도 다르면 동일한 출처로 보지 않는다. https://www.codestates.com

lhs9602.tistory.com

 

라우팅


  • 라우팅이란, 클라이언트의 요청(request)에 대해 서버가 어떻게 응답(response)할 것인지를 결정하는 것을 의미한다.
  • 즉, 클라이언트가 어떤 URL에 요청을 보냈을 때, 서버에서는 그 요청을 구분해서 어떻게 처리할지를 결정하는 것이다.
  • 라우팅은 app 객체의 get(), post(), put(), delete() 메서드 등을 사용하여 정의할 수 있다.
  • 이 메서드들은 각각 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)에 대한 라우팅을 정의한다. 예를 들어, app.get() 메서드를 사용하면 GET 요청에 대한 라우팅을 정의할 수 있다.
// 루트 경로에 대한 GET 요청 처리
app.get('/', function (req, res) {
  res.send('Hello World!');
});

// /about 경로에 대한 GET 요청 처리
app.get('/about', function (req, res) {
  res.send('About us');
});

// /contact 경로에 대한 POST 요청 처리
app.post('/contact', function (req, res) {
  res.send('Contact us');
});

// /user/:id 경로에 대한 GET 요청 처리
app.get('/user/:id', function (req, res) {
  res.send('User ' + req.params.id);
});

// 404 에러 처리
app.use(function(req, res, next) {
  res.status(404).send("Sorry can't find that!");
});

 

  • /user/:id 부분은 :으로 시작하는 동적 경로 매개변수를 사용한다. 이 매개변수는 클라이언트의 요청 URL에서 값을 추출하여 req.params 객체에 저장한다.

 

req와 res의 메서드


  • req와 res는 객체이며 요청(request) ,응답(requset)의 줄임말이다. 
  • 클라이언트의 요청 정보 서버에서 클라이언트로 보낼 응답 정보를 담고 있다. 
  • Express에서는 이러한 요청 객체와 응답 객체를 다루기 위한 다양한 메서드를 제공한다.

요청 객체(req)의 주요 메서드

  • req.params : URL의 동적 경로 매개변수를 담고 있는 객체
  • req.query : URL의 쿼리 파라미터를 담고 있는 객체
  • req.body : 요청 본문을 담고 있는 객체
  • req.method : HTTP 메서드를 반환하는 메서드
  • req.headers : HTTP 요청 헤더를 반환하는 메서드

응답 객체(res)의 주요 메서드

  • res.send() : 클라이언트에게 응답을 보낸다.
  • res.json() : JSON 형태의 응답을 보낸다.
  • res.status() : HTTP 상태 코드를 설정한다.
app.get('/hello', function(req, res) {
  res.send('Hello, World!');
});

app.get('/user/:id', function(req, res) {
  const id = req.params.id; //= {id}=req.params
  res.send('User ' + id);
});

app.post('/user', function(req, res) {
  const body = req.body;
  res.json(body);
});

app.put('/user/:id', function(req, res) {
  const id = req.params.id;
  res.status(200).send('User ' + id + ' has been updated');
});

app.delete('/user/:id', function(req, res) {
  const id = req.params.id;
  res.redirect('/users');
});
  • 위의 코드에서, GET 요청에서는 res.send() 메서드를 사용하여 문자열을 클라이언트에게 보내고, 동적 경로 매개변수를 사용하는 GET 요청에서는 req.params를 사용하여 매개변수를 추출한다.
  • POST 요청에서는 req.body를 사용하여 요청 본문을 추출하고, PUT 요청에서는 res.status() 메서드를 사용하여 HTTP 상태 코드를 설정한다.
  • DELETE 요청에서는 res.redirect() 메서드를 사용하여 다른 URL로 리다이렉션한다.

 

 

미들웨어


  • 요청과 응답을 처리하는 과정 중간에 실행되는 함수.
  • 요청과 응답 객체(req, res)와 next 함수를 매개변수로 받고, next 함수를 호출하지 않으면 다음 미들웨어나 라우트 핸들러로 넘어가지 않는다. next 함수를 호출하면 다음 미들웨어나 라우트 핸들러로 넘어간다.
  • app.use() 메서드를 사용하여 등록할 수 있으며 등록된 미들웨어는 순서대로 실행된다.
const express = require('express');
const app = express();

// 정적 파일 서비스
app.use(express.static('public'));

// JSON 파싱 미들웨어
app.use(express.json());

// 요청 로그 미들웨어
app.use(function(req, res, next) {
  console.log(`${req.method} ${req.url}`);
  next();
});
  • 미들웨어는 다양한 용도로 사용될 수 있는데, 자주 사용되는 용도는 4가지이다.
  • POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
const jsonParser = express.json();

app.post('/api/users', jsonParser, function (req, res) {
  const body = req.body;
  res.json(body);
})

위와 같이 express.json()express.urlencoded()를 사용하여 요청 본문을 쉽게 파싱할 수 있다.

 

  • 모든 요청/응답에 CORS 헤더를 붙여야 할 때
const express = require('express');
const app = express();

app.use(function(req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, content-type, Authorization');
  next();
});

위와 같이 Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers와 같은 CORS 관련 헤더를 설정하는 미들웨어를 등록하여 모든 요청/응답에 대해 CORS 정책을 쉽게 적용할 수 있다.

 

 

  • 모든 요청에 대해 url이나 메서드를 확인할 때
const express = require('express');
const app = express();

app.use(function(req, res, next) {
  console.log(`${req.method} ${req.url}`);
  next();
});

 

  • 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
const express = require('express');
const app = express();

app.use(function(req, res, next) {
  const token = req.headers.authorization;
  if (token) {
    // 인증 정보가 있다면 다음 미들웨어로 이동
    next();
  } else {
    // 인증 정보가 없다면 401 Unauthorized 응답
    res.sendStatus(401);
  }
});

위와 같이 요청 헤더에 Authorization 헤더가 있는지 확인하는 미들웨어를 등록하여 인증 정보가 없는 요청에 대해 401 Unauthorized 응답을 보내거나 다음 미들웨어로 이동할 수 있다.

'개발 > node, express' 카테고리의 다른 글

세션  (0) 2023.05.02
쿠키  (0) 2023.05.02
HTTPS 구현  (0) 2023.05.02
CORS  (0) 2023.04.09
REST API  (0) 2023.03.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함