즐코

express로 웹서버 역할 해보기 (응답하기) 본문

NodeJS

express로 웹서버 역할 해보기 (응답하기)

YJLEE_KR 2022. 1. 27. 03:31

1/ 사용자,브라우저-서버 간의 역할 (요청과 응답)

2/ express 코드 작성 및 분석

(ft. 동기,비동기 / url)

 

 

1/ 사용자,브라우저-서버 간의 역할 (요청과 응답) 

 

브라우저(사용자) <---> 서버

사용자가 브라우저를 통해 url을 줘서 필요한 정보를 요청하고,

웹서버가 html,css,js 코드를 전달 즉, 응답을 해주면

브라우저가 그 응답을 받아서 텍스트를 읽어서 렌더링 해주는 것

 

http : 통신규격, 규약, 통신 방법을 통해 요청과 응답이 이루어진다.

 

 

요청 들어온 텍스트를 읽어서 요청을 한사람에게 text를 보내는 행위, 응답을 하는 코드를 작성할 것이다(express로!)

 


 

2/ Express 코드 작성 및 분석

 

#1. 아래의 응답 헤더 부분을 express가 작성해주고,

    브라우저 - 개발자 도구 - Network - Header 로 가보면, response headerrequest header가 보여진다.

 

    - Chrome : text로 안나오고 정리된 객체형태로 나온다.

    - Firefox : text (원시형태)로도 볼수가 있다. 사실상 응답 시 그 원시형태의 text를 보내주는 것이다. 

 

#2. 그 이후에 html/css/js를 작성해주는 형태이다.

    브라우저 - 개발자 도구 - Network - Response 로 가보면, 작성된 html/css/js를 볼 수 있다!

 

브라우저는 이 response header를 먼저 읽고 --> 다음 response인 html/css/js를 해석해서 화면에 쏴주는 것이다.

 

 

** 동기 vs 비동기

여기서 교수님이 url로 요청하는 방법이 동기이고, 코드로 요청하는 방법이 비동기라고 했다.

들은 내용을 정리하자면, 

url 요청/응답 : 화면에 렌더링 된 게 전부 바뀌는 경우이다.
응답 헤더부터 시작해서 실질적으로 화면에 보여지는 html/css(+js)파일까지 (처음부터 끝까지) 다 응답해주고,
브라우저가 그걸 차례대로 읽는 거다. 즉 동기적이다. 


코드로 요청/응답 : 전체 화면이 다 바뀌는 게 아니라, 세부적인 요소들만 바꾸는 경우이다.
 (탭을 누르면 전체 화면,틀은 그대로 인데 그 안의 누른 세부 항목만 렌더링되는 것)
세부적인 요소만 바꾸는데 굳이 응답 헤더부터 시작해서 전체 문서를 다 요청하고 응답하는것이 비효율적이니,
코드를 쪼개서 세부적인 부분을 바꿔주는 방법을 쓴다고 하는데,
차례대로 코드가 읽어지는 게 아니므로 비동기적인 부분이라고 볼 수 있다.

이런게 바로 Ajax라는데 나중에 배울 것 같다. 

 

세세하게 express의 코드를 들여다보자

 

1/ require() 메소드 와 객체 형태의 app

 

const express = require ('express')
// node_modules (npm install express하고 나서 생긴 directory, 이 안에 express가 설치되있다)

const app = express()
// express 함수를 담은 app이라는 변수가 궁금하니 console.log를 찍어보았다.

console.log(app) // 객체 형태로 출력된다. 안에 수많은 함수들이 들어가 있다. 
// 즉, express를 만든 개발자가 객체 형태로 함수를 꽉꽉 담아둔거다.

 

require() 메소드 : 다른 파일에 있는 내용을 가져올 때 쓰는 함수라고 기억하자. (모듈을 가져오는 함수!)

 

 

2/ app 객체 안의 메소드를 써서 server를 구동시켜보자

 

 1- app.listen(port#,콜백함수)

 

     첫번째 인자 : port (숫자 3000 또는 8000) 

     두번째 인자 : 콜백함수 작성하기 

 

app.listen(3000,()=>{
	console.log('웹서버 두근두근')
})

  

여기까지 코드 작성 및 저장하고 나서 node server 를 치면, 콜백함수가 실행되고 (웹서버 두근두근)

경로를 치는 커맨드실행창이 안뜨고, 어딘가에 들어와 있다. 

즉, listen() 메소드로 인해 한번 시작하면 꺼지지 않는 프로그램이 된거다. 

 

웹 서버를 구동한다는 건 꺼지지 않는 프로그램을 만든다는 거다.

우리가 인터넷을 쓸 때 시간이 정해져있지 않듯이 웹서버는 항상 준비가 되어 있어야 한다.

 

 

근데, 여기서 우린 꺼지지 않는 프로그램만 만들었지 응답을 주는 코드는 없다! 

응답을 주는 코드를 이제 만들어보자.

 

 

 2- app.get()

 

html 배울 때 나왔던 form 태그에서 method의 속성값으로 get 또는 post를 본적이 있다!

<form method = "get" action ="https://google.com"></form> 

그 때 봤던 get이 지금 app의 메소드로 쓰는 이 get 이다!

 

요청이 get으로 들어왔는지 확인하고나서 get() 안의 코드가 실행되는 개념이다.

근데, 이 get 요청만으로 구분하기엔 너무 종류가 다양하니까 또 한가지 조건을 건다.

그게 바로 첫번째 인자값의 역할이다. 

 

첫번째 인자값 : URI 작성 ( '/' ) 

 

/ 는 Path값 전까지 host, 즉 hostname + port 까지만을 나타낸다. 
/ == localhost (local - 내컴퓨터 host - 자기자신의 도메인)
/ == localhost:8000 인 것이다. 

 

 

URL의 구성을 살펴보자..

URL 을 parsing 해보면, 사람들마다 부르는 명칭이 조금씩 다르지만, 어쨌든 큰 틀은 같으므로 아래를 참고하자.

host 부분의 port는 url 상에는 생략되어 있다. 
path는 경로를 나타낸다.
search-querystring은 ? 뒤부터 나타나는데, key=value 형태로 나타나는거라고만 알고있자..

 

 

 

두번째 인자 : (req,res)이라는 두 인자값을 가진 콜백함수

 

- req : 요청 / 요청 시 상대방이 데이터를 건내주면 저 요청 인자에 데이터가 쌓인다.

- res : 응답 / 내가 결과물을 다 처리하고 요청한 사람에게 데이터를 보내줄 때 .send() 라는 메소드를 사용한다. 

         .send() 메소드 안에는 위에서 본 응답 헤더 뒤에 오는 html 요소를 넣어서 보내주는 것이다.

 

app.get('/',(요청,응답){
	응답.send('<h1>hello Express</h1>')
})

 

 

3 - server를 실행시켜보자 

 

  커맨드 창에 node server를 치고 listen함수가 꺼지지 않는 프로그램을 돌려주자.

 

 

브라우저에 http://localhost:3000 쳐서 들어가보자. 응답.send() 메소드 안에 넣은 html요소가 나온다!! 

 

4 - URI 값 뒤에 path값을 넣어 보자. (메인 -> 다른 페이지로 넘어가보기)

    즉, http://localhost:3000/node 페이지 만들어보기

 

add.get('/node',(요청,응답)=>{
	응답.send('<h2>Hello, node</h2>')
})

 

이 때, 주의할 점이 있다. 그냥 저장하고 바로 해당 url인 http://localhost:3000/node를 치고 들어가면, 

아래와 같이 cannot get이 뜬다.

 

따라서, 무조건 코드를 수정하게 되면 -->  저장하고 --> listen으로 인해 켜져있는 서버를 나갔다가 (ctrl+c)

--> 다시 node server 명령을 주고 url 접속을 해야 코드가 먹힌다

 

정리하자면,

get() 메소드를 통해 
1- 너 혹시 요청 메소드가 get이니? 묻고
2- 너 근데 호스트가 어떻게 됨? / 면 아, path값이 없고 host값만 말하는구나 ㅇㅋ, 콜백함수 실행해줄게~
3- 콜백함수로 받은 요청값은 따로 데이터를 모으고, 응답.send()라는 메소드를 실행시켜서 html요소를 쏴준다. 

 

터미널 창에서 url 의 요소를 출력해주는 curl 을 실행하면 모든 html 내용들이 출력된다는 것도 확인할 수 있다.

 

Comments