HTTP 모듈은 Node.js의 기본 모듈로, HTTP 요청과 응답을 다루는 데 사용된다.
HTTP모듈로 서버를 구축하고 실행하는 방법은 아래와 같다.
1. 기본 구조
/ 모듈 불러오기
const http = require("http");
/ 서버 생성
const server = http.createServer((req, res) => {
// 요청 처리 로직
// req: 요청 객체
// res: 응답 객체
});
http.createServer 메서드는 HTTP 서버를 생성한다.
createServer 메서드의 콜백 함수는 서버에 들어오는 각각의 요청에 대해 호출된다.
req 객체는 요청에 관련된 정보를 포함하고 있다.
res 객체는 응답을 생성하고 클라이언트에게 보낼 수 있는 메서드를 제공한다.
/ 서버 실행
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
listen 메서드를 호출하여 서버가 특정 포트에서 요청을 기다리도록 설정한다.
2. 요청 및 응답
서버를 생성하고 콜백 함수에는 각 요청에 대한 처리 로직을 작성한다.
const server = http.createServer((req, res) => {
res.setHeader("Content-type", "text/plain");
res.write("Hello Node");
res.end();
})
res.setHeader 메서드를 사용하여 응답 헤더를 설정한다. "Content-type"을 "text/plain"으로 설정했다. 이는 응답으로 일반 텍스트를 반환한다는 것을 나타낸다.
res.write 메서드를 사용하여 응답 데이터를 전송한다.
res.end 메서드는 응답을 종료한다. 그래야 클라이언트에게 완전한 응답이 전송된다.
3. 서버 동작 흐름
const http = require("http");
const server = http.createServer((req, res) => {
res.setHeader("Content-type", "text/plain");
res.write("Hello Node");
res.end();
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`서버가 포트 ${PORT}에서 리스닝 중`);
});
1) server를 실행시키면 http모듈을 불러온 후 http.createServer로 서버를 생성한다.
2) server.listen이 실행되면서 터미널에는 '서버가 포트 3000에서 리스닝 중' 이 출력된다.
3) 브라우저에서 클라이언트가 요청을 보내면(localhost:3000), createServer 콜백 함수내의 응답 데이터를 전송하여 브라우저에 'Hello Node'가 출력된다.
4. HTTP모듈의 문제점
HTTP 모듈을 사용하여 간단한 서버를 구축하는 것은 단순한 경우에는 괜찮지만, 실제 프로덕션 환경에서는 복잡성이 증가할 수 있다.
아래는 url 경로에 따른 간단한 라우팅인데도 로직이 복잡해지는 것을 알 수 있다.
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
// 라우팅
if (parsedUrl.pathname === '/') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('Hello, this is the homepage!');
res.end();
} else if (parsedUrl.pathname === '/about') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('Welcome to the about page!');
res.end();
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.write('Page not found!');
res.end();
}
});
const PORT = 3000;
server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}/`);
});
/ 라우팅 로직의 복잡성
조건문을 이용한 간단한 라우팅은 라우트가 많아지면 가독성이 떨어진다.
/ 미들웨어의 부재
HTTP 모듈은 미들웨어를 제공하지 않기 때문에 각 요청에 대한 중간 처리가 복잡해진다.
/ 에러 처리의 어려움
에러 처리가 제한적이며, 실제 프로덕션 환경에서의 안정성이 떨어진다.
/ RESTful API 지원의 어려움
RESTful API를 만들기 위해선 추가적인 코드 작성이 필요하며, 이로 인해 유지보수가 어려워진다.
/ 템플릿 엔진의 부재
동적인 HTML을 생성하기 위해선 많은 추가 작업이 필요하다.
이러한 문제점들을 해결하기 위해 Express와 같은 프레임워크를 사용하는 것이다.
Express는 라우팅, 미들웨어, 에러 처리, RESTful API 지원, 템플릿 엔진 등을 통합하여 제공하므로 코드의 구조화와 유지보수가 훨씬 편리해진다.
https://nodejs.org/en/guides/anatomy-of-an-http-transaction/
자세한 내용은 Node.js공식 홈페이지에서 확인하면 된다.
'STUDY > NodeJS' 카테고리의 다른 글
비밀번호 해싱 처리를 위한 Mongoose 미들웨어 설정 (0) | 2024.03.27 |
---|---|
npm install으로 패키지 설치시에 사용되는 옵션들 (0) | 2024.01.10 |
[3-5] 파일 및 디렉터리 생성, 수정, 삭제 - File System(fs)모듈 (0) | 2024.01.07 |
[3-4] 파일 및 디렉터리 경로 관리를 위한 path모듈 (0) | 2024.01.07 |
[7-2] 비밀번호 해싱 및 검증 라이브러리 - bcrypt (0) | 2023.12.13 |