From a5edd5751624df40ec98fb6663ba2551543a9975 Mon Sep 17 00:00:00 2001 From: psh Date: Fri, 7 Jun 2024 11:05:56 +0900 Subject: [PATCH] =?UTF-8?q?database=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../database/mapper/DatabaseMapper.java | 26 ++- .../database/service/DatabaseService.java | 28 ++- .../service/impl/DatabaseServiceImpl.java | 10 + .../service/impl/MySQLSchemaViewerImpl.java | 179 ++++++++++++++++-- 4 files changed, 216 insertions(+), 27 deletions(-) diff --git a/src/main/java/egovframework/com/mtdata/database/mapper/DatabaseMapper.java b/src/main/java/egovframework/com/mtdata/database/mapper/DatabaseMapper.java index b7f2238..2541753 100644 --- a/src/main/java/egovframework/com/mtdata/database/mapper/DatabaseMapper.java +++ b/src/main/java/egovframework/com/mtdata/database/mapper/DatabaseMapper.java @@ -12,7 +12,7 @@ public interface DatabaseMapper { /** * 데이터베이스 스키마 조회 후 [comtsysdbinfo]테이블에 데이터를 저장한다 - * + * * @param vo * @return * @throws Exception @@ -21,7 +21,7 @@ public interface DatabaseMapper { /** * 사용자가 입력한 연결정보를 [comttblinfo]테이블에 저장한다 - * + * * @param vo * @return * @throws Exception @@ -30,7 +30,7 @@ public interface DatabaseMapper { /** * [comttblinfo]테이블에 저장된 내용을 조회한다 - * + * * @param vo * @return */ @@ -38,7 +38,7 @@ public interface DatabaseMapper { /** * Yaml 파일을 업데이트하기 위해 목록을 조회한다(pg_chameleon yaml용이나, 차후 다른 용도로 쓰임이 있다 판단되면 수정) - * + * * @param vo * @return */ @@ -46,12 +46,28 @@ public interface DatabaseMapper { /** * DB 연결 정보 검증(중복확인) - * + * * @param vo * @return */ public int checkDbConnInfo(DatabaseInfoVO vo); + /** + * 스키마 내 테이블정보를 [inst_db_tbl_info] 테이블에 저장한다. + * + * @param tbVo + * @return + */ + public int insertDbTblInfo(TableInfoVO tbVo); + + /** + * 컬럼 정보를 [inst_tbl_col_info] 테이블에 저장한다. + * + * @param colVo + * @return + */ + public int insertTblColInfo(ColumnInfoVO colVo); + /** * 등록된 DB 정보 관리 리스트 * diff --git a/src/main/java/egovframework/com/mtdata/database/service/DatabaseService.java b/src/main/java/egovframework/com/mtdata/database/service/DatabaseService.java index 2f535a2..4afd338 100644 --- a/src/main/java/egovframework/com/mtdata/database/service/DatabaseService.java +++ b/src/main/java/egovframework/com/mtdata/database/service/DatabaseService.java @@ -10,7 +10,7 @@ public interface DatabaseService { /** * 데이터베이스 스키마 조회 후 [comtsysdbinfo]테이블에 데이터를 저장한다 - * + * * @param vo * @return * @throws Exception @@ -19,7 +19,7 @@ public interface DatabaseService { /** * 사용자가 입력한 연결정보를 [comttblinfo]테이블에 저장한다 - * + * * @param vo * @return * @throws Exception @@ -28,7 +28,7 @@ public interface DatabaseService { /** * [comttblinfo]테이블에 저장된 내용을 조회한다(단일) - * + * * @param vo * @return */ @@ -36,7 +36,7 @@ public interface DatabaseService { /** * Yaml 파일을 업데이트하기 위해 목록을 조회한다(pg_chameleon yaml용이나 차후 다른 용도로 쓰임이 있다 판단되면 수정) - * + * * @param vo * @return */ @@ -50,6 +50,26 @@ public interface DatabaseService { */ int checkDbConnInfo(DatabaseInfoVO vo); + /** + * 스키마 내 테이블정보를 [inst_db_tbl_info] 테이블에 저장한다. + * + * @param tbVo + * @return + */ + int insertDbTblInfo(TableInfoVO tbVo) throws Exception; + + + + /** + * 컬럼 정보를 [inst_tbl_col_info] 테이블에 저장한다. + * + * @param colVo + * @return + */ + public int insertTblColInfo(ColumnInfoVO colVo) throws Exception; + + + /** * 등록된 DB 정보 관리 리스트 diff --git a/src/main/java/egovframework/com/mtdata/database/service/impl/DatabaseServiceImpl.java b/src/main/java/egovframework/com/mtdata/database/service/impl/DatabaseServiceImpl.java index 1a019d3..7dbe1d1 100644 --- a/src/main/java/egovframework/com/mtdata/database/service/impl/DatabaseServiceImpl.java +++ b/src/main/java/egovframework/com/mtdata/database/service/impl/DatabaseServiceImpl.java @@ -43,6 +43,16 @@ public class DatabaseServiceImpl extends EgovAbstractServiceImpl implements Data return databaseMapper.checkDbConnInfo(vo); } + @Override + public int insertDbTblInfo(TableInfoVO tbVo) throws Exception { + return databaseMapper.insertDbTblInfo(tbVo); + } + + @Override + public int insertTblColInfo(ColumnInfoVO colVo) throws Exception { + return databaseMapper.insertTblColInfo(colVo); + } + @Override public List selectRegisterdDBInfoList(DatabaseInfoVO vo) { return databaseMapper.selectRegisterdDBInfoList(vo); diff --git a/src/main/java/egovframework/com/mtdata/schema/service/impl/MySQLSchemaViewerImpl.java b/src/main/java/egovframework/com/mtdata/schema/service/impl/MySQLSchemaViewerImpl.java index 3f9d30a..cb384d8 100644 --- a/src/main/java/egovframework/com/mtdata/schema/service/impl/MySQLSchemaViewerImpl.java +++ b/src/main/java/egovframework/com/mtdata/schema/service/impl/MySQLSchemaViewerImpl.java @@ -1,13 +1,14 @@ package egovframework.com.mtdata.schema.service.impl; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; +import java.sql.*; import javax.annotation.Resource; +import egovframework.com.mtdata.comtsrcdata.service.ComtsrcdataService; +import egovframework.com.mtdata.comtsrcdata.vo.ComtExtrtVO; +import egovframework.com.mtdata.comtsrcdata.vo.ComtsrcdataVO; +import egovframework.com.mtdata.database.vo.ColumnInfoVO; +import egovframework.com.mtdata.database.vo.TableInfoVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -25,11 +26,15 @@ public class MySQLSchemaViewerImpl implements DatabaseSchemaViewer { @Resource(name = "DatabaseService") private DatabaseService dbService; + @Resource(name = "ComtsrcdataService") + private ComtsrcdataService comtsrcdataService; + private String url; private String user; private String password; private int dbConnId; + static { try { Class.forName(JDBC_DRIVER); @@ -46,8 +51,8 @@ public class MySQLSchemaViewerImpl implements DatabaseSchemaViewer { dbConnId = dbInfoVO.getDbConnId(); try (Connection conn = DriverManager.getConnection(url, user, password)) { - processDatabases(conn); - } catch (SQLException e) { + processDatabases(conn, dbInfoVO); + } catch (Exception e) { log.error("Error while connecting to the database: ", e); } @@ -61,48 +66,52 @@ public class MySQLSchemaViewerImpl implements DatabaseSchemaViewer { // while (databases.next()) { // dbNm = databases.getString(1); // System.out.println("dbName : " + dbNm); -// vo.setDbNmEn(dbNm); -// int insertDbList = dbService.insertDbinfo(vo); -// +// dbInfoVO.setDbNm(dbNm); +// int insertDbList = dbService.insertDbInfo(dbInfoVO); +// // DatabaseMetaData metaData = conn.getMetaData(); // ResultSet tables = metaData.getTables(dbNm, null, "%", null); //catalog, schemaPattern, tableNamePattern, types // // 여기서 부터 필요한 테이블의 정보를 출력함 // while(tables.next()) { // String tableName = tables.getString(3); // System.out.println("Table : " + tableName); -// +// // ResultSet columns = metaData.getColumns(dbNm, null, tableName, "%"); // while (columns.next()) { // String columnName = columns.getString(4); // String columnType = columns.getString(6); // System.out.println("\tColumn: " + columnName+ " (" + columnType + ")"); // } -// +// // } // } -// } catch (SQLException e) { +// } catch (Exception e) { // e.printStackTrace(); // } } - private void processDatabases(Connection conn) throws SQLException { + private void processDatabases(Connection conn, DatabaseInfoVO dbConnInfoVO) { String selectDbSql = "SELECT SCHEMA_NAME AS `Database` FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')"; try (Statement stmt = conn.createStatement(); ResultSet databases = stmt.executeQuery(selectDbSql)) { + // 스키마 while (databases.next()) { String dbNm = databases.getString("Database"); log.info("dbName : {}", dbNm); - DatabaseInfoVO vo = new DatabaseInfoVO(); - vo.setDbConnId(dbConnId); - vo.setDbNm(dbNm); + DatabaseInfoVO dbVo = new DatabaseInfoVO(); + dbVo.setDbConnId(dbConnId); + dbVo.setDbNm(dbNm); if (dbService == null) { log.error("dbService is null"); } - int insertDbList = dbService.insertDbInfo(vo); + int insertDbList = dbService.insertDbInfo(dbVo); if (insertDbList > 0) { + dbVo.setSysId(dbConnInfoVO.getSysId()); + tableProcess(conn, dbVo); + comtProcess(conn, dbVo); log.info("Database info successfully inserted for: {}", dbNm); } else { log.warn("No database info was inserted for: {}", dbNm); @@ -112,4 +121,138 @@ public class MySQLSchemaViewerImpl implements DatabaseSchemaViewer { log.error("Error processing databases", e); } } + + + //psh + private void tableProcess(Connection conn, DatabaseInfoVO dbVo) throws SQLException { +// String selectTableSql = "SELECT TABLE_NAME AS `TableName` FROM information_schema.tables WHERE table_schema="+dbNm+"and table_type=`BASE TABLE`"; + DatabaseMetaData metaData = conn.getMetaData(); + try (ResultSet tables = metaData.getTables(null, dbVo.getDbNm(), null, new String[]{"TABLE"})){ + + int checkSysId = dbVo.getSysId(); + log.info("comtExInfo insert success : ", checkSysId); + + // 테이블 + while (tables.next()) { + String tbNm = tables.getString("TABLE_NAME"); + + TableInfoVO tbVo = new TableInfoVO(); + tbVo.setDbLinkId(dbVo.getDbLinkId()); + if(tbNm.equals("sys_config")){ + break; + } + tbVo.setTableNm(tbNm); + log.info("TableName :", tbNm); + int insertTbCnt = dbService.insertDbTblInfo(tbVo); + + if (insertTbCnt > 0) { + log.info("TABLE info successfully inserted for: {}", tbNm); + ResultSet columns = metaData.getColumns(null, dbVo.getDbNm(), tbNm, "%"); + ResultSet pk = metaData.getPrimaryKeys(null, dbVo.getDbNm(), tbNm); + + // 컬럼 + while (columns.next()) { + String columnName = columns.getString(4); + String columnType = columns.getString(6); + boolean nullable = columns.getInt(11) == 0 ? false : true;; + + ColumnInfoVO colVo = new ColumnInfoVO(); + colVo.setTableId(tbVo.getTableId()); + colVo.setColumnNm(columnName); + colVo.setColumnType(columnType); + colVo.setNullable(nullable); + colVo.setPkey(false); + colVo.setFkey(false); +// if(pk==columnName){ +// colVo.setIsPkey(false); +// }else{ +// colVo.setIsPkey(false); +// } + + dbService.insertTblColInfo(colVo); + System.out.println("\tColumn: " + columnName+ " (" + columnType + ")"); + } + + } else { + log.warn("No TABLE info was inserted for: {}", tbNm); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + + //psh + private void comtProcess(Connection conn, DatabaseInfoVO dbVo) throws SQLException { + DatabaseMetaData metaData = conn.getMetaData(); + try (ResultSet tables = metaData.getTables(null, dbVo.getDbNm(), null, new String[]{"TABLE"})){ + + // 원천데이터 추출 정보 저장 + ComtExtrtVO comExVo = new ComtExtrtVO(); + comExVo.setSysId(dbVo.getSysId()); + int extCnt = comtsrcdataService.insertComtExtrtInfo(comExVo); + + if (extCnt > 0) { + int checkSysId = dbVo.getSysId(); + log.info("comtExInfo insert success : ", checkSysId); + + String dbNm = dbVo.getDbNm(); + + while (tables.next()) { + String tbNm = tables.getString("TABLE_NAME"); + if(tbNm.equals("sys_config")){ + break; + } + + // 원천데이터 저장 + String selectTableSql = "SELECT * FROM "+dbNm+"."+tbNm; + Statement stmt = conn.createStatement(); + ResultSet datas = stmt.executeQuery(selectTableSql); + + while (datas.next()){ + int i = 0; + ComtsrcdataVO comSrcVo = new ComtsrcdataVO(); + comSrcVo.setExtrId(comExVo.getExtrId()); + String value = datas.getObject(i).toString(); +// comSrcVo.setSrcDataVl(); + + int insertTbCnt = comtsrcdataService.insertComtSrcdataInfo(comSrcVo); + i++; + } + + + +// if (insertTbCnt > 0) { +// +// log.info("COMTSRCDATA successfully inserted for: {}", tbNm); +// ResultSet columns = metaData.getColumns(null, dbVo.getDbNm(), tbNm, "%"); +// ResultSet pk = metaData.getPrimaryKeys(null, dbVo.getDbNm(), tbNm); + + // 컬럼 +// while (columns.next()) { +// String columnName = columns.getString(4); +// String columnType = columns.getString(6); +// boolean nullable = columns.getInt(11) == 0 ? false : true;; +// +// ColumnInfoVO colVo = new ColumnInfoVO(); +// dbService.insertTblColInfo(colVo); +// System.out.println("\tColumn: " + columnName+ " (" + columnType + ")"); +// } + +// } else { +// log.warn("No TABLE info was inserted for: {}", tbNm); +// } + + } + + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + }