Node.js 에서 mariassql 모듈을 이용해 stored procedure 를 호출하고 사용해 왔지만, procedure 에서 declare 한 variable 에 out (반환)
을 사용해본적이 없었다.
클라이언트에서 넘긴 최소한의 정보들을 req.body로 호출하고 그값을 prepare 하게 넘겨서
mariasql 에서 제공하는 limit 함수를 이용해 paging 처리된 목록들을 출력하는데 전역 변수나 클로저를 사용하지않고, 프로시저를 통해
반환값을 가져오고 싶었다.
먼저 페이징 처리에 가상 시나리오는 다음과 같다.
-자유 게시판 (테이블명칭 : Board )에 100개의 정상적인 ROW 데이터 존재.
-사용자는 10개씩 1페이지로 데이터를 보길 원함.
가상 시나리오를 통해 페이징 처리를 진행한다.
필요 페이지수 :
전체 100개의 데이터를 10개씩 보기 원하기때문에 100 나누기 10을 하여 전체 필요 페이지수는 10페이지가 된다.
여기서 끝이 아니다. 데이터가 101개가된다면, 필요 페이지수는 11페이지가 되어야 한다.
그렇기때문에 나머지가 0 보다 큰지 식별을 하고 , 0보다 클경우 구한 페이지에서 +1페이지를 더해줘야 하는것이다.
여기까지 시나리오를 mysql 쿼리문으로 작성하면 다음과 같다.
listEach 는 프로시져 변수로 한페이지에 몇개를 보여줄것인가를 의미한다.
SET totalPage =( (select count(boardPK) from board) DIV listEach );
DIV 는 mysql 함수로 나눗셈결과를 정수형태로 반환한다.
MOD 함수로 나머지값이 0보다 큰지 식별하고 참일경우와 거짓일경우를 식별하여 totalPage를 구한다.
SET totalPage = totalPAge + (IF( FLOOR(MOD(totalPage,listEach))>0 , 1 , 0 ));
이제 limit 함수를 사용하기위한 설정을 완료해주면되는데
limit 의 시작값이 필요하다. 시작값은 (현재 페이지 -1) * listEach 를 하면 설정이 완료가 된다.
SET totalPage_out =totalPage;그리고 , SELECT 쿼리를 날려서 리스트를 호출하면되는데 그전에 프로시저의 OUT 을 통해 함수를 내보내기 위한 선언을 해야한다.
SET totalPage_out =totalPage;
마지막으로 쿼리를 입력한다.
SELECT * FROM board ORDER BY boardPK LIMIT startEach , listEach;
그리고 Node.js 단에서 쿼리를 실행줘야하는데 쿼리는 String 타입으로 call 프로시져명을 해주면되고 이때 프로시져뒤에 쿼리를 이어붙이는방식으로
반환값을 가져올수있다.
예를 들어 프로시져명이 board_list_call 이라 한다면
call board_list_call(0,0,@totalPage_out,?,?,?); SELECT @totalPage_out as totalPage;
이런방식으로 처리가 가능하다.
쿼리의 변수에서 @totalPage_out 은 out 처리된 프로시져 변수이며 out 처리가 된후에 SELECT 문을 통해 값을 리턴받을수있다. 이름을 다시 totalPage 로
변환한것은, Javascript 에서 변수명에 앞글자 특수문자를 사용할수없는 명명 규칙때문이다.
리턴되는 형식은 배열형태로 별도의 구분없이 바로 밑에 객체형식으로 붙기때문에, 클라이언트단에서 전체 페이지수를 명시할때 , 배열을 slice 해주는작업이
필요하다.
'BackEnd > DB-RDBMS' 카테고리의 다른 글
MariaSQL Upgrading v0.1.x to v0.2.x (0) | 2016.01.28 |
---|---|
squel.js (SQL query string builder) : ) (0) | 2016.01.28 |
문자타입에 PK값 사용 이유와 WHERE 절에 들어가는 IS NULL 고찰 (0) | 2015.12.13 |
npm install mariasql..it doesn't working (a little envrionment problem.?) (2) | 2015.11.05 |
Install MariaSQL Module (0) | 2015.11.04 |