ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 110일차] 나만의 무기 18일차 (Pooling connection)
    기타/SW 사관학교 정글 2021. 11. 21. 03:16

    오늘은 오랜만에 잠을 적게 잤다.

    나만의 무기를 시작하면서 새벽 늦게까지 공부, 코딩을 하고 기숙사에 가서 잠을 자니 일찍 일어나기 힘들었다.

    그래서 항상 마음 속으로는 '5시만 자는 것을 목표로 하자'라고 했지만 몇 일은 지켰지만 거의 지키지 못했다.

    하지만 오늘은 새벽 5시 정도에 잠에 들었는데 10시에 코딩테스트가 있어서 잠을 적게 자고 일찍 일어날 강제적인 계기가 있었다.

    피곤한 몸을 일으켜 세워 씻고 강의실에 나와서 코딩테스트에 응시했는데 너무 어려웠다....

    문제는 이해하는데 어떻게 풀지 모르겠어서 1시간 넘게 한 문제만이라도 풀자라는 마음으로 계속 풀 수 있는 문제를 찾았다.

    결국에는 한 문제는 풀었지만 아직도 실력이 늘지 않은 것에 답답하다...

    남은 기간동안 꾸준히 한 문제씩이라도 풀어야겠다.

    오후 2시에도 코딩테스트가 있었지만 문제만 보고 테스트를 종료했다.

    오전 10시에 응시한 코딩테스트때문인지 답답하고 내 자신에게 화가 나서 집중을 잘 하지 못했다.

     

    잠깐 쉰 후에 어제 해야할 일로 계획했던 api 코드 리팩토링을 했다.

    테이블명과 필드명이 많이 바뀌어서 api 코드에 있는 쿼리문을 수정해나갔고 테스트를 하려고 했는데 프론트쪽 코드도 건드려야 하는 상황이 발생하여 결국에는 완전히 바꾸지 못해서 기존 코드와 테이블을 유지해야 될 것같다.

    프론트쪽이 바빠서 바꿀 시간을 내주기에는 지금 당장은 쉽지 않다.

     

     

     

    <pooling connection 도입>

    코드 리팩토링을 시도하고 난 후에는 DB connection쪽을 수정했다.

    기존의 방식은 connection 생성 -> 쿼리 request -> connection 끊기였다.

    이러한 구조는 유저 수가 적을 때에는 서버에 무리가 가지는 않지만 유저 수가 많아지게 되면 connection 생성과 끊는 것은 서버에게 많은 부하가 발생하는 일이기 때문에 좋지 않은 방법이다.

    이를 생각해서 미리 바꾼 것은 아니지만 기존의 코드에 connection 생성 후에 connection.end()를 해주지 않아서 발생하는 에러를 잡기 위해 모든 api 코드에 connection.end()를 붙이는 수정을 할 바에는 지금 pooling connection을 도입하는 것이 낫겠다는 생각을 했다.

     

    pooling connection은 미리 DB와 connection들을 생성해서 pool에서 관리를 하는 것이다.

    그래서 client는 pool에 존재하는 connection을 가져와서 요청(query)을 보내고 반납하는 형식을 사용하게 된다.

    이러한 pooling connection은 mysql npm에서 제공한다.

    const mysql = require('mysql');
    // 풀 생성
    const pool  = mysql.createPool({
      connectionLimit : 10,
      host            : 'example.org',
      user            : 'bob',
      password        : 'secret',
      database        : 'my_db'
    });
    
    // conection 생성 및 반납
    pool.getConnection(function(err, connection) {
      if (err) throw err; // not connected!
     
      // Use the connection
      connection.query('SELECT something FROM sometable', function (error, results, fields) {
        // When done with the connection, release it.
        connection.release();
     
        // Handle error after the release.
        if (error) throw error;
     
        // Don't use the connection here, it has been returned to the pool.
      });
    });

     

    그리고 pooling connection을 알아보면서 새로운 것을 알게 되었다.

    MS SQL(SQL Server)나 Oracle과 같은 유료 DBMS는 타임아웃이란 개념이 존재한다. 단순하게 말하자면 이러한 타임아웃은 Connection을 자동으로 release(접속종료)해주는 것을 의미하는데, 무료 DBMS인 MySQL은 기본적으로 이러한 Connection을 자동으로 release 해주지 않는다. 하지만 MySQL에서 Connection Pool을 사용하면 다음과 같은 형태로 Auto Release를 지원한다.
    pool.query() = pool.getConnection() + connection.query() + connection.release()​

     

    출처: https://cotak.tistory.com/105 [Pool's Taek]

     

     


    <참고 자료>

    https://cotak.tistory.com/105

    https://sg-choi.tistory.com/427

    https://www.happykoo.net/@happykoo/posts/133

    https://m.blog.naver.com/PostView.nhn?blogId=pjt3591oo&logNo=221505148267&targetKeyword=&targetRecommendationCode=1 

     

    댓글

Designed by Tistory.