반응형

java에서 여러 종류의 DB를 연결 하기 위한 JDBC 설정방법을 알아 보겠습니다. DB에 연결해야 하는 경우 우리는 프레임워크를 사용 할 수 있지만 기본적인 연결 설정 방법도 알아 두는 것이 좋습니다. 왜냐하면 상황에 따라 테스트 모듈 개발이 필요 한경우가 생기니까요.

 

연결 테스트 DB

  • MS-SQL
  • DB2
  • Oracle
  • Tibero
  • Sybase
  • SybaseIQ
  • MySQL

 

Connection 함수 만들기

우선 공통 함수 getConnection이라는 함수를  만들겠습니다.  jdbc 연결은  Driver 설정만 다르지 기본 연결은 같이 때문에 다음과 같은 함수를 생성합니다. 

      protected Connection getConnection(String driver, String url, String dbuser, String dbpwd)
      {
            Connection con = null;
            System.out.println("jdbc.url=" + url);
            try {
                  Class.forName(driver)
                  DriverManager.setLoginTimeout(CONNECT_TIMEOUT);
                  con = DriverManager.getConnection(url, dbuser, dbpwd);
                  DatabaseMetaData meta = con.getMetaData();
                  String name = meta.getDatabaseProductName();
                  String version = meta.getDatabaseProductVersion();

                  if ( version != null && version.indexOf('\n') != -1 ) {
                        version = version.replace('\n', ' ');
                  }

                  System.out.println("database.name=" + name);
                  System.out.println("database.version=" + version);
                  return con;
            } catch (Exception e) {
                  System.out.println(e, e);
                  lastErrorMsg = e.toString();
                  return null;
            }
      }

 

DB Driver 설정 함수 생성

DBMS 별 Connection은 다음과 같은 메서드를 추가하고 테스트했습니다. 위의 함수를 참고해서 이제 각 DBMS 마다 driver를 설정하고 호출하도록 하겠습니다.

      protected Connection getMSSQLConnection(
                String dbaddr, String dbport, String dbname, String dbuser, String dbpwd)
      {
            if ( dbport == null || dbport.length() == 0 ) {
                  dbport = "1433";
            }

            String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
            String url = "jdbc:sqlserver://" + dbaddr + ":" + dbport + ";DatabaseName=" + dbname;
            return getConnection(driver, url, dbuser, dbpwd);
      }

      protected Connection getDB2Connection(
                String dbaddr, String dbport, String dbname, String dbuser, String dbpwd)
      {
            if ( dbport == null || dbport.length() == 0 ) {
                  dbport = "50000";
            }

            String driver = "com.ibm.db2.jcc.DB2Driver";
            String url = "jdbc:db2://" + dbaddr + ":" + dbport + "/" + dbname;
            return getConnection(driver, url, dbuser, dbpwd);
      }

      protected Connection getOracleConnection(
                String dbaddr, String dbport, String dbname, String dbuser, String dbpwd)
      {
            if ( dbport == null || dbport.length() == 0 ) {
                  dbport = "1521";
            }

            String driver = "oracle.jdbc.driver.OracleDriver";
            String url = "jdbc:oracle:thin:@" + dbaddr + ":" + dbport + ":" + dbname;
            return getConnection(driver, url, dbuser, dbpwd);
      }

      protected Connection getTiberoConnection(
                String dbaddr, String dbport, String dbname, String dbuser, String dbpwd)
      {
           if ( dbport == null || dbport.length() == 0 ) {
                  dbport = "8629";
            }

            String driver = "com.tmax.tibero.jdbc.TbDriver";
            String url = "jdbc:tibero:thin:@" + dbaddr + ":" + dbport + ":" + dbname;
            return getConnection(driver, url, dbuser, dbpwd);
      }

      protected Connection getSybaseConnection(
                String dbaddr, String dbport, String dbname, String dbuser, String dbpwd)
      {

            if ( dbport == null || dbport.length() == 0 ) {
                  dbport = "2638";
            }

            String driver = "com.sybase.jdbc3.jdbc.SybDataSource";
            String url = "jdbc:sybase:Tds:" + dbaddr + ":" + dbport + "/" + dbname;
            return getConnection(driver, url, dbuser, dbpwd);
      }

      protected Connection getSybaseASAConnection(
                String dbaddr, String dbport, String dbname, String dbuser, String dbpwd)
      {
            if ( dbport == null || dbport.length() == 0 ) {
                  dbport = "2638";
            }

            String driver = "com.sybase.jdbc3.jdbc.SybDriver";
            String url = "jdbc:sybase:Tds:" + dbaddr + ":" + dbport + "?ServiceName=" + dbname;
            return getConnection(driver, url, dbuser, dbpwd);
      }

      protected Connection getMySQLConnection(
                String dbaddr, String dbport, String dbname, String dbuser, String dbpwd)
      {
            if ( dbport == null || dbport.length() == 0 ) {
                 dbport = "3306";
            }

            String driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://" + dbaddr + ":" + dbport + "/" + dbname + "?useUnicode=true&characterEncoding=euckr";
            return getConnection(driver, url, dbuser, dbpwd);
      }

      protected Connection getJdbcOdbcBridgeConnection(String alias, String dbuser, String dbpwd)
      {
            String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
            String url = "jdbc:odbc:"+alias;
            return getConnection(driver, url, dbuser, dbpwd);
      }

위와 같이 작성하시면 문제없이 DB 연결 확인이 가는 할 것 같습니다. 여기에 Connection을 이용해 조회 쿼리까지 실행해 보면 더 좋을 것 같습니다. 하지만 위처럼 작성하는 것을 개인적으로는 좋아하지 않습니다. 왜냐하면 이 메서드들은 같은 내용이 반복되고 있습니다. 이 부분들을 제가 수정해 보도록 하겠습니다.

 

우선 Driver, URL 정보를 Map에 넣도록 하겠습니다. 

기본 설정은 유지하지만 외부에서 변경해야 하는 경우가 발생할 수 있기 때문에 Map에 값을 설정하는 것을 선호합니다.

Map 형태로 변경이 가능하도록 했습니다.

public void initMap(Map<String, String> jdbcMap) {

            if(jdbcMap.size() > 0) {
                  map = jdbcMap;
            }

            if(map == null) {
                  map = new HashMap<String, String>();      
                  map.put("MSSQL_DRIVER", "com.microsoft.sqlserver.jdbc.SQLServerDriver");
                  map.put("DB2_DRIVER", "com.ibm.db2.jcc.DB2Driver");
                  map.put("ORACLE_DRIVER", "oracle.jdbc.driver.OracleDriver");
                  map.put("TIBERO_DRIVER", "com.tmax.tibero.jdbc.TbDriver");
                  map.put("SYSBASE_DRIVER", "com.sybase.jdbc3.jdbc.SybDataSource");
                  map.put("SYSBASEIQ_DRIVER", "com.sybase.jdbc3.jdbc.SybDriver");
                  map.put("MYSQL_DRIVER", "com.mysql.jdbc.Driver");
                  map.put("MSSQL_URL", "jdbc:sqlserver://_DBADDR_:_DBPORT_;DatabaseName=_DBNAME_");
                  map.put("DB2_URL", "jdbc:sqlserver://_DBADDR_:_DBPORT_;DatabaseName=_DBNAME_");
                  map.put("ORACLE_URL", "jdbc:oracle:thin:@_DBADDR_:_DBPORT_:_DBNAME_");
                  map.put("TIBERO_URL", "jdbc:tibero:thin:@_DBADDR_:_DBPORT_:_DBNAME_");
                  map.put("SYSBASE_URL", "jdbc:sybase:Tds:_DBADDR_:_DBPORT_/_DBNAME_");
                  map.put("SYSBASEIQ_URL",  "jdbc:sybase:Tds:_DBADDR_:_DBPORT_?ServiceName=_DBNAME_");
                  map.put("MYSQL_URL", "jdbc:mysql://_DBADDR_:_DBPORT_/_DBNAME_?useUnicode=true&characterEncoding=euckr");
            }
      }

     public Connection getConnection(
            String dbType, String dbaddr, String dbport, String dbname, String dbuser, String dbpwd) 
      {
            String driver = map.get(dbType.toUpperCase()+"_DRIVER");
            String url = map.get(dbType.toUpperCase()+"_URL").replaceAll("_DBADDR_", dbaddr).replaceAll("_DBPORT_", dbport).replaceAll("_DBNAME_", dbname);
            return getConnection(driver, url, dbuser, dbpwd);
      }

URL을 보시면 나중에 파라미터를 설정하기 위해 _DBADDR_, _DBPORT_, DBNAME_ 을 작성했습니다.

하지만 뒤에 보시면 알겠지만 해당 문자를 replaceAll을 이용해 변환만 할 것인데 좋은 방법은 아닌 것 같습니다.

정규식을 사용하면 좋을 것 같다는 생각도 들지만 우선은 replaceAll 하도록 하겠습니다.

 

main 함수에서 해당 Connection을 확인하고 쿼리까지 실행해 보면 좋을 것 같습니다.

여기까지는 주로 사용하는 RDBMS에  JDBC 연결 설정이었고 다음에는 noSQL 연결과 하이브리드 DB 사용에 대해 확인해보겠습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기