728x90

 

nodejs에서 필자가 테스트 프로젝트를 만드는데 보통은 mariadb나 mysql로 많이 했다.

그런데 토이프로젝트에서 필자가 쓰는 DB를 공용으로 쓰는건 좀 문제가 있는것 같다.

그렇다고 docker를 계속 쓰는것도 이유는 모르겠느데 계속 문제가 좀 일어나더라.

그래서 어플리케이션에서 삽입할 수 있는 sqlite를 사용하기로 하였다.

 

https://github.com/justkukaro/nodejs-test-example/tree/master/sqlite-nodejs-express

해당 예제는 위 프로젝트로 진행한다.

예제를 자세히 보고싶으면 해당 프로젝트를 받아서 npm install 후 npm run start를 실행하라.

 

express <프로젝트 이름> --view=<뷰 엔진 이름>

일단 express 프로젝트를 만들어준다. 물론 여러분이 다른걸 쓴다면 다른걸 써도 된다.

 

npm install --save sqlite3

그리고 sqlite3플러그인을 설치한다.

sqlite cli를 반드시 설치할 필요는 없다.

 

프로젝트는 구조는 위와같다.

만약 여러분이 jade가 아닌 ejs를 사용한다면 그래도 좋다.

 

단 중요한건 sqlite는 select나 err루틴을 제외하고는 비동기가 아니라는 것이다.

필자가 이거 몰라서 엄청 삽질을 했다.

 

먼저 db를 초기화 해보자
let db = new sqlite3.Database('./db/my.db', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.error(err.message);
    } else {
        console.log('Connected to the mydb database.');
    }
});

 

일단 db를 연결하는 코드는 위와 같다. 여기서 첫번째 인자인 './db/my.db'가 존재해야한다.

그리고 여기서 의미하는 현재디렉터리는 프로젝트 app.js를 위치로 계산해야한다.

어쨋든 이렇게 해서 연결해준다.

 

const dropQuery = `
    DROP TABLE IF EXISTS person
`;

const insertQuery = `
  CREATE TABLE IF NOT EXISTS person(
    user_id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_name VARCHAR(20),
    user_password VARCHAR(20)
  )
`;

const dummyDataQuery = `
  insert into person(user_name, user_password) values ('doraemong', 'daenamuhelicopter'),
    ('kukaro', 'wordpass'),
    ('jiharu', 'password')
`;

 

초기화 해줄 값을 query로 정의를 해주자.

필자가 해봤는데 연결되 있으면 안되고 한개의 질의로만 해야한다.

 

db.serialize(() => {
    db.each(dropQuery);
    db.each(insertQuery);
    db.each(dummyDataQuery);
});

 

그리고 each로 실행을 해준다.

사실 저거 내부로 안하고 serial라이즈하게 해도 된다.

왜냐하면 어짜피 동기로 움직이기 때문이다.

여기서 db.each는 해당 쿼리를 실행한다.

여기서 나중에 보면 db.all도 존재하는데 이게 뭘 의미하냐면 결과가 배열로 넘어오는데

each는 각각의 결과를 핸들링 하는 것이고 all은 한번에 핸들링 하는 것이다.

무슨말인지 모르겠으면 나중에 예제를 보도록 하자.

 

db.close((err) => {
    if (err) {
        console.error(err.message);
    } else {
        console.log('Close the database connection.');
    }
});

 

그리고 마지막에 close로 닫아주면된다.

위의 예제는 db가 없으면 생성, 있으면 drop하고 생성한다.

이것만 봐도 여러분은 대충 알겠지만 그래도 전반적으로 어떻게 사용하는지 보도록 하자.

 

일단 추가부터 해볼까?(INSERT)
const db = new sqlite3.Database('./db/my.db', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.log(err);
    } else {
        console.log('success');
    }
});

/* GET users listing. */
router.get('/', function (req, res, next) {
    res.render('insert');
});

router.post('/', function (req, res, next) {
    const {user_name, user_password} = req.body;
    const query = `insert into person(user_name, user_password) values ('${user_name}', '${user_password}')`;
    db.serialize();
    db.each(query);
    res.send({user_name, user_password});
});

form에서 받아와서 db에 집어넣는 작업이다.

 

위 페이지에서 테스트를 해볼 수 있다.

 

그럼 이제 목록을 보자(SELECT)
const db = new sqlite3.Database('./db/my.db', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.log(err);
    } else {
        console.log('success');
    }
});

router.get('/', function (req, res, next) {
    const query = `SELECT * FROM person`;
    db.serialize();
    db.all(query, (err, row) => {
        res.render('show', {data : row});
    });
});

 

select를 사용해서 목록을 볼 수 있다.

이 때까지 코드와는 살짝 다른데 여기서는 each가 아니라 all을 써줘야한다.

그 이유는 render는 딱 한번호출되야하는데 each를 쓰면 여러번 호출되기 때문이다.

물론... 막을 수 있는 방법이야 있지만 굳이 그렇게 할필요가있을까 싶다.

 

 

이렇게 DB에서 가져와서 목록을 보여준다.

 

비밀번호 바꿔보자(UPDATE)
const db = new sqlite3.Database('./db/my.db', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.log(err);
    } else {
        console.log('success');
    }
});

/* GET users listing. */
router.get('/', function (req, res, next) {
    res.render('pwd');
});

router.post('/', function (req, res, next) {
    const {user_name, user_password} = req.body;
    const query = `UPDATE person SET user_password='${user_password}' WHERE user_name='${user_name}'`;
    db.serialize();
    db.each(query);
    res.send({user_name, user_password});
});

위의 코드로 비밀번호를 바꿀 수 있다.

 

위의 예제로 테스트 해서 show로 확인해보자.

 

유저를 삭제해보자.
const db = new sqlite3.Database('./db/my.db', sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
        console.log(err);
    } else {
        console.log('success');
    }
});

/* GET users listing. */
router.get('/', function (req, res, next) {
    res.render('delete');
});

router.post('/', function (req, res, next) {
    const {user_name} = req.body;
    const query = `DELETE FROM person WHERE user_name='${user_name}'`;
    db.serialize();
    db.each(query);
    res.send({user_name});
});

 

삭제역시 간단하다.

 

해당 예제로 삭제한후 확인하도록 해보자.

+ Recent posts