1. 기본 http 모듈로 서버 만들기
- http 모듈에 기본적으로 정의되어 있는 createServer() 메서드를 이용하여 서버 객체 만들기
var http = require('http');
// 웹 서버 객체 생성
var server = http.createServer();
// 웹 서버를 시작하여 3000번 포트에서 대기
var port = 3000;
server.listen(port, function() {
console.log('웹 서버 시작. : %d', port);
});
- 클라이언트가 웹 서버에 요청할 때 발생하는 이벤트 처리하기
- 웹 브라우저에 이 서버에 데이터를 요청하면 그때마다 이벤트가 발생하므로 상황에 맞추어 콜백 함수를 각각 등록해주면 된다.
- 주요 발생 이벤트는 아래와 같다.
- connection: 클라이언트가 접속하여 연결이 만들어질 때 발생.
- request: 클라이언트가 요청할 때 발생.
- close: 서버를 종료할 때 발생.
- EADDRINUSE 라는 에러가 발생한다면 이미 같은 포트에서 서버가 시작되었다는 것이다. 기존 서버를 종료하고 다시 돌리면 돌아간다.
- 클라이언트에서 요청이 왔을 때 응답해주는 형태를 알려주는 것 -> MIME Type(Multipurpose Internaet Mail Extensions)
- http header의 content-type에 넣어서 보내주면 된다.
- text/plain
- text/html
- text/css
- text/xml
- image/jpeg, image/png
- video/mpeg, audio/mp3
- application/zip 등등....
2. Express로 웹 서버 만들기
- http모듈로 직접 만들면 너무 힘들다.
- Express가 제공하는 미들웨어와 라우터를 사용하면 쉬워진다.
- express 모듈은 http 모듈 위에서 동작하기 때문에 require로 불러들일 때 같이 세트로 가져와야 한다.
const app = express();
// 내 코드는 app.js와 서버 설정용 env node인 www가 분리되어 있기 때문에 app을 불러왔다.
var app = require('../app');
var http = require('http');
// port를 number or string으로 normalize하여 3000으로 설정
var port = normalizePort(process.env.port || '3000');
app.set('port', port);
// express 서버 객체 생성
var server = http.createServer(app);
// 설정된 포트로 서버 시작
server.listen(port);
// 에러 이벤트 처리
server.on('error', onError);
// 리스닝 이벤트 처리
server.on('listening', onListening);
// ${port}번호로 정상 실행되었다는 로그 찍기
console.log('port ${port} is running!');
- 익스프레스 서버 객체가 가진 주요 메서드
- set(name, value): 서버 설정을 위한 속성을 지정. set() 메서드로 지정한 속성은 get() 메서드로 꺼낼 수 있음.
- set 메서드에 미리 설정되어 있는 속성 예약어 (이 이름으로 된 name을 만들 순 없다. 이미 만들어져 있으니까)
- env: 서버 모드를 설정
- views: view들이 들어 있는 폴더 또는 폴더 배열 설정
- view engine: default로 사용할 뷰 엔진을 설정. (pug를 많이 씀)
// view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug');
- get(name): 서버 설정을 위해 지정한 속성을 꺼내옴.
- use([path,] function [, function...]): 미들웨어 함수를 사용.
- get([path,] function): 특정 패스로 요청된 정보를 처리함.
- set(name, value): 서버 설정을 위한 속성을 지정. set() 메서드로 지정한 속성은 get() 메서드로 꺼낼 수 있음.
3. 미들웨어로 클라이언트에 응답 보내기
- 클라이언트에 요청이 들어왔을 때 노드에서는 미들웨어를 통해서 순차적으로 필요한 기능을 실행할 수 있다.
- 미들웨어는 .use() 메서드를 이용하여 설정한다.
- 예를 들어 클라이언트 요청이 들어왔을 떄 로그로 남기능 기능을 함수로 만들고 미들웨어로 등록해두면 모든 요청이 이 미들웨어를 거치면서 로그를 남기게 된다.
- 이렇게 어떤 미들웨어를 거친 뒤 다음 미들웨어를 실행시키기 위해서는 next() 메서드를 app.use(function(req, res, next) {어쩌구저쩌구~~~; next()}); 이런식으로 넣어주어야 한다.
- 미들웨어들의 처리가 끝난 후에는 이 요청 정보를 처리할 수 있는 곳으로 전달해주는 라우터를 거치게 된다.
- 라우터를 거쳐서 클라이언트에 응답을 하게 된다.
4. 미들웨어 사용하기
- static 미들웨어
- 특정 폴더의 파일들을 특정 패스로 접근할 수 있도록 만들어 준다.
- 아래와 같이 작성하면 public 폴더 안의 파일들에 대해 도메인주소/파일명 의 경로로 바로 접근이 가능하게 해준다.
var static = require('serve-static');
app.use('/pulic', static(path.join(__dirname, 'public')));
5. 쿠키와 세션 관리하기
- 사용자가 로그인한 상태인지 아닌지 확인하고 싶을 때는 쿠키 또는 세션을 사용한다.
- 쿠키는 클라이언트의 웹 브라우저에 저장되는 정보이다.
- 세션은 웹 서버에 저장되는 정보이다.
5-1 쿠키 처리하기
- 보통 익스프레스에서는 cookie-parser 미들웨어를 사용한다. 이를 통해 쿠키를 설정하거나 확인할 수 있다.
- 쿠키는 서버에서 응답할 때 만들어서 주는 것이기 때문에 res.cookie() 이런식으로 설정하여 뿌리게 된다.
res.cookie('user', {
id: 'pure',
name: '퓨어',
authorized: true
}
5-2 세션 처리하기
- 사용자가 로그인하면 세션이 만들어지고 로그아웃하면 세션이 삭제되는 기능을 만들면 사용자 로그인 여부에 따라 접근할 수 있는 페이지를 제한할 수 있다.
- 세션의 사용 예로는 GET 방식으로 상품 정보 페이지를 요청했을 때 라우터에서 세션이 있는지 확인하고 없으면 로그인 페이지로 redirect하는 것이 있다.
// app.js 같은 설정 모듈에서 이런식으로 session 미들웨어 적용
app.use(expressSession({
secret: 'my key',
resave: true,
saveUninitialized: true
});
// 실제 로그인 라우팅 함수가 구현되어 있는 곳
// session 안에 user 속성 개체 생성
req.session.user = {
id = paramId, //로그인 페이지에서 id를 받아왔을 것이기 때문
name: '세션1',
authorized: true
}
//로그아웃 할 때 세션 삭제
req.session.destroy(function() {});
** 하지만 세션을 사용할 지 jwt를 사용할지에 관해서는 생각이 좀 필요하다. 각각의 장단점이 있다.
6. 파일 업로드 기능 만들기
- 웹 서버에 파일을 업로드할 때는 멀티 파트 포멧으로 된 파일 업로드 기능을 사용한다.
- multer 미들웨어를 사용하여 파일을 업로드 할 수 있다.
- 파일 업로드 시에는 클라이언트에서 post 방식으로 데이터를 전송하기 때문에 body-parser 미들웨어를 함께 사용한다.
- 그런데 미들웨어 사용 순서가 중요하다. body-parser -> multer -> router 순으로 진행되어야 제대로 동작한다.
(??, 내 코드엔 body-parser도 없고 router는 multer위에서 불러왔는데 잘 돌아간다;;)
'Backend > node.js' 카테고리의 다른 글
7. express 프로젝트를 모듈화 하기 (0) | 2022.04.19 |
---|---|
6. Postgresql을 node.js에 연결하기 (0) | 2022.04.19 |
4. 노드의 기본 기능 (1) | 2022.04.19 |
3. node를 이해하기 위한 자바스크립트의 기본 (0) | 2022.04.19 |
2. 노드의 전역 객체, 변수, 모듈 (1) | 2022.04.19 |