데이터 베이스 보기 

SHOW DATABASES;


데이터베이스에서 내가 작업할 것 선택하기 

USE (데이터베이스);


데이터베이스에서 테이블 보기

SHOW TABLES;


데이터베이스 지우기 

DROP DATABASES (데이터베이스);


테이블 안에 내용 보기

desc (테이블);


테이블 생성 

CREATE TABLE (테이블명) (

ex) > name varchar(20) not null,

ex) > phone varchar(20) not null);


테이블 안에 값 확인해보기 

select *from (테이블명);


테이블 값 집어 넣기

insert into (테이블명) (칼럼1,칼럼2) values (칼럼1값, 칼럼2값);

 



Node.js서버에서 express를 사용해서 route해보기


우선 npm install express --save 을 해서 express모듈을 사용 할 수 있도록 만들어준다음에 

서버로 들어가는 app.js 파일에 아래 코드 추가


const express = require('express');

// express의 라우터를 사용하기 위해서 정의

const router = express.Router();


... 이후에


//로그인창 라우팅 명시 < url의 루트(/)이고 라우팅 위치는 현재디렉토리의 routers/login >

app.use('/',require('./routes/login').router);

//회원가입창 라우팅 명시 < url의 /signin이고 라우팅 위치는 현재디렉토리의 routers/singin >

app.use('/singin',require('./routes/signin').router);




각 js로 이동해서 살펴보면


위와 같은 express사용위한 코드를 작성하고


//라우팅 하여서 html파일의 위치를 명시해주면된다.

// root에 있다는 것을 표현

router.get('/', function(req, res) { fs.readFile('login.html',(err,data)=>{ if(err){ console.log(err); }else{ res.writeHead(200,{ 'Content-Type':'text/html' }); res.end(data); } }); });


마지막에 라우터를 빠져나가는 코드 추가한다.


exports.router = router;


1. HTML 5 버전에서  선언문으로는

<!DOCTYPE html>

을 사용한다.


2. 문서 호환성 선언

<meta http-equiv="X-UA-Compatible" content="IE=edge">

문서 호환성 개념인 document compatiblilty 개념을 도입해 IE버전을 지정하도록 했다.

예를 들어 이렇게 사용할 수 있다.

InternetExplorer 9 표준버전 : <meta http-equiv="X-UA-Compatible" content="IE=9">

InternetExplorer 8 표준버전 : <meta http-equiv="X-UA-Compatible" content="IE=8">


3. 모바일로 최적화된 사이트를 만들기위해 뷰포트 설정해준다.

<meta name="viewport" content="width=device-width, initial-scale=1">

content의 width는 크기를 조정하는데 width=600 이런식으로 특정하게 조정할 수도 있고, 

device-width처럼 특정한 값을 사용할 수도 있다. (device-width는 100%스케일에서 CSS 픽셀들로 계산된 화면의 폭을 의미한다.

(뷰포트의 높이에 따라 크기와 위치가 변하는 요소들로 이루어진 페이지의 경우 상응하는 height와 device-height값들이 유용하게 사용될 수 있다.)

intial-scale을 통해 초기 확대값을 나타낼 수 있다.




Node.js. Express-POST방식을 통한 정보 전달


get방식을 통해서 정보를 가져왔다. 

요청을 하고 get방식을 통해 가져온다는 것


post : 사용자의 정보를 서버로 전송할때는 post를 사용해서 처리한다.



GET vs POST


GET방식 으로 사용해 보자. 

GET으로 보내면 URL에 쿼리스트링 방식으로 전달한다.

doctype html
html
  head
    meta(charset='utf-8')
  body
    form(action='/form_receiver' // method='get')
      p
        input(type='text' name='title')
      p
        textarea(name='description')
      p
        input(type='submit')

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

var title = req.query.title;

var descrpition = req.query.description;

res.send(title+','+description);

});



POST방식 으로 사용해 보자.

doctype html html head meta(charset='utf-8') body form(action='/form_receiver' method='post') p input(type='text' name='title') p textarea(name='description') p input(type='submit')

app.post('/form_receiver', function(req,res){

var title = req.body.title;                // 문제발생을 해결하기 위해 body-parser설치 필요

var descrpition = req.body.description;

res.send(title+','+description);

});


body-parser 를 사용해야한다. <설치>

npm install body-parser --save


// var bodyParser = require('body-parser')

// qpp.use(bodyParser.urlencoded({extended: false}))

미들웨어 를 통해서 body-paser가 post를 통해 전달된 내용을 사용할 수 있게 해준다.

req.body.title. body를 사용할 수 있게 되었다.




언제 GET방식을 쓰고 언제 POST방식을 사용해아 하는 것일까?


사용자 정보를 GET방식으로 보내면 POST방식을 사용해서 보내야 

URL상에 사용자 정보가 입력되어 나타나지 않게 된다. POST지향


URL에 쿼리스트링을 사용하는데 데이터 길이가 너무 길면 GET방식을 사용하는데에 제약이 될 수 있다.

많은 데이터 전송시 POST지향


링크를 걸어서 이동하는 경우(게시판) 같은 경우에는 GET방식 사용도 괜찮다.



Node.js Express-URL을 통한 정보 전달


쿼리스트링이란?

URL PATH뒤에 ?하면서 붙는 것이 PATH를 통해서 보여주는 정보를 다르게 보여 줄 수있다.


ex) http://hpitos.tistory.com/10?id=1 처럼 ? 뒤에 붙는 것을 query string이라고 할 수 있다.



쿼리스트링 적용해보기 및 query 객체를 사용해보기

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

res.send(req.query.id);

})

Express reference에서 properties에서 변수의 값으로 어떤것이 들어오는 지 알아야한다. 


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

res.send(req.query.id+','+req.query.name);

})



query 객체의 활용하기

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

var topics = [

'JavaScript is...',

'Node.js is ...',

'Express is ...'

];

var output = `

<a href="/topic?id=0">JavaScrpit</a><br>

<a href="/topic?id=1">Node.js</a><br>

<a href="/topic?id=2">Express</a><br><br>

${topics[req.query.id]}

`

res.send(output);

})



쿼리스트링없이 깔끔하게 결과 전달해보기


시멘틱URL사용하기 (query가 아닌 params 사용한다.)

app.get('/topic/:id',function(req,res){ // 토픽다음 :id를 사용해서 적용가능하다.

var topics = [

'JavaScript is...',

'Node.js is ...',

'Express is ...'

];

var output = `

<a href="/topic?id=0">JavaScrpit</a><br>

<a href="/topic?id=1">Node.js</a><br>

<a href="/topic?id=2">Express</a><br><br>

${topics[req.params.id]}        // 시멘틱은 Params를 통해 나태낼수있다.

`

res.send(output);

})


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

// 하나더 추가해서 사용도 가능하다.

app.get('/topic/:id/:mode', function(req,res){

res.send(req.params.id+','+req.params.mode)

})






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()(콜백함수)를 호출해 실행시킨다.

+ Recent posts