본문 바로가기
IT 실무/웹프로그래밍

node js에서 mysql 함수를 동기(sync)로 사용하기

by id 2015. 10. 4.
반응형

node js의 함수는 기본적으로 async하게 동작한다. 즉 순서대로 실행되길 바라는 함수를 순서대로 나열해 놨다고 해서 이게 순서대로 실행되는게 아니라는 것이다. 아래 코드를 보자


user_no = preFunction(param); 
afterFunction(user_no); 

function preFunction(param) { 
 insertQueryExcute(query, function(error, result) {
   if(error) doSometing;
   else return result.insertId;
} 


위 코드를 프로그래밍한 개발자라면 preFunction이라는 함수를 통해서 반환된 insertId를 afterFunction에서 사용하고 싶었을 것이다. 하지만 위와 같은 코드를 실행시키면 afterFunction에 들어가는 파라미터는 항상 null이 된다. preFunction에서 쿼리를 수행하고 값을 반환하기 전에 afterFunction이 비동기로 먼저 실행되어 버리기 때문이다.


동기적으로, 즉 순서대로 실행시키고자 한다면 아래와 같이 할 수 있다.


preFunction(param); 

function preFunction(param) { 
 insertQueryExcute(query, function(error, result) {
   if(error) doSometing;
   else {
     afterFunction(result.insertId); 
     return result.insertId;
   }
} 


이렇게 하면 preFunction의 반환값을 받아서 afterFunction을 정상적으로 실행시킬 수는 있겠으나 afterFunction이 preFunction에 종속되어 버리는 문제가 있다. 즉 두 함수를 따로 사용할 수 없는 것이다. 그럴땐 아래와 같이 callbackFunction을 정의하면 된다.


preFunction(param, function(user_no) {
  afterFunction(user_no); 
}); 

function preFunction(param, callback) { 
 insertQueryExcute(query, function(error, result) {
   if(error) doSometing;
   else {
     callback(result.insertId);
     return result.insertId;
   }
} 


이 방법은 node js에서 mysql함수를 동기적으로 작동시키는 것 말고도 javascript에서 어떤 비동기 함수를 동기적으로 작동시킬 필요가 있을때 흔하게 쓰일 수 있다.

*위 코드들은 예시를 위해 즉석으로 코딩한 것이므로 복붙해서 쓰면 동작 안한다. 원리만 차용하길

반응형

댓글2

  • 나그네 2016.03.06 23:04

    sync는 동기의 뜻을 가지고 있습니다 비동기는 async죠 그래서 ajax의 async속성의 기본값이 true인것도 ajax가 기본적으로 비동기로 동작하기 때문인거죠
    저런식으로 사용자 정의 콜백을 만들수도 있군요
    답글