Node.js 템플릿 엔진은 무엇인가??


템플릿 엔진을 통해 짧은 코드로 HTML을 만들어 낼 수 있다.


템플릿 엔진을 사용하기위해서는 설치해서 Express와 연력해서 사용해야한다.



jade 템플릿 엔진 사용

npm install jade --save

var express = require('express');

var app = express();


// 템플릿 엔진 세팅하기

app.set('view engine', 'jade');

// 템플릿 엔진 디렉토리 설정하기 (템플릿을 ./views에 넣는다. )(생략해도 가능하다)

app.set('views','./views');

// 라우트 설정하기, 템플릿 경로를 통해 들어온사람에게 temp라는 템플릿파일(jade)(./views)를 랜더링(응답) 해서 보여준다.

app.get('/template', function(req,res){

res.render('temp'):

});


app.use(express.static('public'));

app.get('/', function(req, res){

res.send('Hello homepage');

});


app.get('/dynamic', function(req,res){

var lis = ' ' ;

for (var i=0; i<5; i++){

lis = lis + '<li>coding</li>;

}

var time = Date();

var output = `

<!DOCTYPE html>

<html> <head> <meta charset="utf-8"> <title></title> </head> <body> Hello, Dynamic!

<ul>

${lis}     

    </ul>

${time}

     </body>       </html>`

res.send('output')

});


app get('/login', function(req,res){

res.send('Login');

});

app.listen(4170, function(){

console.log('Connected 4170 prot!');

});

cf.) 동적인 node의 소스 내용이 바뀌었을때 자동으로 재실행하게 해준다. 

npm에서 supervisor를 검색 --> npm install supervisor -g를 사용해 전역적으로 설치한다. 

supervisor 명령어를 통해 node 를 실행하면 자동으로 재실행한다. 




jade 사용할때 들여쓰기 하기 

+ jade에 변수로 넣어서 사용하기 

html

head

body


↑위와같이 들여쓰기로도 가능하지만...


-------------------------------------


소스코드 express(); 부분 다음으로

app.locals.pretty = true;

추가하면 잘 구분해준다.


html

head

body

h1 Hello Jade

ul

-for(var i=0; i<5; i++) // (-)사용하기

li coding

div= time                       // 오류난다. 변수의 값을 바깥에서 전해주어야한다.

=========================================================

: app.get('/template', function(req,res){

res.render('temp', {time:Date()}    //render에 time을 새로 정의해서 사용한다.

});


--------------------------------------------------------------------------------------------------



Node.js 에서 정적인 파일을 Express 를 통해 적용해보기


기존에 사용했던 코드에 추가시킨다.

doc : http://expressjs.com/ko/starter/static-files.html

var express = require('express');

var app = express();


// 추가 : 정적인 파일을 위치시키고 싶은 디렉토리를 지정

app.use(express.static('public'));


app.get('/', function(req, res){

res.send('Hello homepage');

});

app get('/login', function(req,res){

res.send('Login');

});

app.listen(4170, function(){

console.log('Connected 4170 prot!');

});



Express 를 통해 웹페이지를 정적과 동적으로 표현하기

정적이다 : 한번만 만들면 언제나 똑같은 모습인 HTML을 만들겠다. 

public 디렉토리에 HTML파일을 넣는 것이다. -> 사용자가 접근했을때 위에서 추가한 코드에 의해서 pubilc 디렉토리에서 파일을 찾는다. 


public 디렉토리에서 static.html이라는 HTML문서를 만들고 주소/static이라는 것을 하면

정적인 파일은 내용을 수정하면 바로 적용시킬 수 있다. 

var express = require('express');

var app = express();


app.use(express.static('public'));

app.get('/', function(req, res){

res.send('Hello homepage');

});


// 추가 get으로 것은 정적인 것과 다르게 서버를 껐다가 다시 켜야지 적용된다.

app.get('/dynamic', function(req,res){

var output = `<!DOCTYPE html>

<html> <head> <meta charset="utf-8"> <title></title> </head> <body> Hello, Dynamic! </body> </html>`

res.send('output')

});


app get('/login', function(req,res){

res.send('Login');

});

app.listen(4170, function(){

console.log('Connected 4170 prot!');

});


그럼 정적인 것이 좋은데 왜 동적인 것을 사용하나??

정적인 HTML과 다르게 프로그래밍적(동적)으로 코드를 짤 수 있다. 

(순수 HTML은 현재 시간을 표시하는 능력 이미 화면에 표시된 것을 동적으로 바꾸는 것이 어럽다.)

var express = require('express');

var app = express();


app.use(express.static('public'));

app.get('/', function(req, res){

res.send('Hello homepage');

});


app.get('/dynamic', function(req,res){

// 동적으로 프로그래밍 구현 할 수 있다.

var lis = ' ' ;

for (var i=0; i<5; i++){

lis = lis + '<li>coding</li>;

}

// 시간 표현해보기

var time = Date();

var output = `

<!DOCTYPE html>

<html> <head> <meta charset="utf-8"> <title></title> </head> <body> Hello, Dynamic!

<ul>

${lis}     // 반복 추가 ${}를 통해 변수 사용가능

    </ul>

${time} // 현재시간추가

     </body>       </html>`

res.send('output')

});


app get('/login', function(req,res){

res.send('Login');

});

app.listen(4170, function(){

console.log('Connected 4170 prot!');

});



왜 Node.js에 Express라는 것을 적용해서 사용해야하나??


Node.js가 그 나름대로 엄청나게 편리하고 효율적이지만 

Node.js를 조금 더 효율적으로 더 좋게 사용하기 위해 만들어진 Framework를 사용해서 만들자.


Express : exprssjs.com


express 적용하는 과정 ↓

// 패키지 만들 경로 들어가서

npm init // json패키지 만들기

npm install express --save // express 패키지 다운


프로젝트 폴더에 파일(app.js)을 만들어서 웹페이지 서버 만들어 보기


var express = require('express');

var app = express();

app.get('/', function(req, res){

res.send('Hello homepage');

});

app get('/login', function(req,res){

res.send('Login');

});

app.listen(4170, function(){

console.log('Connected 4170 prot!');

});



Node.js에서 동기(Synchronous)와 비동기(Asynchronous)


Node.js의 홈페이지의 첫 화면을 보게되면 아래와 같이 쓰여있는 것을 확인 할 수 있다. 




이중에 non-blocking(논 블로킹) I/o 모델을 사용해 가볍고 효율적이라고 하였는데

non-blocking이라는 것이 비동기화 방식을 말하는 말이다.


동기(synchronous)와 비동기(asynchronous)를 blocking과 non-blocking 이라고 말할 수 있다.

그중 blocking은 우리가 많이 경험해 본 것인데 

함수호출 순서에서 함수의 콜백이 이루어졌을때 콜백의 결과를 기다렸다가 다음줄을 실행하는 경우를 뜻하고

그와 반대로 non-blocking 은 

함수호출 순서에서 함수의 콜백이 이루어졌을때 콜백의 결과를 기다리는 것이 아닌 콜백함수를 호출하면서 다음줄을 실행하는 경우를 뜻 한다. 


아래 예제 소스 파일을 보면 이해가 더 쉬울 것이다.


ex) node.js의 fs.writefileSync와 fs.writefile 사용

//동기 방식(blocking) fs.writeFileSync (Sync)가 붙은걸 확인


const fs = require('fs'); console.log('A point'); fs.writeFileSync('message.txt','Hello Node.js');

console.log('B point');


-----------------------------------------------------------------


//비동기 방식(non-blocking) fs.writFile (Sync)가 안붙은걸 확인


const fs = require('fs'); console.log('A point'); fs.writeFile('message2.txt','Hello Node.js',function() { console.log('file wrote'); }); console.log("B point");


동기 방식과 비동기 방식을 구현했다. 

결과는 어떻게 나올까?


//동기 방식(blocking)

A point

B point


// 비동기 방식 (non-blocking)

A point

B point

file wrote

라고 출력된것을 확인 할 수 있고, 

비동시 방식에서 보면 file wrote가 코드순서와는 다르게 맨 마지막에 cosole.log가 찍힌것을 볼 수 있다.


Callback 함수


한마디로 "누군가 에게 호출된 함수" 라고 할 수 있겠다

풀어서 말하면  '누군가(다른 함수)에게 (나중에)호출된 (기존의)함수' 라고 할 수 있겠다.


예를 들어 < 참조 : JavaScript sort array : http://www.w3schools.com/jsref/jsref_sort.asp >

a = [3,1,2]; console.log(a);

// [3, 1, 2]


a = [3,1,2]; a.sort(); console.log(a);

// [1, 2, 3]


a = [3,1,2]; function b(v1, v2) {return v1-v2 }; a.sort(b); console.log(a);

// [1, 2, 3] 오름차순


a = [3,1,2]; function b(v1, v2) {return v2-v1 }; a.sort(b); console.log(a);

// [3, 2, 1] 내림차순


a = [3,1,2]; function b(v1, v2) {return 0 }; a.sort(b); console.log(a);

// [3, 1, 2] 정렬안됨


a = [3,1,2]; function b(v1, v2) {console.log('c',v1,v2); return 0 }; a.sort(b); console.log(a);

// c 3 1

// c 1 2

// [3, 1, 2] 정렬안됨

마지막 번 정렬을 확인하게 되면 v1, v2값을 비교해서 비교한 값을 가지고 정렬을 한다는 것을 알 수 있다. 

총 2번 b함수가 호출된것을 알 수 있다. 


배열의 입력같으로 함수를 준다. 

그리고 sort라는 함수의 인자로 다른 함수를 전달 했고 이렇게 전달된 함수를

Callback 함수라고 부르게 된다. 


Callback함수(위에서 function b)를 우리가 만들었지만 우리가 호출한 것이 아닌 a.sort()를 통해 호출 되어졌다.


일회성으로만 줄 경우에는 이름을 굳이 줄 필요가 없다. 따라서 이렇게 구현 가능하다. 

익명함수 라고도 한다. 

a = [3,1,2]; a.sort(function(v1, v2){return v2-v1;}); console.log(a);

// [3, 2, 1] 내림차순

----------------------------------------------------------------------

//callback 함수가 실행되는 과정 예를 들어 설명


function sort(callback){callback();};

sort(function(){console.log('Hello Callback')});

function() --> console.log('Hello Callback');

function()함수가 정의가 됐고 sort의 인자로 전달되고 sort가 실행이된다. 

callback이라는 매개변수를 가진 callback()(콜백함수)를 호출해 실행시킨다.



Node.js v.6.94 doc : https://nodejs.org/dist/latest-v6.x/docs/api/



http모듈 사용해보기

const http = require('http');
 
const hostname = '127.0.0.1';
const port = 1337;
 
http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
}).listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

상수를 나타내는 const를 사용해서 변하지 않는 것을 사용했다. 

Node.js docs를 확인해서 HTTP모듈에 대한 사용설명서 (API)를 확인한다. 

모듈이라는 것은 부품이라고 할 수 있는데 부품을 가져다 사용할때는 'require'을 통해 사용할 수 있다. 



os모듈 사용해보기

var o = require('os');

console.log(o.platform());




다른사람이 만든 모듈 사용해보기 : NPM

Node Package Manager


JavaScript(+Node.js)가 제공하는 모듈이 아닌 타인의 모듈을 사용하는 방법을 알아보자


npm 사이트(https://www.npmjs.com/) 에서 검색후 cmd창에서 npm install ......  하는 명령을 입력해주고 설치 할 수 있다. 


여기서 설치 명령중 끝에 -g가 붙은것을 확인 할 수 있는데 

g는 global이라는 의미이며 컴퓨터 전역에서 사용하는 독립적인 소프트웨어가 설치된다.

g를 없이 사용하게 되면 현재 npm을 설치하는 프로그램 프로젝트안에서 부품으로 사용하겠다는 의미이다.



ex) 독립적인 소프트웨어로 uglify 설치하고 사용해보기

npm install uglify-js -g

uglifyjs _____.js

uglifyjs _____.js -m

uglifyjs ______.js -o 새로저장할파일명.js -m

uglifyjs ______.js -o _________.min.js -m



ex) _underscore 프로그램 프로젝트 안에서 부품으로 사용해보기

설치하기 이전에 프로젝트 디렉토리를 npm의 패키지의 일종으로 지정을 해줘야한다.

설정할 프로젝트 디렉토리에 들어가서 

npm init 실행

name지정(프로젝트이름) discription입력 entry point(어떠한게 패키지를 구동시키는 자바스크립트인지 지정, 후에 바꿀 수 있다.) test테스트명령어 입력 git repository올리고 싶으면 주소써라 엔터엔터 yes하고 끝

이렇게 실행하고 나면 package.json이 생긴다. 그러면 끝 (프로젝트폴더가 생성된것이다.)

나중에 우리가 만든 프로젝트를 공유할 수 있고, 다른사람것을 사용할 수 있는 준비가 되었다는 것이다.

npm install underscore

설치가 완료되면 node. 과 unsderscore폴더가 생긴다. 


TIP!!! 설치중에 No repository field. 라는 것이 발생 할 수 있는데 이것은 git repository가 저장되어 있지 않아 발생하는 경고이다. 

오류가 발생한것이 아닌 단순 경고!! 그냥 github에 연결되어있지 않다는 이야기.


설치완료창을 보면 extraneous(외부의,부가적인)써있는데 온전하게 포함하지 않았다는 얘기이다.

따라서 npm install underscore --save를 하면 조금 달라지게 생성된다.(플래그생성)

이전에 없었던 dependencies라는 란이 생기게 된다. 

플래그로 선언된 프로젝트버전을 언제든지 내프로젝트에 포함할 수 있다는 이야기이다.

일시적으로 사용해야 할 경우에는 save를 빼고 설치하면된다 (코딩하는 경우에서 잠깐사용할 때 쓰면 될 것 같다.)



underscore는 매우유용한 라이브러리이다. (진짜 개조은듯)

모듈 디렉토리를 사용해야하니 모듈 디렉토리를 선언해주고 사용한다.

const _ = require('underscore');

var arr = [3,6,9,1,12];

console.log(arr[0]);    // 3

console.log(_.first(arr));    // 3

console.log(arr[arr.length-1]);    // 12

console.log(_.last(arr));    // 12



윈도우10에서 관리자모드가아닌 일반모드로 cmd를 실행하였을때

권한에 대해서 오류가 발생하는 것을 확인 했다.

따라서 일반모드가 아닌 관리자 모드를 통해서 npm 설치를 진행하여야한다.






Web에서 사용되었던 JavaScript가 google이 개발한 자바스크립트엔진 V8에 의해 '탈웹화'를 했고, 

따라서 Web에 국한되어있던 JavaScript가 다양한 곳에서 사용될 수 있는 계기를 맞이했다.  

그리고 라이언달이라는 사람에 의해 2009년에 Node.js 프로젝트가 출발하게 되었다. 


Node.js를 설치하고 .

Node.js에서 제공하는 소스코드를 가지고 서버를 실행시킨다. (cmd 창 이용)


createServer를 통해 서버를 만들고 .listen을 통해 port와 hostname을 듣는다.

따라서 브라우저에 호스트네임과 포트번호를 입력하게 되면 서버에 접속할 수 있게 되고

Hello World를 출력하는 브라우저 창을 확인 할 수 있다. 



아래는 Node.js에서 제공하는 튜토리얼 소스코드 이다.

const http = require('http');
 
const hostname = '127.0.0.1';
const port = 1337;
 
http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
}).listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

require이라는 것을 통해 http라는 모듈을 가지고 사용한다는 것을 알 수있다.


프로그래밍 언어 번역방식


프로그래밍 언어를 분류하는 기준에는 번역방식에 따라 분류하는 방식이 있는데 


컴파일 방식 : 

프로그램 소스코드를 작성하고 컴파일을 하게 되면 실행가능한 프로그램이 생성된다. (바이너리파일) 번역과 실행이 따로 된다.

< C, C++, C#, JAVA, C# 등 >


인터프리터 방식 : 

프로그램 소스코드가 목적프로그램 or 바이너리 파일로 변환되는 번역과정이 일어나지 않는다. 번역되어서 저장되는 절차가 없다. 

한줄한줄 실행된다고 생각하면 편하다. (따라서 한줄에서 오류가 발생했을 경우 다음줄부터는 아예 실행이 되지 않는다.)

< JavaScript, ActionScript, VB Script, SQL, HTML 등 >

cf. 인터프리터 언어의 특징은 매우 한정적이고, 제한적인 사용용도를 가지고 있다고 볼 수 있다. ex) SQL(관계형 데이터베이스 시스템 언어)




추가할것

JavaScript let와 var const


참고 : http://blog.nekoromancer.kr/2016/01/26/es6-var-let-%EA%B7%B8%EB%A6%AC%EA%B3%A0-const/

CSS문법 : 선택자 사용해보기 (맛보기)


CLASS 와 ID 


CLASS

CSS를 사용하면서 전체적인 스타일을 일관성있게 표현해주기 위해서는 클래스를 사용하는 것이 필수적이라고 할 수 있다. 

아래 코드에 CLASS를 사용했는데 CLASS는 얼핏보면 구조체 정의하는 것처럼 생겼다.

HTML에 CSS를 적용하는 것처럼 똑같이 사용하면 된다. 

CLASS를 선언해줄때는 '.'를 사용한다. 

아래코드에서 .size-40px 처럼 앞에 .을 사용한 것을 확인 할 수 있다.

클래스를 사용할 때에는 

class="클래스명" 으로 사용하면 된다.

(※편의상 내부스타일 방식으로 구현했다.)




ID

ID도 CLASS와 적용하는 방법이 비슷하다. 

CLASS는 .으로 선언해준 반면에

ID는 #으로 선언해준다. 

그렇다면 CLASS와 ID의 차이점은 무엇일까?

아래 코드를 보면 위의 CLASS를 다 ID로 바꾸기만 한 코드인데 

3번째 줄은 적용이 되지 않은 것을 확인 할 수 있다.  


즉, ID안에는 하나의 속성만 사용될 수 있다. 


따라서 한페이지 내에서 여러번 반복될 필요가 있는 스타일은 CLASS 선택자를 사용하고 

한번 유일하게 적용될 스타일은 ID 선택자를 사용하는 것이 바람직하다. 


CLASS 속성은 어떤 분류안에 포함된 요소의 특성을 정의하는 데 사용이되고, 

ID 속성은 어떤 요소에 대해 유일한 특성을 정의하는데 사용이되는게 바람직 하기 때문이다.  


EX)

글자색이나 글자 굵기 등 나중에 다른 곳에도 적용할 수 있는 스타일을 CLASS로 지정하고

웹 문서 안에서 요소의 배치 방법을 지정할 때는 ID 속성을 사용하는 것이 좋다. 



CLASS 와 ID혼용 사용

ID속성으로 유일한 특성(기울기)를 정의해 적용했다. (#second)






CSS란? 


Cascading Style Sheet 을 말하여 웹에 사용되는 HTML 문서가 사용자에게 어떻게 보여지게 할지 만들어(꾸며) 주는 언어이다.


Mozilla에 설명이 잘 되어있어서 링크를 걸어둔다. (https://developer.mozilla.org/ko/docs/Web/CSS/ko/docs/Web/CSS/시작하기/CSS란)



HTML에 CSS를 적용하는 3가지 사용법이 있다.


1. 인라인(inline)방식

2. 내부스타일 시트

3. 외부스타일 시트 

(4. CSS 임포트)


1. 인라인 방식 

말그대로 HTML 코드안에서

<span>이라는 태그와 style속성을 통해 CSS 속성을 주어 사용한다.

※Result 누르면 결과를 확인 가능하다.




2. 내부스타일 시트 

HTML코드안에 넣는 것은 아니지만 같은 HTML문서 안에서 넣는 방식이다. 

<span>이라는 태그를 사용하였고

코드 외부에서 <span>태그를 정의하는 것처럼 <style>속성의 CSS를 사용하는 방식이다.

※Result 누르면 결과를 확인 가능하다.



3. 외부스타일 시트 

HTML코드안에 넣는 것도 아니고 같은 HTML문서 안에 넣는 방식도 아니다. 

HTML의 가장 중요한 것!  

링크를 통해서 확장자가 .CSS인 문서를 HTML과 연결 시켜주는 것이다. 

아래 코드를 보면 알 수 있는데 

<link rel ="stylesheet" href="style.css">를 통해 HTML에 style.css를 링크를 걸어 준걸 볼 수 있다. 

따라서 내부스타일 시트와 다르게 <style>태그 없이 바로 <span>을 통해 속성값을 줄 수 있다는 것도 확인 가능하다.

※CSS, Result 누르면 CSS문서와 결과를 확인 가능하다.



(4. CSS 임포트)

3. 외부스타일 시트 처럼 CSS를 작성하고 HTML에 @import url을 사용해 넣는 방식이다. 

너무 번거럽고 귀찮아 잘 사용하지 않는다.  



어떤 방식을 적용해야할까?

그렇다면 어떻게 CSS 적용해야 잘했다고 소문이 날까??


1. 인라인 방식의 경우 사람이 보았을 때는 무척 편리하다.

바로 앞에 속성이 정의가 되어있으니 읽어가면서 바로 확인이 가능하다. 

하지만 크롤링을하는 크롤러의 입장에서 보았을 경우에는 좋지 않다. (ex.글을 가져가야하는데 CSS속성이 끼여있다.)

그리고 한번만(적은 횟수)로 CSS를 사용했을 경우에는 좋지만, 

여러번 사용하게된다면 소스코드가 늘어나고 수정시 번거로운 일이 발생할 수 있다.


그렇다면 2. 내부스타일 시트 방식으로 CSS를 모아서 관리하게 되면 어떤가??

내부스타일 시트의 경우에는 CSS내용이 전부 HTML에 속해있다. 

이것이 중요한 포인트가 되는데..

스마트폰을 사용하면서 인터넷 네트워크를 사용하면 요금이 나간다. (LTE데이터, 3G데이터라고 하는 것들...)

따라서 인터넷 서핑을 하게 될 경우 HTML를 요청하고 응답받으면서 인터넷 네트워크를 사용하므로 데이터 사용이 발생하게 될 것이고, 

HTML안에 많은 내용의 CSS데이터가 포함이 되어있다면, 그많큼 더 많은 데이터를 사용하게 될 것이다. 

이렇게 생각했을 때.. 

CSS의 내용(속성)은 변하지 않는다고 가정하면

우리가 HTML을 받을 때마다 똑같은 CSS를 계속 포함해서 받게되면 우리는 아까운 데이터를 더욱 많이 사용하게 된다는 것이다.


이걸 막기위해 3. 외부스타일 시트 방식으로 CSS를 사용하면 좋은데

HTML문서가아닌 외부문서에 CSS를 관리하기 때문에 내용변화가 없는 CSS는 한번만 받아서 캐시(캐시메모리)로 저장하게 되면 불필요한 데이터 낭비없이 사용자가 사용하기에 더욱 편리한 웹 환경을 만들어 줄 것이다. 



정리:

1.인라인 방식은 가끔사용할때 사용하자.

2.내부스타일 시트방식을 사용할 바에는

3.외부스타일 시트방식을 사용해보자!!!!!


외부스타일 시트방식 짱!!!!


CSS 치트시트 링크 : http://learn.shayhowe.com/advanced-html-css/complex-selectors/


+ Recent posts