웹 풀 사이클 데브코스

[TIL] Day08 - 백엔드 node js 시작하기

닿다라다나닷 2024. 4. 19. 13:28

간단 테니스 쇼핑몰 페이지 제작하면서 직접 동작시켜보자!

 

백엔드

웹서버, 웹 어플리케이션 서버, 데이터베이스 모두 백엔드

 

웹서버, 웹 어플리케이션 서버, 데이터베이스

웹서버 : 정적 페이지에 대응. 동작페이지에 대한 처리를 직접하지 않고, 웹 어플리케이션 서버에 전달한다.

정적 페이지 : 화면의 내용/데이터 등의 변동이 없는 페이지

동적 페이지 : 데이터 처리/연산을 통해 화면의 내용, 데이터가 변하는 페이지

웹 어플리케이션 서버 : 동적 페이지를 처리한다. 연산을 위해 데이터베이스와 연결되어있으며 데이터 조회, 수정, 삭체 등 처리를 요청한다.

데이터페이스 : 데이터를 통합해 효율적으로 관리하기 위핸 데이터 집합체

 

Node.js

자바스크립트가 백엔드에서 동작할 수 있게 지원하는 플랫폼이다. 프로그램을 구성할 수 있는 스크립트가 아닌, 프로그래밍 언어로써 작동하게 하는 플랫폼!

웹서버, 웹 어플리케이션 서버의 역할을 할 수 있다.

 

server.js 서버 열기

let http = require('http');

function onRequest(request, response){
    response.writeHead(200,{'Content-type': 'text/html'});
    response.writeHead('Hello Node.js');
    response.end();
}

http.createServer(onRequest).listen(8888);

터미널에서 서버를 start 하겠다는 명령어 작성해주어야 한다. `node 파일명.js`

 

http 프로토콜 약속을 nodejs 에서 제공하는 것을 require로 받아와서 http 변수에 할당한다.

onRequest 함수 : 클라이언트에게 요청이 오면, 요청과 응답을 통해서 함수를 작동시킨다.

만든 서버의 통신 함수를 괄호 안에 넣고, 클라이언트와 통신할때는 8888 포트넘버로 접속하라고 지정하는 코드

 

포트 번호 port number : 클라이언트의 요청과 응답은 웹서버가 받는다. 클라이언트에 제일 많이 소통하는 부분

HTTP 프로토콜 템플릿 : 통신 약속. head / body(웹페이지에 화면에 뿌려질 데이터 담는다)

head에는 어떤게 담기는가?

통신상태 → 200(정상), 404(못찾겠다), 500(서버가 이상하다) 등 HTTP status code가 담긴다.

응답 형태 → html이다

 

onRequest 함수 안에, 

writeHead : 프로토콜 head에 통신상태와 응답형태를 담는다. `200`, `'Content-Type' : 'text/html'`

write : body 생략, 화면에 뿌려질 데이터 담는다.

end : response 날라간다. 끝났다는 표시.

 

server.js 모듈화

index.js

let server = require('./server')

만든 server를 다른 파일에서도 동일하게 호출해서 사용할 수 있다.

 

원할때 서버를 start 구동시키는 방법

///index.js
let server = require('./server')

server.start();

js의 함수는 작성된 파일 내에서만 사용가능하기 때문에, server.js 의 start 함수를 index.js 에서 사용하려면, export 처리를 해주어야 한다.

///server.js
let http = require('http');

function start(){
    function onRequest(request, response){
        response.writeHead(200, {'Content-type': 'text/html'});
        response.write('Hello Node.js');
        response.end();
    }
    
    http.createServer(onRequest).listen(8888);
}

exports.start = start;

 

url 값 전달하기

localhost : Uniform Resource Locator

URL : 인터넷에서 웹페이지가 어디있는지 위치를 알려주는, 웹페이지 주소

localhost : 내 컴퓨터 pc 주소

pathname : 8888뒤에 이어지는 경로!

 

index.js router.js server.js

이 pathname을 router가 받아서 전달하는 역할을 한다. 

route + r : 경로 + r

///index.js
let server = require('./server')
let router = require('./router')

server.start(router.route);
///router.js
function route(pathname){
    console.log('pathname : ' + pathname);
}

exports.route = route;
///server.js
let http = require('http');
let url = require('url');

function start(route){
    function onRequest(request, response){
        let pathname = url.parse(request.url).pathname;
        route(pathname);

        response.writeHead(200, {'Content-type': 'text/html'});
        response.write('Hello Node.js');
        response.end();
    }
    
    http.createServer(onRequest).listen(8888);
}

exports.start = start;

index.js : 모듈 소환, 서버 기동

router.js : 경로 콘솔에 찍기. request의 url에 따라 route루트를 정해준다.

server.js :  request 받고, response 해주는 역할

흐름? index에서 server.start(router.route) 실행, 이때 router모듈의 route 함수를 전달한다. (require로 받아놓음) → server에서 받아온 route 값으로 start 함수 실행 → route(pathname)으로 함수 호출 → router모듈의 route 함수 실행으로 console에 path가 찍힌다.

 

+requestHandler.js

requestHandler.js : 라우터가 route를 분배해서 각 경로를 알려주면 경로에 따라서 요청및 처리작업을 한다.

`{}` : key:value 로 구성된 dictionary 사전 `let handle = {};` handle['key'] = value

///requestHandler.js
function main(){
    console.log('main');
}

function login(){
    console.log('login');
}

let handle = {};
handle['/'] = main;
handle['/login'] = login;

exports.handle = handle;

index.js에서 require로 requestHandler 받아오고 `let requestHandler = require('./requestHandler'); `

start함수 요청할때 같이 동일하게 인자 전달을 해야한다. `server.start(router.route, requestHandler.handle);`

server.js 에서도 handle 인자를 받아오고 `function start(route, handle){ `

route에 handle을 같이 전달한 다음, `route(pathname, handle);`

router에서 handle 형식으로 호출한다. `handle[pathname];`

*강의에서는 handle 호출할때 함수처리되어서 () 소괄호를 꼭 넣어주라고 하던데, node.js 실행하면 `handle[pathname] dis not a function`이라는 에러문구가 뜬다..

 

response 처리를 server.js가 아닌, 다른 곳에서 하려면?  requestHandler.js에서 처리하고, response 인자를 전달해주어야한다.

`route(pathname, handle, response);` → `handle[pathname](response);` requestHandler.js

//requestHandler.js
function main(response){
    console.log('main');

    response.writeHead(200, {'Content-type': 'text/html'});
    response.write('ChaeDahee');
    response.end();
}

function login(response){
    console.log('login');

    response.writeHead(200, {'Content-type': 'text/html'});
    response.write('Login page');
    response.end();
}

그!런!데! 여전히 handle이 함수가 아니라는 타입에러가 발생한다.

해결하기 위해 router.js에서 if문 typeof 로 함수인지 아닌지 처리를 해주었다.

//router.js
if(typeof handle[pathname] == 'function'){
        handle[pathname](response);
    } else{
        response.writeHead(404, {'Content-type': 'text/html'});
        response.write('찾으시는 페이지가 없습니다.');
        response.end();
    }
}

 

☑️ 배운 점

nodejs 코드 처음 짜봤는데, 조금 복잡한 자바스크립트 같은 느낌이다.

그리고 서버를 자꾸 열고 닫아야해서 꽤 불편?하다.

 

response와 request처리, 인자 전달, exports 등 학습할 것이 많은 것 같다.

이제 아무래도 복습할 강의가 점점 많아질 것 같은 느낌이다.