ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2개의 DB간 Table & Column 차이 비교
    JAVA 2021. 3. 12. 10:46

    개발 목적

     

    이번에 회사에서 몇개의 이기종 DB가 존재함에 있어 (Oracle / Mssql / Mysql / Maria .. 등등 여러가지 DB가 존재)

     

    ERD를 각각에 DB에 따라 가지고 있지 않고 Oracle 기준으로 가지고 있기에,

     

    모든 DB에 대해서 반영여부 확인하기가 어려웠었다. ( 릴리즈 시점에는 기준이 되는 Oracle만 반영하고, 별도의 반영은 현재는 필요에 의하여 반영 )

     

    이에 대해서 간단하게 개발진행하였는데,

     

     

    기존 개발 내역 대비 변경 점

     

    원래는 DML은 DBunit으로 진행하여 이기종 DB 이관은 진행 할수있어서

     

    Table도 당연히 되겠지 해서, Metadata 빼오는 작업을 진행하면 되겠지 하며 시작하였던게

     

    DBunit으로 할 경우 csv,xml 등 mock data를 밀어넣는 용이기때문에 먼저 파일을 써야하는부분이 

     

    불합리 해보여, 

     

    QueryDataSet 을 사용하여, Column[] columns = partialDataSet.getTables()[0].getTableMetaData().getColumns();

     

    형태로 각각의 table metadata를 뽑아와,

     

    이기종은 column sql type이 각자 다르기에, class type기준으로 받아와 각각 비교해주었다.

     

     

    실제 개발 소스

     

    
    Class driverClass = Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String jdbcType = "mssql";
            String user = "sa";
            ResultSet rs = null;
            Connection jdbcConnection = DriverManager.getConnection("jdbc:sqlserver://", user, "1004");
    
            Statement stmt = null;
    
            stmt = jdbcConnection.createStatement();
    
            String sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES";
    
            rs = stmt.executeQuery(sql);
    
    
            IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
            DatabaseConfig config = connection.getConfig();
            if(jdbcType.equals(SQLTYPE_ORACLE)){
                config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new OracleDataTypeFactory());
                config.setFeature(DatabaseConfig.FEATURE_SKIP_ORACLE_RECYCLEBIN_TABLES, Boolean.TRUE);
                jdbcConnection.prepareStatement("SET CONSTRAINTS ALL DEFERRED").execute();
    
            }else if(jdbcType.equals(SQLTYPE_MARIADB)){
                config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
    
            }else if(jdbcType.equals(SQLTYPE_MSSQL)){
                config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MsSqlDataTypeFactory());
    
            }else if(jdbcType.equals(SQLTYPE_POSTGRESQL)){
                config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new PostgresqlDataTypeFactory());
            }
    
    
            Map<String,List<Map<String,Object>>> tableMap = new HashMap<String, List<Map<String,Object>>>();
    
            while(rs.next()){
                QueryDataSet partialDataSet = new QueryDataSet(connection);
    
                List<Map<String,Object>> columnListMap = new ArrayList<Map<String, Object>>();
    
                String tableName = rs.getString("TABLE_NAME");
                partialDataSet.addTable(tableName);
    
    
                Column[] columns = partialDataSet.getTables()[0].getTableMetaData().getColumns();
    
    
                for(Column column : columns){
                    Map<String,Object> columnMap = new HashMap<String, Object>();
                    columnMap.put("column_nm",column.getColumnName());
                    columnMap.put("column_data_type",column.getDataType().getTypeClass().getName());
                    columnMap.put("column_nullable",column.getNullable());
                    columnListMap.add(columnMap);
                }
    
                tableMap.put(tableName,columnListMap);
            }
    
    
            System.out.println("TARGET TABLE SEARCH END");
    
            return tableMap;
       

     

    위와 같이 간단하게 비교하여. source -> target 기준으로 비교하여 처리 진행

     

     

     

    [참고 Github]

    github.com/chr3125/DB_Table-Column_Compare.git

    'JAVA' 카테고리의 다른 글

    Try-with-resources  (0) 2021.04.08
    Stack / Heap / Garbage Collection  (0) 2020.11.18
    Mybatis null check java method로 처리하기  (0) 2020.08.25
    각각 DB 폴더에 담긴 Mapper 비교하여 누락된 내역 찾기  (0) 2020.01.22
    Excel Sheet Copy  (0) 2019.06.05

    댓글

Designed by black7375.