티스토리 뷰
모듈
Node.js는 기능을 확장하고자 모듈이라는 개념을 사용합니다. 모듈 중에서 Node.js에 기본적으로 있는 모듈을 내부 모듈, Node.js가 기본적으로 갖고 있지 않고 개인 또는 단체가 만들어 배포하는 모듈을 외부 모듈이라고 합니다.
외부 모듈은 https://npmjs.org에서 확인할 수 있습니다. 외부 모듈을 사용하려면 다음 명령어를 입력해 별도로 설치해야 합니다.
npm install 모듈명
다음은 내부 모듈과 외부 모듈을 각각 사용한 예입니다.
// 내부 os 모듈
const os = require("os");
console.log(os.hostname()); // 운영체제 호스트 이름
console.log(os.type()); // 운영체제 이름 (window)
console.log(os.platform()); // 운영체제 플랫폼 (win32)
console.log(os.totalmem()); // 시스템 총 메모리
console.log(os.freemem()); // 시스템 사용 가능 메모리
console.log(os.cpus()); // cpu 정보
// 외부 request 모듈 (npm install request)
// request 모듈은 특정 웹 페이지를 긁을 때 사용합니다.
const request = require("request");
request("http://www.google.com", (error, response, body) => {
console.log(body);
})
express 모듈
서버를 생성하기 위해 express라는 외부 모듈을 사용합니다. 모듈 이름 뒤에 @ 기호를 붙이고 버전을 입력하면 강제로 버전을 지정할 수 있습니다.
npm install express@4.14
다음과 같이 모듈을 추출하고 기본 서버를 생성합니다.
const express = require("express");
const app = express();
const PORT = 52273
app.use((request, response) => {
response.send("<h1>안녕하세요</h1>")
})
// 웹 서버를 실행합니다.
app.listen(PORT, () => {
console.log(`Server Running at http://127.0.0.1:${PORT}`);
})
미들웨어
웹 서버에 기능을 부여하기 위해서 app.use() 메서드를 사용합니다. app.use() 메서드에 입력하는 콜백 함수를 request 이벤트 리스너라고 합니다. request 이벤트 리스너는 사용자가 서버에 접속하면 자동으로 실행됩니다.
app.use() 메서드는 여러 번 사용할 수 있는데, 이때 3번째 인자인 매개변수 next는 다음 콜백 함수를 의미합니다. 또한
미들웨어를 사용하면 request 객체와 response 객체에 기능을 추가할 수 있습니다. 위 코드에서 첫번째 미들웨어에서 request 객체와 response 객체에 추가한 test 속성을 다음 미들웨어에서 출력합니다.
const express = require("express");
const app = express();
const PORT = 52273
app.use((request, response, next) => {
request.test = "request test";
response.test = "response test";
next()
})
app.use((request, response, next) => {
console.log(request.test);
next()
})
app.use((request, response, next) => {
console.log(response.test)
response.send("<h1>Hello Middleware!</h1>");
})
// 웹 서버를 실행합니다.
app.listen(PORT, () => {
console.log(`Server Running at http://127.0.0.1:${PORT}`);
})
이미 다른 개발자들이 만들어둔 logger, body parser, cookie parser, session, static, router 등 많은 미들웨어들이 있습니다. 이를 가져와서 쉽게 기능들을 활용할 수 있습니다. 다음과 같이 사용합니다.
const app = express();
app.use(express.logger());
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session());
app.use(express.static("public"));
## 미들웨어 살펴보기
1. static
static 미들웨어는 정적 파일을 제공할 때 사용하는 미들웨어입니다. 정적 파일이란 변화되지 않는 일반 파일을 의미합니다. static 미들웨어를 사용하려면 express.static() 메서드를 app.use() 메서드의 매개변수로 넣으면 됩니다. express.static() 메서드의 매개변수에는 제공할 파일이 들어 있는 폴더 이름을 입력합니다.
const express = require("express");
const PORT = 52273;
const app = express();
app.use(express.static("public"));
app.use((request, response, next) => {
response.send("<h1>hi</h1>");
})
app.listen(PORT, () => {
console.log(`server on port:${PORT}`)
})
위 코드를 실행하면 public 폴더 내에 있는 index.html 파일을 웹 브라우저에 제공합니다. 또한 static 미들웨어는 폴더에 존재하지 않는 파일 경로로 들어가면 다음 미들웨어를 실행합니다.
만약 위 코드에서 사용자 정의 미들웨어와 static 미들웨어의 순서를 바꾸면 어떻게 될까요? 코드를 실행해보면 어떠한 경로로 들어가도 "hi"만 출력합니다. 첫번째 미들웨어에서 다음 미들웨어를 호출하지 않으므로 발생하는 일입니다. 따라서 미들웨어의 순서에 유의하여야 합니다.
2. 라우터
사용자의 요청에 따라 사용자가 필요한 정보를 제공하는 것을 "라우트 한다"고 표현합니다. 그리고 이러한 기능을 수행하는 미들웨어를 라우터라고 합니다. router 미들웨어는 따로 설정하지 않고 사용 가능합니다. 다음 표에 나온 메서드를 이용해서 라우터를 구현합니다.
app 객체의 메서드
메서드 이름 | 설명 |
---|---|
app.get() | 클라이언트의 GET 요청 처리 |
app.post() | 클라이언트의 POST 요청 처리 |
app.put() | 클라이언트의 PUT 요청 처리 |
app.delete() | 클라이언트의 DELETE 요청 처리 |
app.all() | 클라이언트의 모든 요청 처리 |
다음은 app.all() 메서드를 이용하여 라우팅 처리를 한 예제입니다.
const app = express();
app.use(express.static("public"));
app.all("/a", (request, response) => {
response.send("<h1>Page A</h1>");
})
app.all("/b", (request, response) => {
response.send("<h1>Page B</h1>");
})
app.all("/c", (request, response) => {
response.send("<h1>Page C</h1>");
})
app.use((request, response, next) => {
response.send("other");
})
app.listen(PORT, () => {
console.log(`server on port:${PORT}`)
})
위 코드에서 static 미들웨어 다음 정의했던 사용자 정의 미들웨어를 그대로 두면 오류가 발생합니다. static 미들웨어에 의해 /a나 그 외 다른 주소로 접속하려고 하면 자동으로 사용자 정의 미들웨어가 실행되는데, 라우터 미들웨어로도 그 주소를 정의해놓아서 중복이 발생했기 때문입니다. 따라서 미들웨어의 순서를 고려하여 라우팅 처리가 다 된 후에 사용자 정의 미들웨어를 추가하면 오류가 발생하지 않습니다.
응답과 응답 형식
서버에서는 다음 세가지 방식으로 데이터를 제공할 수 있습니다. - /data.html: HTML 형식으로 제공 - /data.json: JSON 형식으로 제공 - /data.xml: XML 형식으로 제공
send() 메서드의 매개변수에 따른 응답 형식
자료형 | 응답형식 |
---|---|
문자열 | HTML |
배열 | JSON |
객체 | JSON |
1. HTML 응답
HTML 형식으로 데이터를 제공하려면 send() 메서드의 매개변수에 문자열을 넣어주면 됩니다.
const express = require("express");
const PORT = 52273;
const items = [{
name: "우유",
price: "2000",
}, {
name: "홍차",
price: "5000",
}, {
name: "커피",
price: "5500",
}];
// 서버 생성
const app = express();
app.use(express.static("public"));
// 라우트
app.all("/data.html", (request, response) => {
let output = "";
output += "<!DOCTYPE html>";
output += "<html>";
output += "<head>";
output += " <title>html</title>"
output += "</head>"
output += "<body>";
items.forEach(item => {
output += "<div>";
output += `<h1>${item.name}</h1>`;
output += `<h1>${item.price}</h1>`;
output += "</div>"
})
output += "</body>"
output += "</html>";
response.send(output);
})
// 서버 실행
app.listen(PORT, () => {
console.log(`server on port:${PORT}`)
})
다음과 같이 HTML 형식으로 데이터를 제공할 수 있습니다. 하지만 위와 같은 방법은 굉장히 무식한 방법입니다. 실제로는 템플릿 엔진을 활용해 HTML 문자열을 생성합니다.
2. JSON 응답
JSON 형식으로 응답할 때는 send() 메서드의 매개변수로 객체나 배열을 전달하면 되니까, 위 코드의 items를 그대로 전달하면 되겠습니다.
3. XML 응답
send() 메서드는 HTML 형식과 JSON 형식으로 데이터를 제공하는 기능만 있습니다. 따라서 다른 형식으로 데이터를 제공하고 싶다면 response.type() 메서드로 데이터 응답 형식을 지정해주어야 합니다.
// ....
app.get("/data.xml", (request, response) => {
let output;
output += `<?xml version="1.0" encoding="UTF-8" ?>`;
output += "<products>";
items.forEach(item => {
output += "<product>";
output += ` <name>${item.name}</name>`;
output += ` <price>${item.price}</price>`;
output += "</product>";
})
output += "</products>";
response.type("text/xml");
response.send(output)
})
MIME 형식
response.type() 메서드의 매개변수로 넣는 문자열은 MIME 형식에서 정의한 문자열입니다. response.send() 메서드도 JSON 형식으로 응답할 때는 다음과 같은 방식으로 구성됩니다.
response.type("application/json");
response.send(JSON.stringify(output));
MIME 형식의 종류는 굉장히 많지만 대략적으로 자주 사용하는 것은 다음과 같습니다.
MIME 형식의 예
Content Type | 형식 |
---|---|
text/plain | 기본적인 텍스트 |
text/html | HTML 문서 |
text/css | CSS 문서 |
text/xml | XML 문서 |
image/jpeg | JPG/JPEG 그림 파일 |
image/png | PNG 그림 파일 |
video/mpeg | MPEG 비디오 파일 |
audio/mp3 | MP3 음악 파일 |
'Node.js' 카테고리의 다른 글
#2 Node.js - 2 (0) | 2021.12.22 |
---|---|
Node.js와 연동하기 (0) | 2021.12.21 |
MySQL (0) | 2021.12.21 |