티스토리 뷰
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 응답을 보내거나 다음 미들웨어로 이동할 수 있다.
댓글