쿠키란?

서버가 사용자의 웹브라우저에게 보내는 작은 데이터 조각.

인증, 개인화, 트래킹을 위해 쓰인다. 

 

쿠키의 용도 

세션 관리 : 서버에 저장할 로그인, 게임 스코어 등의 정보 관리 

개인화 : 사용자 선호, 테마 등의 세팅

트래킹 : 사용자 행동 기록 및 분석 

 

 

MDN 에서 http cookie를 찾아본다. 

https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies

 

HTTP 쿠키

HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송합니다. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용합니다. 이를 이용하면 사용자의 로그인 상태를 유지할 수 있습니다. 상태가 없는(stateless) HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문입니다.

developer.mozilla.org

 

 

쿠키 생성

 

쿠키는 서버가 사용자에게 응답할 때 실어보내는 것이므로, response의 헤더쪽 안에 작성한다. 

key-value 형태로 여러 쿠키를 보낼 수 있다.

쿠키의 Name은 yummy_cookie이고 Value는 choco 이다. (크롬 기준, F12를 눌러서 개발자 도구의 Network에서 확인해보자.)

var http = require('http');

http.createServer(function(request, response){
    response.writeHead(200, {
        'Set-Cookie':['yummy_cookie=choco', 'tasty_cookie=strawberry']
    })
    response.end('Cookie!!');
}).listen(3000);

 

 

쿠키 읽기

 

생성한 쿠키를 웹브라우저가 서버쪽으로 쿠키를 다시 요청하는 것을 확인해보자. 

 

쿠키를 다루는 NPM 모듈이 있는지 검색해보자.

npm install cookie --save 로 cookie 모듈을 설치한다. 

 

쿠키는 요청의 헤더 안에 있다. 

아래와 같이 request의 headers에서 cookie를 가져온다. 

cookie의 parse() 함수를 이용하여 데이터를 파싱한다. parse()는 undefined를 처리 못하는 함수이므로 if문 내에서 처리한다. 

response.writeHead() 안에 쿠키 값을 여러개 넣을 수 있다. 

var http = require('http');
var cookie = require('cookie');

http.createServer(function(request, response){
    console.log(request.headers.cookie);

    if(undefined !== request.headers.cookie){
        var cookies = cookie.parse(request.headers.cookie);
    }

    console.log(cookies.yummy_cookie);
   
   response.writeHead(200, {
        // 쿠키를 key-value 형태로 생성한다. 
        'Set-Cookie':['yummy_cookie=choco', 
                    'tasty-cookie=strawberry'
        ]
    })
    response.end('Cookie!!');
    
}).listen(3000);

 

 

[ Session 쿠키와 Permanent 쿠키 ]

 

Session 쿠키 : 웹 브라우저를 종료하는 순간 사라진다.

 

Permanet 쿠키: 쿠키가 살아있는 기간을 정할 수 있어서, 웹 브라우저 종료에 영향을 받지 않는다.

Expires, Max-Age 와 같은 설정이 필요하다. 둘 중 하나를 쓰면 된다.   

 

Expires : 쿠키 소멸 시점을 명시한다. (예시 : 2020년 4월 20일까지 살아있어라.)

Max-Age : 현재 부터 얼마동안(1시간, 1달..) 살아있을지 '기간'을 명시한다. 

 

var http = require('http');

http.createServer(function(request, response){
    response.writeHead(200, {
        'Set-Cookie':['yummy_cookie=choco', 'tasty_cookie=strawberry']
    })

    console.log(request.headers.cookie);

    if(undefined !== request.headers.cookie){
        var cookies = cookie.parse(request.headers.cookie);
    }

    //console.log(cookies.yummy_cookie);
    response.writeHead(200, {
        // 쿠키를 key-value 형태로 생성한다. 
        'Set-Cookie':['yummy_cookie=choco', 
                    'tasty-cookie=strawberry',
                    `Permanent=cookies; Max-Age=${60*60*24*30}`
        ]
    })
    response.end('Cookie!!');
}).listen(3000);

자바스크립트 변수를 넣기 위해 ( ` ) 그레이브 엑센트를 썼다. 

 

 

[ 쿠키 옵션 ]

1. Secure

웹브라우저가 HTTPS를 사용하는 경우에만 쿠키를 전송한다는 뜻이다. 

'Secure=Secure; Secure'

쿠키의 이름과 값이 둘다 Secure이고, 끝에 붙인 Secure 가 중요한 키워드이다. 

 

2. HttpOnly

웹브라우저와 웹서버가 통신할 때 만 쿠키를 발행하는 것이다. 

자바스크립트를 통해서도 쿠키값을 읽을 수 있다. 이를 방지하기 위해서 Http를 이용하여 통신할 때만 쿠키가 보이도록 한 것이다. 

 

var http = require('http');
var cookie = require('cookie');

http.createServer(function(request, response){
    console.log(request.headers.cookie);

    if(undefined !== request.headers.cookie){
        var cookies = cookie.parse(request.headers.cookie);
    }

    //console.log(cookies.yummy_cookie);
    response.writeHead(200, {
        // 쿠키를 key-value 형태로 생성한다. 
        'Set-Cookie':['yummy_cookie=choco', 
                    'tasty-cookie=strawberry',
                    `Permanent=cookies; Max-Age=${60*60*24*30}`,
                    'Secure=Secure; Secure',
                    'HttpOnly=HttpOnly; HttpOnly'
        ]
    })
    response.end('Cookie!!');
}).listen(3000);

 

[ 쿠키 확인 하기 ] 

Chrome 브라우저를 기준으로 F12 개발자도구를 열고 Console에서 

document.cookie를 입력하면 쿠키 데이터를 확인할 수 있다. 

3. path

특정 디렉토리에서만 쿠키가 활성화되도록 하고싶을 때 사용한다. 

(그 디렉토리 하위에서도 활성화된다. )

 

쿠키에 Path를 추가해본다. 

Path값은 /cookie로 한다.

var http = require('http');
var cookie = require('cookie');

http.createServer(function(request, response){
    console.log(request.headers.cookie);

    if(undefined !== request.headers.cookie){
        var cookies = cookie.parse(request.headers.cookie);
    }

    console.log(cookies.yummy_cookie);
    response.writeHead(200, {
        // 쿠키를 key-value 형태로 생성한다. 
        'Set-Cookie':['yummy_cookie=choco', 
                    'tasty-cookie=strawberry',
                    `Permanent=cookies; Max-Age=${60*60*24*30}`,
                    'Secure=Secure; Secure',
                    'HttpOnly=HttpOnly; HttpOnly',
                    'Path=Path; Path=/cookie'
    ]
    });
    response.end('Cookie!!');
}).listen(3000);

http://localhost:3000/로 접속해보자. (루트 디렉토리로 접속) 

 

Response Cookies 를 보자. (서버의 응답 쿠키들)

아래와 같이 Path라는 이름의 쿠키가 추가되었고, Path값이 /cookie 임을 확인할 수 있다. 

 

'Set-Cookies' 코드 전체를 주석처리 하고 서버를 재시작해보자. 

http://localhost:3000/ 접속해보자.  Path라는 이름의 쿠키가 안보인다. 

 

다시 http://localhost:3000/cookie로 접속해보자. Path라는 쿠키가 보인다. 

 

/cookie/sub 디렉토리에서도 Path라는 쿠키가 보인다. 즉, /cookie의 하위 디렉토리에서도 보인다는 것.

 

 

4. domain 

특정 도메인 에서만 쿠키를 살아남도록 하는 옵션이다. 

 

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

Virtual box에서 우분투 가상머신 만들고 세팅  (0) 2020.04.15
쿠키를 이용한 인증 기능 구현  (0) 2020.04.11
Node.js npm pm2  (0) 2020.04.05
MySQL 명명 규칙  (0) 2020.03.23
MySQL 웹앱 - 글목록  (0) 2020.03.21

Node.js 로 서버 개발을 할 때, 파일 수정 후에 서버를 재시작해야 하는 불편함이 있다. 

pm2는 코드 수정이 감지되면 자동으로 서버를 재시작해주기 때문에 개발할 때 재시작의 불편함을 없애준다.

 

서버 무중단이 가능하다는 것!

 

https://www.npmjs.com/package/pm2

 

pm2

Production process manager for Node.JS applications with a built-in load balancer.

www.npmjs.com

$ npm install pm2 -g 

-g 옵션으로 pm2를 설치한다. 

 

$ pm2 start app.js

pm2로 관리할 서버를 실행한다.

 

$ pm2 monit

지금 pm2로 매니징되는 것을 모니터링 할 수 있다. 

 

$ pm2 start main.js --watch

무중단 서비스 가능.

수정할 때마다 재시작 하는 불편함을 없애줌.

페이지 리로드만 하면 수정한 코드가 반영됨.

 

$pm2 log 

코드 수정시의 로그, 에러 등을 바로 볼 수 있다. 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

쿠키를 이용한 인증 기능 구현  (0) 2020.04.11
HTTP Cookie  (0) 2020.04.11
MySQL 명명 규칙  (0) 2020.03.23
MySQL 웹앱 - 글목록  (0) 2020.03.21
MySQL select insert delete update  (0) 2020.03.21

MySQL DB 설계를 할 때 명명 규칙을 참고할 일이 생겼습니다.
잘 정리된 포스팅을 발견해서 기록합니다.
출처 : https://purumae.tistory.com/200


공통

  1. 소문자를 사용한다.
  2. 단어를 임의로 축약하지 않는다. register_date (O) / reg_date (X)
  3. 가능하면 약어의 사용을 피한다. 약어를 사용해야 하는 경우, 약어 역시 소문자를 사용한다.
  4. 동사는 능동태를 사용한다. register_date (O) / registered_date (X)

TABLE

  1. 단수형을 사용한다.
  2. 이름을 구성하는 각각의 단어를 underscore 로 연결하는 snake case 를 사용한다.
  3. 교차 테이블 (many-to-many) 의 이름에 사용할 수 있는 직관적인 단어가 있다면 해당 단어를 사용한다.
  4. 적절한 단어가 없다면 relationship을 맺고 있는 각 테이블의 이름을 "and" 또는 "has" 로 연결한다.

예시

article, movie : 단수형
VIP_member : 약어는 대문자 & 단어의 연결에 underbar를 사용
article_and_movie : 교차 테이블을 "and" 로 연결

COLUMN

  1. auto increment 속성의 PK를 대리키로 사용하는 경우, "테이블 이름"_id 의 규칙으로 명명한다.
  2. 이름을 구성하는 각각의 단어를 underscore 로 연결하는 snake case 를 사용한다.
  3. foreign key 컬럼은 부모 테이블의 primary key 컬럼 이름을 그대로 사용한다.
  4. self 참조인 경우, primary key 컬럼 이름 앞에 적절한 접두어를 사용한다.
  5. 같은 primary key 컬럼을 자식 테이블에서 2번 이상 참조하는 경우, primary key 컬럼 이름 앞에 적절한 접두어를 사용한다.
  6. boolean 유형의 컬럼이면 "_flag" 접미어를 사용한다.
  7. date, datetime 유형의 컬럼이면 "_date" 접미어를 사용한다.

예시

article_id, movie_id : "테이블 이름" + "_id"
complete_flag : boolean 유형의 컬럼
issue_date : 날짜 유형의 컬럼

 

INDEX

  1. 이름을 구성하는 각각의 단어를 hyphen 으로 연결하는 snake case 를 사용한다.

접두어
unique index : uix
spatial index : six

index : nix

"접두어"-"테이블 이름"-"컬럼 이름"-"컬럼 이름"

예시

uix-account-login_email

FOREIGN KEY

  1. 이름을 구성하는 각각의 단어를 hyphen 으로 연결하는 snake case 를 사용한다.

"fk"-"부모 테이블 이름"-"자식 테이블 이름"

같은 부모-자식 테이블에 2개 이상의 foreign key가 있는 경우, numbering합니다.

예시

fk-movie-article : article 테이블이 movie 테이블을 참조
fk-admin-notice-1 / fk-admin-notice-2 : notice 테이블이 admin 테이블을 2회 이상 참조하여 numbering

 

VIEW

  1. 접두어 "v"를 사용한다.
  2. 기타 규칙은 TABLE과 동일

예시

v_privilege

stored procedure

FUNCTION

  1. 접두어 "usf"를 사용한다.
  2. 이름을 구성하는 각각의 단어를 underscore 로 연결하는 snake case 를 사용한다.

예시

usf_random_key

TRIGGER

  1. 이름을 구성하는 각각의 단어를 underscore 로 연결하는 snake case 를 사용한다.
  2. 접두어
    tra : AFTER 트리거
    trb : BEFORE 트리거

"접두어""테이블 이름""트리거 이벤트"

예시

tga_movie_ins : AFTER INSERT 트리거
tga_movie_upd : AFTER UPDATE 트리거
tgb_movie_del : BEFORE DELETE 트리거


도움이 되셨다면 하트🤍꾸욱 부탁드립니다.

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

HTTP Cookie  (0) 2020.04.11
Node.js npm pm2  (0) 2020.04.05
MySQL 웹앱 - 글목록  (0) 2020.03.21
MySQL select insert delete update  (0) 2020.03.21
MySQL 사용  (0) 2020.03.18

Node.js 를 MySQL과 연동하여 아래와 같은 글목록을 만들어본다.


글 목록 만들기 

 

 

app_mysql.js를 작성하고, DB연결을 한다.

// MySQL로 글목록 만들기.

var express = require('express');
var app = express();
var bodyParser = require('body-parser')
var fs = require('fs')

// POST 방식 처리할 때, body 속성을 가공해준다 
app.use(bodyParser.urlencoded({extended: false}))

// DB 연결 
var mysql      = require('mysql');
var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();

 

템플릿 엔진과 템플릿  파일 디렉토리를 명시해준다.

//템플릿 엔진 (views 들을 위치할 디렉토리 적어준다)
app.set('views', './views_mysql');
//템플릿 엔진 종류 명시 
app.set('view engine', 'jade');

app.locals.pretty = true;

 

라우팅 처리 

 

topic 이나 topic/id 를 통해 접근하면 글 목록이 보인다. 

 

app.get() 함수의 URL 부분을 배열로 만든다. 

그리고 id, title을 가지고 글목록을 만든다. 

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

    var sql = 'SELECT id, title FROM topic';
    conn.query(sql, function(err, topics, fields){
      
    })
})

 

상세보기 내용을 가지고 와서 view 파일에 띄워준다.

res.render() 함수를 사용하여 view 라는 이름의 템플릿을 이용한다. 

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

    var sql = 'SELECT id, title FROM topic';
    conn.query(sql, function(err, topics, fields){
        // 사용자가 id를 URL에 물고들어왔는지. 
        var id = req.params.id;

        if(id){ // 상세 보기 한다 
            var sql = 'SELECT * FROM topic WHERE id=?';
            conn.query(sql, id, function(err, rows, fields){
                if(err){
                    console.log(err);
                    res.status(500).send('Internal Server Error')
                }else{
                    res.render('view', {topics:topics, topic:rows[0]})
                }
            });
        }else{
            res.render('view', {topics:topics});
        }
    })
})

 

view.jade 템플릿 파일 

 

article태그 쪽을 보자. 

topic 이라는 값이 파라미터로 넘어 온다면, topic.title, topic.description, topic.author를 이용하여 상세보기 화면을 보여준다.

그렇지 않고 제목을 클릭 안했다면, Welcome만 띄워준다.     

doctype html
html
    head
        meta(charset='utf-8')
    body
        h1
            a(href='/topic') Server Side JavaScript
        ul  
            each topic in topics
                li
                    a(href='/topic/'+topic.id)=topic.title
        article
            if topic
                h2=topic.title
                =topic.description
                div='by '+topic.author
            else
                h2 Welcome!
                | This is server side javascript tutorial.

        a(href='/topic/add') add

 

 


글 작성 

 

맨 밑에 add 버튼을 누르면 입력폼이 나타나고, 내용이 DB 에 INSERT 되게 하자.

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

새 글을 쓰는 입력 폼과 포스트 처리를 하는 함수가 필요하다. 

 

app.post('/topic/add',function(req, res))

POST 처리는 query() 함수로 DB에 INSERT 해주고, 작성이 완료된 페이지로 리다이렉션을 포함한다.

conn.query() 함수와 res.redirect() 함수.

// 새 글 쓰기 
app.get('/topic/add', function(req, res){
    var sql = 'SELECT id, title FROM topic';
    conn.query(sql, function(err, topics, fields){
        if(err){
            console.log(err);
            res.status(500).send('Internal Server Error')
        }
        res.render('add', {topics:topics})
    })  

})

// POST 처리
app.post('/topic/add',function(req, res){
    var title = req.body.title
    var description = req.body.description
    var author = req.body.author

    var sql = 'INSERT INTO topic (title, description, author) VALUES(?, ?, ?)'

    conn.query(sql, [title, description, author], function(err, result, fields){
        if(err){
            console.log(err);
            res.status(500).send('Internal Server Error')
        }else{
        // 작성 완료된 페이지로 리다이렉션 
        res.redirect('/topic/'+result.insertId)
        }
    })
 
})

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

    var sql = 'SELECT id, title FROM topic';
    conn.query(sql, function(err, topics, fields){
        // 사용자가 id를 URL에 물고들어왔는지. 
        var id = req.params.id;

        if(id){ // 상세 보기 한다 
            var sql = 'SELECT * FROM topic WHERE id=?';
            conn.query(sql, id, function(err, rows, fields){
                if(err){
                    console.log(err);
                    res.status(500).send('Internal Server Error')
                }else{
                    res.render('view', {topics:topics, topic:rows[0]})
                }
            });
        }else{
            res.render('view', {topics:topics});
        }
    })
})

 

입력 폼 템플릿 add.jade 

doctype html
html
    head
        meta(charset='utf-8')
    body
        h1
            a(href='/topic') Server Side JavaScript
        ul  
            each topic in topics
                li
                    a(href='/topic/'+topic.id)=topic.title

        article
            form(action='/topic/add', method='post')
                p
                    input(type='text' name='title' placeholder='title')
                p
                    textarea(name='description' placeholder='description')
                p
                    input(type='text' name='author' placeholder='author')
                p
                    input(type='submit')

                


 

글 편집 

 

글 제목을 클릭하면 상세 화면이 나온다. 

이 때, edit 버튼을 클릭하면 글을 편집할 수 있게 코드를 추가해보자. 

글을 읽어와서 입력 폼에 뿌려놔줘야 편집이 가능하다. 

그래서 글 작성과 글 읽기 기능을 이해하고 있어야 편집 기능 만들기가 가능하다.

 

 

view.jade 템플릿 

 

view.jade를 열어서 edit 버튼을 추가한다. 

맨 아래쪽에, topic 값이 있으면, edit 버튼이 보이도록 한다. 

왜냐하면 글 제목을 클릭 했을 때만 edit 버튼이 보이도록 하고 싶기 때문이다.

(예를 들어, /topic 에서는 안보이고, /topic/5 에서는 보인다.)

doctype html
html
    head
        meta(charset='utf-8')
    body
        h1
            a(href='/topic') Server Side JavaScript
        ul  
            each topic in topics
                li
                    a(href='/topic/'+topic.id)=topic.title
        article
            if topic
                h2=topic.title
                =topic.description
                div='by '+topic.author
            else
                h2 Welcome!
                | This is server side javascript tutorial.

        ul
            li
                a(href='/topic/add') add
            if topic
                li
                    a(href='/topic/'+topic.id+'/edit') edit

 

 

edit.jade 템플릿 

 

편집을 위한 입력폼을 보여주는 템플릿이다. 

view.jade 에서 article 부분 내부를 지우고, 그 안에 add.jade 템플릿에서 썼던 form을 가져와 붙여넣는다. 

 

글 목록 화면에서 edit 버튼을 누르면 편집 폼으로 이동한다
편집 폼에는 내용이 이미 쓰여 있고, edit 버튼은 없앤다.

 

기존의 컨텐츠를 입력폼에 넣어서 보여줘야 하기 때문에, input 태그 내부에 value 속성을 넣어준다.

textarea는 형식이 조금다르다. 괄호 안에 속성 써주는게 아니라, 괄호 옆에 이퀄 (=)을 써준다.  

form 의 action 태그는 topic.id 를 넣는다. 

폼의 내용들을 DB에 저장하기 위해 /edit URL을 명시해준다. 

doctype html
html
    head
        meta(charset='utf-8')
    body
        h1
            a(href='/topic') Server Side JavaScript
        ul  
            each topic in topics
                li
                    a(href='/topic/'+topic.id)=topic.title
        article
            form(action='/topic/'+topic.id+'/edit', method='post')
                p
                    input(type='text' name='title' placeholder='title'
                    value=topic.title)
                p
                    textarea(name='description' placeholder='description')
                        =topic.description
                p
                    input(type='text' name='author' placeholder='author'
                    value=topic.author)
                p
                    input(type='submit')
        ul
            li
                a(href='/topic/add') add

 

POST 처리는 id 에 따라 DB에 update 할 함수를 만들고 라우팅을 해준다. 

 

// 편집 내용 POST를 query() 함수로 DB UPDATE. 그리고 리다이렉션 

app.post(['/topic/:id/edit'], function(req,res){
    var title = req.body.title;
    var description = req.body.description;
    var author = req.body.author;
    var id = req.params.id;
    var sql = 'UPDATE topic SET title=?, description=?, author=? WHERE id=?';

    conn.query(sql, [title, description, author, id], function(err, result, fields){
        if(err){
            console.log(err);
            res.status(500).send('Internal Server Error')
        }else{
            // 에러 없으면 리다이렉션 
            res.redirect('/topic/'+id);
        }
    })
})

 


글 삭제

 

글을 클릭했을 때 편집 기능이 보이는 것 처럼, 글 삭제도 글을 클릭했을 때만  보이도록 한다. 

veiw.jade 템플릿 맨 아래에 버튼하나 추가한다. 

 

view.jade 템플릿

doctype html
html
    head
        meta(charset='utf-8')
    body
        h1
            a(href='/topic') Server Side JavaScript
        ul  
            each topic in topics
                li
                    a(href='/topic/'+topic.id)=topic.title
        article
            if topic
                h2=topic.title
                =topic.description
                div='by '+topic.author
            else
                h2 Welcome!
                | This is server side javascript tutorial.

        ul
            li
                a(href='/topic/add') add
            if topic
                li
                    a(href='/topic/'+topic.id+'/edit') edit
                li
                    a(href='/topic/'+topic.id+'/delete') delete

 

app_mysql.js에 /delete 를 처리할 라우팅 함수를 하나 만든다. 

 

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

Node.js npm pm2  (0) 2020.04.05
MySQL 명명 규칙  (0) 2020.03.23
MySQL select insert delete update  (0) 2020.03.21
MySQL 사용  (0) 2020.03.18
MySQL 설치  (0) 2020.03.16

node.js 에서 MySQL을 연결하여 DML을 실행해보자. 

 

SELECT 컬럼명 FROM 테이블명 

INSERT INTO 테이블명 (컬럼명) VALUES(값)

DELETE FROM 테이블명 WHERE문

UPDATE 테이블명 SET 컬럼명=값, 컬럼명=값, ... WHERE문

참고) INSERT INTO 할 때, 컬럼명을 생략할 수 있긴 하다.

하지만, 테이블 구조가 변경되었을 경우를 대비하여 컬럼명을 생략하지 말고 명시를 꼭 하는게 좋다. 

 

DELETE와 UPDATE 할 때는 반드시 WHERE 조건문을 써야 함을 기억하자!


SELECT 

 

쿼리는 select*  from topic 이지만, 두개의 컬럼만 출력한다. 

 

var mysql      = require('mysql');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();

var sql = 'select * from topic';

conn.query(sql, function(err, rows, fields){
  if(err){
    console.log(err);
  }else{
    for(var i=0; i<rows.length; i++){
      console.log(rows[i].author +": "+ rows[i].title)
    }

  }
});

conn.end();

for문을 이용하여 출력한다. 

 

 

 

INSERT 

 

행 하나를 추가해보자. 

쿼리에서 개행할 때는 \ (역슬래시) 해주면 에러가 안난다. 

var mysql      = require('mysql');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();

var sql = 'INSERT INTO topic (title, description, author) \
VALUES("Node.js_02", "Server Side javascript", "coco")';

conn.query(sql, function(err, rows, fields){
  if(err){
    console.log(err);
  }else{
    console.log(rows);
  }
})

conn.end();

 

id와 title 만 조회하여 방금 INSERT 한 결과를 확인한다. 

 

console.log() 에 rows.insertId 를 출력해보자. 

 

var mysql      = require('mysql');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();

var sql = 'INSERT INTO topic (title, description, author) \
VALUES("Node.js_03", "Server Side js", "lululala")';

conn.query(sql, function(err, rows, fields){
  if(err){
    console.log(err);
  }else{
    console.log(rows.insertId);
  }
})

conn.end();

 node database.js 명령으로 실행 하면,

삽입한 행의 id가 출력된다. (insertId : 추가한 데이터의 고유한 식별자를 알아낸다.)

 

데이터베이스 select 해보면, id 값이 확인된다. 

  

 


사용자가 입력한 파라미터로 쿼리를 만들자. 

 

쿼리에 넣을 값을 ? 퀘스쳔 마크로 변경한다. 

params 라는 배열에 실제 값들을 넣는다. 

conn.query()함수의 두 번째 인자값으로 준다. 

node.js가 params를 sql에 주입해준다. (-> SQL injection 을 방지하는 효과가 있다.)

var mysql      = require('mysql');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();

var sql = 'INSERT INTO topic (title, description, author) \
VALUES(?, ?, ?)';

var params = ['Supervisor', 'watcher', 'graphittie'];

conn.query(sql, params, function(err, rows, fields){
  if(err){
    console.log(err);
  }else{
    console.log(rows.insertId);
  }
})

conn.end();

node database.js 실행하면  insertId가 출력되고, 

select 해보면 정상적으로 insert  된 결과를 확인할 수 있다. 


UPDATE

 

3이라는 id의 행을 대상으로, 타이틀과 저자를 수정한다. 

sql과 params를 변경한다.

var mysql      = require('mysql');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();


var sql = 'UPDATE topic SET title=?, author=? WHERE id=?';

var params = ['npm', 'itzy', 3];

conn.query(sql, params, function(err, rows, fields){
  if(err){
    console.log(err);
  }else{
    console.log(rows.insertId);
  }
})

conn.end();

3번 id 의 행이 변경된 것을 확인할 수  있다. 

 

 

delete 

 

3번 행을 지워본다. 

var mysql      = require('mysql');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();


var sql = 'DELETE FROM topic WHERE id=?';

var params = [3];

conn.query(sql, params, function(err, rows, fields){
  if(err){
    console.log(err);
  }else{
    console.log(rows);
  }
})

conn.end();

 

정상 처리가 되면 console.log(rows)에 OkPacket이 온다. 

SELECT 해보면 정상적으로 삭제된 것을 확인할 수 있다. 

 


SQL에 대한 내용이 더 필요하다면 w3school 에서 참고하자. 

https://www.w3schools.com/sql/sql_select.asp

 

SQL SELECT Statement

SQL SELECT Statement The SQL SELECT Statement The SELECT statement is used to select data from a database. The data returned is stored in a result table, called the result-set. SELECT Syntax SELECT column1, column2, ... FROM table_name; Here, column1, colu

www.w3schools.com

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

MySQL 명명 규칙  (0) 2020.03.23
MySQL 웹앱 - 글목록  (0) 2020.03.21
MySQL 사용  (0) 2020.03.18
MySQL 설치  (0) 2020.03.16
코드 개선  (0) 2020.03.16

실행 환경 

Ubuntu 16.04 LTS 

 


접속 방법

 

로컬 컴퓨터의 mysql 에 접속 

mysql -uroot -p 

치고 password 입력하면 접속된다. 

 

로컬이 아니라 다른 컴퓨터로 접속하고 싶다면, 

mysql -brocolia -P3306 -uroot -p

 

컴퓨터 이름과 포트를 지정할 수 있다.

(mysql 은 기본포트로 3306을  쓴다)

 

 

Database 만들기 


CREATE DATABASE o2 CHARACTER SET utf8 COLLATE utf8_general_ci;

o2 라는 이름으로 데이터베이스를 만든다.

인코딩 정보를 함께 입력한다.

 

 

show database;

명령으로 데이터베이스가 정상 생성되었는지 확인한다.  

 

데이터베이스를 사용하겠다고 명령한다. 

USE o2; 

 

데이터베이스를 사용하겠다고 해야 테이블을 만들고 지우고 등의 조작이 가능하다.

접속과 비슷하게 이해하면 된다. 

 

들어가서 테이블을 조회해보면 아무것도 없다.

show tables;

 

 

 

topic  테이블을 만들어보자. 

CREATE TABLE `topic` 
( `id` int(11) NOT NULL AUTO_INCREMENT, 
`title` varchar(100) NOT NULL, 
`description` text NOT NULL, 
`author` varchar(30) NOT NULL, PRIMARY KEY (id)) 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

쿼리를 칠 때, 작은 따옴표가 아니라, 그레이브 엑센트 ( ` )를 써야하는 것이 유의점이다! 

CREATE 명령 뒤에 붙는 ENGINE 과 CHARSET은 데이터 엔진명과 문자셋 인코딩이다. 

 

show tables 명령으로 정상적으로 생성됬음을 확인한다. 

 

데이터를 삽입하고 조회해보자. (INSERT와 SELECT)

INSERT INTO topic (title, description, author) VALUES('JavaScript', 'Computer Language for Web', 'brocolia');

 

더 삽입 해보자. 

 

 


node.js로 mysql 조작하기 

 

프로젝트 디렉토리에서 npm install 로 node-mysql 모듈을 설치한다.

 

npm install --save node-mysql 

npm 홈에서 node mysql 을 검색한다. github도 있다. 스크롤 내려서 mysql을 연동하는 샘플코드를 보고 따라한다. 

 

 

database.js 를 만든다. 

 

require()로 객체를 생성한다. 

DB연결 정보를 이력하여 createConnection()로 연결 객체를 만든다. 

connect() 함수로  연결한다. 

sql 문자열을 따로 만든 후에, 쿼리를 실행하는 query()로 쿼리를 실행한다. 

콜백함수가 에러 여부, 행, 열 정보를 리턴해준다. 

var mysql      = require('mysql');

var conn = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '111111',
  database : 'o2'
});

conn.connect();

var sql = 'select * from topic';

conn.query(sql, function(err, rows, fields){
  if(err){
    console.log(err);
  }else{
    console.log('rows', rows);
    console.log('fields', fields)
  }
});

conn.end();

 

 

프로젝트 디렉토리에서 node database.js 로 실행하면, 

다음과같은  출력 결과가 나온다. 

 

 

다음 포스팅에서 select, insert, delete, update를 다뤄본다. 

 

 

참고 포스팅 

https://m.blog.naver.com/PostView.nhn?blogId=imf4&logNo=220760337928&proxyReferer=https:%2F%2Fwww.google.com%2F

 

MySQL : 테이블 만들기 (데이터타입, 데이터엔진, 문자셋 지정)

MySQL : 테이블 만들기 (데이터타입, 데이터엔진, 문자셋 지정) 참고링크데이터 타입 : http://ra2ksta...

blog.naver.com

 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

MySQL 웹앱 - 글목록  (0) 2020.03.21
MySQL select insert delete update  (0) 2020.03.21
MySQL 설치  (0) 2020.03.16
코드 개선  (0) 2020.03.16
본문 읽기 - 전체 코드 포함  (0) 2020.03.16

MySQL

가장 대중적인 오픈소스 DB

MySQL은 SUN에 인수되었는데, SUN이 오라클에게 인수되면서 같이 넘어갔다.  

MySQL이 만든 분이 오라클의 정책에 반발하면서 MySQL과 완전히 호환되는 MariaDB를 만들게 된다.

 

MariaDB

MySQL의 지지부진한(?)개발을 개선하였고, 진보적으로 발전해온 오픈소스 DB

 

DB만 바꾸면, MySQL이 갖고 있었던 단점을 버리고 MariaDB의 장점을 취할 수 있다. 

 

아마존에서 만든 DB 오로라(Aurora) 도 MariaDB와 호환된다. 


Ubuntu 에서 MySQL 설치 

 

터미널에서 sudo apt-get install mysql  엔터치지 말고 tab을 두번 친다. 

현재 설치할 수 있는 server, client, workbench 등이 나온다. 

 

 

그 중에 최신 버전 server와 cilent 버전을 치고 설치한다.

sudo apt-get install mysql-server-5.7 mysql-client-5.7 

패스워드는 제일 쉽게 1을 6개 친다. (혼자쓰는 것이니까)

 

설치가 끝났으면 제대로 설치되었는지 확인하기 위해 로그인 해본다. 

 

패스워드를 치고 아래와 같이 welcome 이 뜨면 제대로 된 것이다. 

728x90

'프로그래밍 > Node.js' 카테고리의 다른 글

MySQL select insert delete update  (0) 2020.03.21
MySQL 사용  (0) 2020.03.18
코드 개선  (0) 2020.03.16
본문 읽기 - 전체 코드 포함  (0) 2020.03.16
글 목록 만들기  (0) 2020.03.16

+ Recent posts