Express로 서버 실행하기

소스코드

이 게시물에는 코드작성이 포함되어 있습니다. 소스코드를 받으신 후 진행해 주세요. MEAN Stack/개발 환경 구축에서 설명된 프로그램들(git, npm, atom editor)이 있어야 아래의 명령어들을 실행할 수 있습니다.

git clone https://github.com/a-mean-blogger/hello-world.git
cd hello-world
git reset --hard eaa13c5
npm install
atom .

- Github에서 소스코드 보기: https://github.com/a-mean-blogger/hello-world/tree/eaa13c5356ebaa06bd14df80bee96edb085fac46


Express는 node.js로 서버를 만드는 framework입니다. node.js와 Express를 사용해서 초간단 웹서버를 만들어 봅시다.
git, node js/NPM, atom 에디터는 모두 설치되어 있겠지요?

git bash를 실행한 후 프로젝트 폴더(hello-world)를 생성하고 해당 폴더에 git 저장소를 생성해 줍니다.

현재 폴더에 node 프로젝트를 생성하기 위해 npm init을 실행해줍니다. 이 명령어를 실행하면 프로젝트에 대한 질의 응답이 아래와 같이 나오는데, 일단 아무것도 입력하지 않고 계속 엔터를 쳐서 넘깁니다. 이 질문들을 바탕으로 package.json 파일을 생성하게 되는데, 그냥 엔터를 쳐서 넘기게 되면 해당 질문에 해당하는 항목이 생성되지 않거나, 질문의 기본값(괄호안의 값)이 있는 경우 해당값이 입력됩니다.

혹시 Is this ok? (yes)에서 엔터를 친 후에 다음으로 넘어가지 않는 경우에는 Ctrl+C를 눌러서 종료시켜줍니다. git bash 버그인지 NPM 버그인지는 모르겠는데 가끔 이럽니다.

{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

현재 폴더에 위와 같이 package.json 파일이 생성되었습니다. 사실 npm init 명령어는 이 파일을 생성하는 것이 전부입니다. 이번강의에서 눈여겨 봐야 할 항목은 "main"으로 프로젝트의 실행코드가 들어있는 파일입니다. index.js가 기본값으로 입력이 되었는데요, 즉 이 node 프로젝트를 실행하면 index.js파일의 코드가 가장 먼저 실행됩니다. 아직 index.js파일이 생성되지 않았으므로 생성해 봅시다.

다음으로 Express를 설치합니다. Express는 npm package 입니다.

참고로 설치한 package들은 현재폴더/node_modules에 저장됩니다.

지금까지의 과정이 잘 이해가 되지 않으시면 Node JS 첫걸음/개발 환경 구축을 다시 읽어 주세요. 자세히 읽어보면 다 설명된 내용입니다.

현재폴더를 atom 에디터로 엽니다.

왼쪽 파일 시스템창에서 Express가 설치된 모습이 보입니다. package.json에 dependencies에도 express가 올라가 있는 것을 볼 수 있습니다.

참고로 파일및 폴더의 생성, 삭제, 이동, 복사, 이름 변경 등은 atom에서도 가능합니다.
파일 시스템창에서 마우스 오른쪽 버튼을 눌러서 확인해 보세요.

index.js에 다음을 입력해 줍니다.

//index.js

var express = require('express'); // 설치한 express module을 불러와서 변수(express)에 담습니다.
var app = express(); //express를 실행하여 app object를 초기화 합니다.

app.get('/',function (req,res) { // '/' 위치에 'get'요청을 받는 경우,
 res.send('Hello World!'); // "Hello World!"를 보냅니다.
});

app.listen(3000, function(){ //3000번 포트를 사용합니다.
 console.log('Server On!'); //서버가 실행되면 콘솔창에 표시될 메세지입니다.
});

express 모듈을 express에 담고, app object를 초기화 하는 것은 express에서 항상 하는 것이므로 왜 이렇게 해야하는 지는 지금은 몰라도 됩니다.

app.get('/',function (req,res) { // '/' 위치에 'get'요청을 받는 경우,
 res.send('Hello World!'); // "Hello World!"를 보냅니다.
});

이 이번 포스팅에서 가장 중요한 부분인데요,

app.HTTP method('route', 함수, 함수, 함수...)의 구조를 하고 있습니다.

위에서는 함수를 하나만 사용했지만 함수사이에 ","를 넣어서 여러개의 함수를 넣을 수도 있습니다.

함수에는 req, res, next의 parameter들(이 순서만 중요할 뿐 이름은 바꿔도 상관없습니다)이 자동으로 전달됩니다.

req

request에 관련된 값들과 함수들이 저장되어 있는 object.
HTTP request header, 요청 url, cookies, query, body 등의 정보가 저장되어 있습니다.
이 object의 전체 구조를 확인하고 싶을땐 console.log(req)를 이용해서 안을 확인해 보세요.

res

response에 관련된 값들과 함수들이 저장되어 있는 object.
HTTP response header, cookies, HTTP code 등의 정보를 확인하고 값을 변경할 수도 있습니다.
또한 어떠한 방식으로 response할지도 정할 수 있습니다. 위 예제에서는 res.send를 사용해서 텍스트를 response하였습니다.
이 object의 전체 구조를 확인하고 싶을땐 console.log(res)를 이용해서 안을 확인해 보세요.

next

다음번 함수를 호출 하는 함수입니다. next()를 사용하면 다음 함수로 이동합니다. 위 예제에서는 함수가 하나뿐이므로 parameter에 적지도 않았습니다.

위 코드에서 주석을 빼고 입력하면 atom에서 이렇게 보이겠죠.

hello world강좌라 정말 한 스텝 한 스텝 마다 스크린샷을 찍었습니다.

이제 서버를 실행시킬 차례입니다.

$ node index.js

위 명령어를 입력하면 우리가 코딩한 대로 'Server On!'이라는 메세지가 뜨면서 서버가 실행됩니다.

브라우저를 켜고 http://localhost:3000 에 접속해 봅시다.

저는 여기에 .gitignore, README.md(project의 소개를 담고 있는 파일)을 추가했지만 여러분들한테 꼭 필요한 내용은 아니라서 생략했습니다.

댓글

j
jungbin lee 2016.12.27
이 블로그를 이제야 알다니! 멋집니다.
I
Ian H 2016.12.28
@jungbin lee,
감사합니다^^;
김태현 2017.01.28
events.js:160       throw er; // Unhandled 'error' event       ^
Error: listen EADDRINUSE :::3000     at Object.exports._errnoException (util.js:1022:11)     at exports._exceptionWithHostPort (util.js:1045:20)     at Server._listen2 (net.js:1262:14)     at listen (net.js:1298:10)     at Server.listen (net.js:1376:9)     at Function.listen (C:\Users\admin\Desktop\MyProject\Web\myapp\node_modules\express\lib\application.js:617:24)     at Object.<anonymous> (C:\Users\admin\Desktop\MyProject\Web\myapp\app.js:15:5)     at Module._compile (module.js:571:32)     at Object.Module._extensions..js (module.js:580:10)     at Module.load (module.js:488:32) [nodemon] app crashed - waiting for file changes before starting...
nodemon 을 치면 이런게 나오는데 왜이러는 걸까요
I
Ian H 2017.01.28
@김태현,
3000을 다른 숫자로 바꿔서 실행해 보세요~
J
Jason 2017.02.13
Is this ok? (yes) 여기에서 엔터 말고 yes 를 입력해야 정상적으로 종료가 되더라고요. 블로그 잘 보고 있습니다^^
I
Ian H 2017.02.17
@Jason,
앗. 그런 방법이 있었네요. 맥에서는 그냥 엔터쳐도 종료가 되거든요.
김동권 2017.05.17
감사합니다 잘배우고 있습니다~
김성환 2017.10.04
현재 폴더를 아톰으로 열기 >> atom . 을 실행하면 command not found가 나오는 데 어떻게 해야 할까요?
$ atom . bash: atom: command not found
I
Ian H 2017.10.04
@김성환,
환경변수가 업데이트 되지 않아서 그렇습니다. 컴퓨터를 재부팅해보세요
김성환 2017.10.04
@Ian H,
PATH 없는것 같아 해결했는데 댓글 달아주셔서 글 안지우겠습니다. 빠른 댓글 감사 드립니다. 
I
Ian H 2017.10.04
@김성환,
해결하셨다니 다행이네요^^
김종하 2017.12.08
"현재폴더를 atom 에디터로 엽니다. "
여기서 "atom 에디터" 링크 404 에러 뜹니다
I
Ian H 2017.12.08
@김종하,
수정하였습니다. 알려주셔서 감사합니다^^
J
Jaehong Ahn 2018.02.06
와....감사합니다.. 진짜 엄청나게 친절하고 세세하게, 또 알기 쉽게 쓰여진 강좌/가이드인거 같습니다. 구글링의 구글링을 거쳐 어쩌다 정말 우연히 여기까지 왔는데 정말 도움이 됩니다. 잘 보고 가요!
I
Ian H 2018.02.13
@Jaehong Ahn,
격려의 말씀 감사합니다^^
반팔 2018.09.19
한 단계 한 단계 따라해보고 있어요. 감사합니다!
I
Ian H 2018.09.19
@반팔,
^^ 화이팅!
컴신 2018.11.08
너무 깔끔하니, 설명이 잘되어있어서 한번 읽었을뿐인데 전부 다 쏙쏙 들어오네요. lan H님 atom에서 에디터 theme  설정 어떤걸로 하셨는지 알려 주실 수 있을까요 ?!  lan H님 에디터가 눈에 확 잘들어오네요!!
I
Ian H 2018.11.08
@컴신,
감사합니다^^ 기본 theme인데.. 아마 저때랑 지금이랑 기본 theme 색깔이 조금 달라진 것 같아요.
j
js lee 2019.03.12
이 게시 글은 2016년도에 작성 되어진건데.... 2019년 이제야 이 블로그를 알다니.... 알기 쉽게 내용을 잘 정리 해주셔서 열심히 공부하겠습니다. 감사합니다.
I
Ian H 2019.03.12
@js lee,
반갑습니다^^ 궁금하신 점 있으시면 질문도 해주세요!
댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP