여행매니아
140
2017-03-27 11:42:46 작성 2017-03-27 12:18:30 수정됨
4
7263

자바코드 단 한줄로 프로시저호출 (Java call db stored procedure)


프로시저명과 그 프로시저에 필요한 인자들을 차례로 나열하면 끝.

XDB.call(new Object[]{"PROCEDURE_TEST", "STRING", 10, 20, ...}, conn);

INSERT, UPDATE, DELETE 처럼 결과가 없는 경우 위 예제처럼 사용하면 되고,

어떤 프로시저가 SELECT 결과를 반환한다면 ArrayList 타입으로 받으면 된다.

ArrayList r = XDB.call(...);


좀 더 구체적인 예

마리아DB 혹은 MySQL에서 아래와 같이 테스트 프로시저를 생성한다.

CREATE PROCEDURE SP_TEST(
  P_CNT INT
)
BEGIN
  SELECT * FROM TABLE1 LIMIT P_CNT;
  SELECT * FROM TABLE2 LIMIT P_CNT;
  SELECT * FROM TABLE3 LIMIT P_CNT;
END;

SP_TEST 프로시저는 TABLE1~3 으로부터 각각 P_CNT 만큼의 레코드를 선택하도록 작성했다.

CALL SP_TEST(3);

DB TOOL에서 위 처럼 실제로 잘 동작하는지 테스트 해 볼 것. 정상적으로 실행되면 각 테이블로 부터 3개씩의 레코드를 선택해서 보여줄 것이다.

이제 테스트용 자바소스코드.

import com.mvcjsp.*;
import java.sql.*;
import java.util.*;

public class Test {
    public static void main(String[] args) throws Exception {

        String url = "jdbc:mysql://localhost:3306/데이타베이스명";
        String user = "사용자명";
        String password = "비밀번호";

        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection(url, user, password);

        ArrayList r = XDB.call(new Object[]{"SP_TEST", 3}, conn);

        System.out.println(r);
        conn.close();
    }
}

일반적으로 Connection 리소스는 finally 블럭에서 close 하지만 핵심코드 이해의 편의를 위해서 생략함. 위 코드가 정상적으로 동작하기 위해서는 두 개의 .jar 라이브러리가 필요하다. 하나는 mysql용 driver인 mysql-connector-java-###.jar 이고 다른 하나는 mvcjsp.jar 이다.

https://dev.mysql.com/downloads/connector/j/5.1.html

http://www.mvcjsp.com/mvcjsp.jar

MSSQL, MariaDB, MySQL, Oracle 을 지원한다. Oracle에서 SELECT 결과를 받기 위해서는 약간 다른 문법으로 사용해야 한다.






0
0
  • 댓글 4

  • 여행매니아
    140
    2017-03-27 12:17:43

    좋은 점은 Multi resultset을 지원하기 때문에 하나의 프로시저에서 여러개의 결과를 반환하더라도 단 한번의 호출로 해결가능하다. 그리고 아래와 같이트랜젝션을 관리할 수 도 있다.

    Connection conn = null;
    try {
        ...
        conn.setAutoCommit(false);
        다른시스템과의 연동작업
        XDB.call(...);
        XDB.call(...);
        XDB.call(...);
        파일 I/O
        conn.commit();
    } catch (...) {
        conn.rollback();
        예외처리 및 로그기록
        ...
    } finally {
        if (conn != null) conn.close();
    }
    0
  • 아스키
    10k
    2017-03-29 11:50:50

    굿팁 감사합니다..!!!

    1
  • 음...
    1k
    2017-03-29 15:48:32 작성 2017-03-29 15:52:26 수정됨

    @여행매니아님, 산출물 공유 고맙습니다.

    그런데 궁금한게 하나 있습니다. 인자로 주입하는  connection을 통한 트랜젝션제어가 가능하다고하셨는데, 일반적인 production 상황에서 여러 sp를 호출하면서 트랜젝션 처리를 보장할 수 있나요?

    SP내에 트랜젝션 처리가 들어가버리면 무용지물일텐데.. 보통 SP를 작성하면 트랜젝션처리가 포함되는것을 감안하면

    코드 작성이 가능하다 정도이지 이렇게 제어하면 된다고 말할수는없을것 같습니다.

    0
  • 여행매니아
    140
    2017-03-29 17:42:39
    네 맞습니다. 프로시저 는 순수한 오퍼레이션만 해야합니다. 내부에서 트랜잭션에 관여하면 문제의 소지가 있지요. ^^


    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.