Tips

Java에서 SAP DB에 Access하기

쿨링팬 2004. 12. 15. 18:42

Java에서 SAP DB에 Access하기

SAP DB를 Access하기 위해 무지하게 노력하던 중 결국 포기하고 사악한 방법을 사용하였다. 고민 몇 시간 만에 이렇게 살짝 도망치다니, 나도 이제 늙은 것인가? 휴...



Java에서 SAP DB에 Access하기


SAP DB는 AMERICAN_AMERICA.WE8DEC 문자셋을 사용하므로, 일반 JDBC에서는 정상적인 한글 데이터 입출력이 불가능하다.
이를 해결하기 위하여 ODBC를 경유하는 방법(ODBC-JDBC Bridge)를 사용하면 된다.



PART I. Oracle 설정



1. Oracle Client를 설치한다.
2. Oracle NetManager를 이용하여 해당 DB를 연결한다.
3. Registry Edit를 이용하여 Registry Key를 변경한다.
   HKEY_LOCAL_MACHINE > SOFTWARE > ORACLE 밑의 모든 Key 중에서
   NLS_LANG key의 값을 AMERICAN_AMERICA.WE8DEC 로 변경한다.
4. SQLPlus를 기동한다.
  이때 SQLPlus의 메뉴바의 메뉴명들이 한글이 아니고, 영어로 표시되어야 한다. 예를 들어 '파일'이 'File'로.
5. SQLPlus에서 Query를 수행하여 해당 값이 한글로 표시되는지를 확인한다.


select rownum, jeokyo from sapwfd.zcbk_acct_his where rownum < 10;






Part II. ODBC 설정



1. 위의 과정이 성공적으로 수행되었으면, Oracle의 메뉴 중에서 'Configuration and Migration Tools'의 'Microsoft ODBC Administrator'를 실행한다.
2. 사용자 DSN 에서 '추가'를 선택한다.
3. 드라이버 중에서 Oracle 관련드라이버를 선택한다.
4. 드라이버 설정 창에서 DataSourceName은 적당히 입력하고(향후 이 값이 DB연결명이 된다) TNS Service Name은 Oracle에서 지정한 TNS명을 입력한다. UserId는 해당 ID를 입력.
   설정창 밑 부분의 Numeric Settings는 'Use Oracle NLS Settings'를 선택한다.
5. 'Test Connection'을 실행하여 정상작동 여부를 확인한다.
6. 이제 ODBC 설정이 완료되었으므로, '확인'을 누르고 종료한다.



Part III. Java 설정


1. Oracle이 설치된 디렉토리에 보면 jdbc라는 디렉토리가 있다. 이 디렉토리 밑의 lib 안에 있는 classes12.zip과 nls_charset12.jar를 클래스패스에 추가한다.
2. java가 설치된 디렉토리에 보면, jre 디렉토리 밑의 lib 디렉토리에 rt.jar가 있다. 이것을 클래스패스에 추가한다.
3. 이제 ODBC-JDBC Bridge를 이용하여 SAP DB에 Access 할 수 있다.


다음의 Sample Program을 실행한다.



import java.sql.*;

public class TestSAP {

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

        String sql1 = "select jeokyo from sapwfd.zcbk_acct_his where mandt='000'";

        String sql2 = "insert into sapwfd.zcbk_acct_his values ("
           + "'000','7608181111111','04','1234567890123456',' ',' ',?,' ',0,0,' ',' ',' ',' ',' ',' ')";

        //Class.forName("oracle.jdbc.driver.OracleDriver");
        //Connection conn = DriverManager.getConnection
                                     ("jdbc:oracle:oci:aaa/aaa@woongjin");

        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection conn = DriverManager.getConnection("jdbc:odbc:woongjin", "aaa", "aaa");

        try {
            Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery(sql1);
            while ( rset.next() ) {
                System.out.println("==> [" + rset.getString("jeokyo") + "]");
            }
            rset.close();
            stmt.close();
        } catch(Exception e) {
            throw e;
        }

        try {
            PreparedStatement stmt1 = conn.prepareStatement(sql2);
            System.out.println("[" + sql2 + "]");
            stmt1.setString(1, "한글테스트입니다.");
            stmt1.executeUpdate();
            stmt1.close();
        } catch(Exception e) {
            throw e;
        }
  
        conn.close();
  
    }
}





* 주의할 점 *

- ODBC-JDBC Bridge를 사용할 경우, 일반 Statement 객체를 사용하면, insert/update 시에 한글이 깨진다. 이때 PreparedStatement객체를 사용하여 물음표(?) 에 값을 세팅하는 setXXX() 메소드를 이용하면 이것이 해결된다. 이는 Driver가 SQL 문장을 전송하는 과정에서 문자셋 전체에 대한 변경작업을 수행하기 때문으로 보인다.
- 단순히 값을 select하는 경우는 일반 Statement객체를 사용하여도 무방하다.
- ** 절대로 sql 문장 내에 한글이 직접 포함되지 않도록 하시오 **






2004년 12월 15일 이주현