• nodejs를 이용해 데이터베이스에 삽입하기(객체배열)
    Nodejs 2016. 6. 12. 17:20
    반응형

    이번 글은 ajax를 활용해 DB에 삽입하는 과정을 살펴보겠다.

    역시나 javascript, nodejs를 사용한다.


    예시의 흐름은 이렇다.

    클라이언트 쪽에서 객체배열을 ajax를 post 형식으로 서버로 전달하여 db에 삽입할 것이다.

    객체배열은 이러한 형태이다. 

    [
    { a : 'a1', b : 'b1' },
    { a : 'a2', b : 'b2' },
    {......}
    ]


    시작해보자.

    간단히 ajax를 이용할 함수를 만들겠다.

    function send_nodeDB(){
    var data = [{},{}....]; //ArrayObject

    $.ajax({
    type:"POST",
    url:'http://182.161.117.18:8888/db',
    data: JSON.stringify(data),
    contentType: 'application/json',
    success:function(args){
    console.log("success")
    },
    error:function(e){
    console.log(e.responseText);
    }
    });
    }

    위 소스에 대해 다른 설명은 필요 없을거다.

    이제 서버 쪽을 보자.

    exports.dbConnection = function(req,res) {
    var jsonObj = req.body,
    uid = req.query.uid;

    var post = Object.keys(jsonObj).map(function (key) {
    var obj = jsonObj[key]
    return Object.keys(obj).map(function (val) {
    return obj[val]
    })
    });
    //.................
    }

    변수 jsonObj에는 클라이언트 쪽에서 보낸 data가 들어있다.

    이 녀석을 DB 삽입을 위해 쪼까 다듬어보겠다.

    위의 보면 알겠지만 자바스크립트의 네이티브 메소드들을 이용할 것이다.


    살짝 설명을 하겠다.

    Object.keys는 보시다시피 Object의 네이티브 메소드이다.

    객체의 속성과 메소드들을 배열형태로 반환해준다.

    var obj = {
    a : '123',
    b : '456',
    toString : function(){
    //.....
    }
    }

    Object.keys(obj) // ["a", "b", "toString"]

    이번엔 map이다.

    map은 Array의 네이티브 메소드이다.

    for문과 비슷하다. 차이점은 this를 설정할 수 있고, return으로 반환할 수 있다.

    var numbers = [6, 12, 25, 30];

    var result = numbers.map(function(num){
    return num * 2
    });

    console.log(result) //[12, 24, 50, 60]

    여기선 간단히 맛보기로 적어보았다.

    네이티브 메소드들은 '함수형 자바스크립트 문제 풀기'를 시작으로 계속해서 글을 작성할 것이다.


    자 그럼 본론으로 다시 돌아가보자.
    결론은 난 객체배열을 2차원 배열 형태로 다듬을 것이다.

    [
    [
    'a1',
    'b1'
    ],

    [
    'a2',
    'b2'
    ],

    [
    ......
    ]
    ]

    위와 같은 형태로 다듬을 것이다.

    이유는 좀 더 삽입하기 위해서......... 일단 지켜보길.....

    var post = Object.keys(jsonObj).map(function (index) {
    var obj = jsonObj[index]
    return Object.keys(obj).map(function (val) {
    return obj[val]
    })
    });

    이 부분이 다듬는 과정이다.

    keys와 map만 숙지하고 있다면 어려울 건 없다.

    console.log()를 찍어가며 본인이 해보는 것이 가장 좋은 방법이다.

    간단히 살펴보겠다.

    처음 Object.keys(jsonObj) 결과는 인덱스가 나올 것이다. // ["0","1","2"....]

    인덱스를 이용해 내부에 있는 객체를 가져온다.

    여기까지가 첫번째 keys()와 map()을 사용한 과정이다.

    그리고 얻어낸 객체를 통해 다시 한번 keys()를 활용해 객체 안의 속성들을 가져와 map()을 통해

    값들을 가져와 return을 통해 post 변수에 반환하였다.

    이 결과 객체배열이 2차원 배열 형태로 다듬어지게되었다.

    다듬는 방법은 다른 방법도 많을거다.... 추천해주길 바란다..

    이제 다듬은 데이터를 DB에 삽입해보자.


    일단 DB 연결을 해보자.

    var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '패스워드',
    database:'사용할 데이터베이스 이름'
    });

    connection.connect(function (err) {
    if (err) {
    console.error('error connecting: ' + err.stack);
    return;
    }

    console.log('connected as id ' + connection.threadId);
    });

    console.log를 통해 'connection.threadId' 값이 나온다면 연결이 된 것이다.

    연결이 됬다면 이제 삽입을 해보자.

    connection.query('INSERT INTO table (test1,test2) VALUES ?', [post],
    function(err,result){
    console.log("result" + result)
    }
    );

    query('쿼리', '데이터', 'callback')의 형태라고 생각하면 된다.

    'INSERT INTO table (test1,test2) VALUES ?'

    test1,test2 는 DB의 속성 값이다. 

    VALUES 뒤 ?는 두번째 인자 [post]가 들어가게된다.

    저런 식으로 사용하게 된다면 post에 있는 모든 데이터가 알아서 튜플을 생성하게 된다.

    많은 데이터를 넣고 싶을 경우 이런 식으로 활용하면 쉽게 해결할 수 있다.


    질문도 환영이고 피드백도 환영이다.

    이만 안녕.

    반응형

    댓글

Designed by Tistory.