-
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]
'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