본문 바로가기
Web/backend

Node.js 기본 개념 및 간단한 웹서버 구현

by yongmin.Lee 2020. 10. 24.

1. 기본 개념

* Node.js

: V8-engine based runtime which allows using Javascript in server

V8 자바스크립트 엔진을 기반으로 하는 서버에서 자바스크립트를 사용하게 해주는 런타임

 

- 특징

1. single thread

2. non-blocking I/O

3. event-drive

 

* Global Object

1. console : 콘솔 창에 결과를 보여주는 객체

 - dir(object) : 객체의 속성들을 출력

 - time(id) : 실행시간 측정을 위한 시작시간 기록

 - timeEnd(id) :  실행시간 측정을 위한 종료시간 기록

 

2. process : 프로세스의 실행에 대한 정보를 다루는 객체

 - argv : 프로세스를 실행할 때 전달되는 파라미터 정보를 담고 있는 배열 객체

 - env : 환경변수 정보를 담고 있는 객체

 - exit() : 프로세스를 끝내는 메소드

 

3. exports : 모듈을 다루는 객체

 

* Global variable

- __dirname : 폴더의 전체 패스가 출력됨

- __filename : 파일의 전체 패스가 출력됨

 

* Modules

: 별도의 파일로 분리된 독립 기능의 모음

 

1. 외장 모듈 : 다른 사람이 만들어 둔 모듈

 

2. 내장 모듈

- os : 시스템 정보를 알려줌

- path : 파일 패스를 다루는 메소드 제공

  - join() : 여러개의 이름을 합쳐 하나의 파일 패스로 만들어 줌

  - dirname() : 파일 패스에서 디렉터리 이름을 반환

  - basename() : 파일 패스에서 파일의 확장자를 제외한 이름 반환

  - extname() : 파일 패스에서 파일의 확장자 반환

- url : 주소 문자열 안에 있던 정보를 나누고 객체를 만들어 객체의 속성으로 보관

- querystring : 요청 파라미터(query string)를 쉽게 분리

- fs : 파일시스템에 접근및 파일을 다루는 메소드 제공

-http : 웹 서버 기능을 담당하는 서버객체를 만들 수 있음

-events : 이벤트 핸들링 메소드 제공 

-util : 상속메소드 제공

 

* Handling url and request parameters

  - url.parse() : 주소문자열을 파싱하여 url객체를 생성

  - url.format() : url객체를 주소문자열로 변환

  - querystring.parse() : 주소문자열을 파싱하여 url객체를 생성

  - querystring.format() : url객체를 주소문자열로 변환

 

* Handling events

- require('events').EventEmitter.on(event, listener) : 지정한 이벤트 리스너를 추가

- require('events').EventEmitter.once(event, listener) : 지정한 이벤트 리스너를 추가하지만 한 번 실행후 자동으로 리스너 제거

- require('events').EventEmitter.removeListener(event, listener) : 지정한 이벤트에 대한 리스너 제거

- require('events').EventEmitter.emit(event) : 지정한 이벤트 발생

 

* request vs response

- request : 클라이언트가 서버에게 웹페이지를 보여달라고 말하는 것

- reponse : 서버가 클라이언트에게 요청받은 것에 대한 대답으로, 웹페이지 내용을 표현하기 위해 html문서로 주는것

 

* HTTP 패킷

 클라이언트가 서버로 요청을 했을때, 보내는 데이터

-  HTTP패킷의 구조는 크게 헤더  바디로 나뉘어진다.

- 헤더에는 7가지 HTTP 메서드 방식(GET, POST, PUT, DELETE, PATCH, ...)중 무엇을 썻는지, 클라이언트의 정보, 브라우저 정보, 접속할 URL 등등 과 같은 클라이언트 정보를 담는다. 

- 바디는 보통 비어있다. 하지만, 특정 데이터를 담아서 서버에게 요청을 보낼 수 있다.

 

* GET방식 vs POST방식 

두 방식 모두, 서버에 요청을 하는 메서드이다.

 

- get 방식 : 'HTTP패킷 헤더'부분에 요청 정보를 넣어 보낸다

- post 방식 : 'HTTP패킷 바디'부분에 요청 정보를 넣어 보낸다

 

get 방식은 주소 표시줄에 입력한 내용이 나타나며 256byte~4096byte까지의 데이터만을 서버로 전송할 수 있다. 주소 표시줄에 입력한 내용이 노출되기 때문에 보안상의 문제가 민감한 경우에는 사용하지 않는다.
- post 방식은 입력된 내용의 크기에 제한을 받지 않고 입력한 내용이 노출되지 않기 때문에 회원가입, 로그인 시 등에 많이 사용

 

 

2. 간단한 웹서버 구현

* 서버 구현

//src/index.js
const http = require('http');

//웹 서버 객체 생성
const server = http.createServer();

//웹 서버를 시작하며 3000번 포트에서 대기하도록 설정
const port = 3000;
server.listen(port,()=>{
    console.log('웹서버가 시작됨 [port : ' + port + ']');
});

//클라이언트 연결 이벤트(connection) 처리 : 클라이언트가 웹서버에 연결되면 connection 이번트 발생
server.on('connection', (socket)=>{

    //클라이언트의 ip와 port 정보 확인
    const addr = socket.address();
    console.log('클라이언트 접속 : %s, %d', addr.address, addr.port);
});

//클라이언트 요청 이벤트(request) 처리 : 클라이언트가 특정패스로 요청을 하면 request 이벤트 발생
server.on('request', (req,res)=>{
    console.log('request 이벤트 발생');
    console.dir(req);
    
    // 클라이언트로 응답을 보냄
    res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); //응답으로 보낼 헤더
    res.write("<!doctype html>");
    res.write("<html>");
    res.write("<head>");
    res.write("<title>nodeTest</title>");
    res.write("</head>");
    res.write("<body>");
    res.write("<p>hello node</p>");
    res.write("</body>");   
    res.write("</html>");
    res.end();     //전송
});

//서버 종료 이벤트 처리
server.on('close', ()=>{
    console.log('서버가 종료 됨');
});

MIME Type (Multipurpose Internet Mail Extensions :내용이 어떤 형식인지 알려주기 위한 인터넷 표준) -> content-type의 값

- text/plain : 일반 텍스트 문서

- text/html

- text/css

- text/xml

- image/jpeg, image/png

- vedio/mpeg, audio/mp3

- application/zip

 

* 서버 실행

node src




'Web > backend' 카테고리의 다른 글

인증(Authentication) & 인가(Authorization)  (0) 2020.10.24
Django polls 앱  (0) 2020.10.24
HTTP, RESTful API  (0) 2020.10.24
Django 기본 개념  (0) 2020.10.24
0. web service intro  (0) 2020.07.18