[개발] Node & Steem 9편 - 기초적인 커넥션 풀 적용 - Database Connection Pool

in #kr-dev6 years ago (edited)

봇 서비스를 만들면서 엄청나게 장편이 되어가고 있네요. 허접하지만 항상 돌아가고 있는 저의 봇 서비스는 깃헙에 공유되고 있어 상세 코드는 제 허접한 깃헙에서 언제든 확인 가능합니다.

■ 커넥션 풀 적용


먼저 커넥션 풀 적용에 대한 이야기입니다. 일단 개발에서 무슨 Pool, 무슨 Pool 이라고 말을 자주 쓰는데

이런거나... 혹시

이런게 아니라는 것쯤은 예상하고 계실겁니다. (이상한 개드립?) 웹 개발을 하고 멀티쓰레드로 동작하는 언어라면 Http request에 대한 처리 쓰레드 풀이나 자주 사용하는 Object에 대한 객체 풀, 그리고 데이터베이스 커넥션 풀이 자주 언급 되는 것 같습니다.

개념적으로는 사용하기 위해 생성(초기화)하는 과정이 오래 걸리고 부하가 심한 것들을 미리 만들어두고 바구니에 담아두고 계속 재 활용하자는게 그 취지면서 고 비용의 초기화 과정을 줄이는 게 그 목적이겠죠.

트... 특히 DB 커넥션 풀 같은 경우는 그 성능 체감에 있어서 엄청난 차이를 보이기에 DB를 쓰는 어플리케이션이라면 필수적으로 들어가야하지 않나 싶습니다. DB에 커넥션 연결하는데 리소스가 많이 들거든요.

그림으로는 이녀석이 가장 이해가 쉽게 표현되어있네요.


출처. docs.oracle.com

누이 좋고 매부 좋다는 이녀석. 적용을 안할 수 없죠. mysql 기준으로 적용해봅니다.

// init mysql!
var db_config = {
   // 운영 모드.
    prod: {
      host: '127.0.0.1',
      port: '3306',
      user: 'steem_nhj',
      password: 'steem_nhj',
      database: 'steem_nhj',
      connectionLimit:20, // 신규
      waitForConnections:false // 신규
    },
..... 생략 ....
function createPool() {
  pool = mysql.createPool(db_config);
}
createPool();

그리고 실제로 쿼리를 connection을 얻어서 쓰고 있었는데 pool 에서 얻어와서 사용하도록 변경해봤습니다. synchroniz가 적용된 쿼리 실행 함수네요. '반환'은 필수!

function query(sql, params){
  //console.log("query.sql : "+sql );
  var conn = await(pool.getConnection( defer() ));
  var rows = await(conn.query(sql, params, defer() ));
  //console.log( rows );
  conn.release(); // 반환.
  return rows;
}

예전에 요즘과 같이 DB 레이어 영역의 프레임워크나 공통 유틸리티를 적용하지 않고 프로그램을 만든적이 있었는데 그때 커넥션을 열고, 닫고를 직접 코딩으로 했었습니다. 어디선가 닫는걸 빼먹으면 디비서버에 자원이 반환되지 않아 나중에 디비 리소스가 풀이 되며 서버가 뻗었었죠. ㅎㅎㅎ 열고 닫고의 중요성을 체감한 소중한 경험이었다고 생각합니다.

머... 암튼 사용할 땐 이렇게 사용하면 되겠습니다. 현재 steem.apps 봇에 적용해서 잘 돌아가고 있는 것 같습니다.

query("쿼리", [ 파라미터들. ] )

허접한 내용 읽어주셔서 감사합니다~ ^^


Node & Steem - 지난 회차 살펴보기
1편 - nodejs 개발환경을 구성해보자. 윈도우 개발 + Github 저장소 + 리눅스 운영
2편 - 콜백 지옥을 탈출해보자. - synchronize.js 편
3편 - 로깅 처리와 DB(mysql)설치 및 설정
4편 - DB 설정과 운영서버까지 설정 마무으리!
5편 리스팀 알림 봇을 만들어볼까? #1
6편 리스팀 알림 봇을 만들어볼까? #2 whitelist 데이터 수집
7편 리스팀 댓글 알림 봇 #3 시범오픈과 구현 마무으리!
8편 - 간단한 서버 관리 다섯가지 팁 - 쉘 접속과 alias 지정 등


Sort:  

@리스팀 목록

이 글을 리스팀 해주신 소중한 분들입니다.

리스팀 목록
millionfist
yajirang

Fantastic post friend. i always like your content because your content type and quality so good.

들렸다갑니다. ㅎㅎ.

와하우우!!! 넘나 이과적인것^^잘보고 갑니다!!😹

요즘 steem.js를 통해 데이터 추출을 테스트 중인데 좋은 정보와 디테일한 연재 감사합니다.
1편부터 정독해보겠습니다.

마지막편은 언제인가요?? 그때 리스팀하고 앞에 글들 보려고 했는뎅 ㅋㅋ
오늘도 잘 봤습니다~~
딱풀은 중요하죠.!! 매우 ㅋㅋ

계속 봇을 업데이트 하는 이상은 적용하는 내용을 적을것 같습니다. ㅎㅎ 개발일지나 마찬가지죵. 할게 아직 많이 생각나는것 보니 장기 연재가 가능할것 같은 느낌이 듭니당.

다 아는 얘기인데도 왠지 예전 생각 나고 그렇지 않으십니까? ㅎㅎ

ㅎㅎ 뭐~ 아는것도 있고~ 모르는 것도 있고 그렇지요~~ nhj12311님이 저보다 훨씬 고수시죠!! 고수! 잘생긴 고수!! 맛있는고수!! ㅋㅋ
개발글 포스팅이 생각보다 시간이 많이 들어가서.. 가끔 쓰려다가도 또 말게되고 저는 좀 그렇더라고요 ㅎㅎ

포스팅보단 실제 개발을.. 하고 있지요.. ㅋㅋ 재미난 개발..!!

과정좀 올려주세요~ 궁금하네유~~~

개발포스팅이 의외로 시간 마니 먹드라구요. 체크도 2중,3중 해야대구. 아는것도 또 검색해보구용 . ㅎㅎ 아. 그리고 절대 고수같은 말씀은 하시면 안댑니다 ㅎㅎ

고수가 싫으시면!!!! "수고"로.. ㅋㅋ
"수고"이십니다..!!

어...어렵군요..... 이런... 프로그래밍이라니 ㅠㅠ

yealumilu님이 nhj12311님을 멘션하셨습니다. 아래에서 확인해볼까요? ^^
[Steemit] 1분만에 스팀잇 새로운 계정 만들어 보자!(전 오래걸렸지만)

이런 걸 보고. 음.. 멋지군 이라고 하고 싶다.......(겁나 시크하게)

boddhisattva님이 nhj12311님을 멘션하셨습니다. 아래에서 확인해볼까요? ^^
TOP 200 effective Steemit curators in KR category for the last week (2018.02.26-2018.03.04)

sindoja님이 nhj12311님을 멘션하셨습니다. 아래에서 확인해볼까요? ^^
스팀잇 가입 경쟁을 뚫다! 반갑습니데이!

nand님이 steem.apps님을 멘션하셨습니다. 아래에서 확인해볼까요? ^^
[저격글] 다운보팅 들어갑니다 누가 제 글을 복사 게시했네요.

nand님이 nhj12311님을 멘션하셨습니다. 아래에서 확인해볼까요? ^^
[저격글] 다운보팅 들어갑니다 누가 제 글을 복사 게시했네요.

minming님이 nhj12311님을 멘션하셨습니다. 아래에서 확인해볼까요? ^^
'창렬' 한 캐마에 질린 여러분을 위한 '혜자' 스러운 캐치마인드