반응형

META시스템에 표준용어를 일괄로 등록하기 위한 'META 일괄등록 문서'를 만드는 작업입니다.
컬럼매핑정의서의 TO-BE컬럼을 정비하고, 표준용어가 없을 경우 이를 등록하기 위함입니다.

최근의 차세대 프로젝트는 META용어를 정비하는 것으로 시작됩니다.
실제 W은행, K카드, H은행의 차세대를 진행하며 사용했던 프로그램입니다.

■ 순서
    1. META시스템의 일괄등록 양식을 내려받기 합니다.
    2. 일괄등록 양식 템플릿에 맞춰 등록할 표준용어를 엑셀문서로 생성합니다.
    3. 생성된 문서를 META시스템의 '엑셀 불러오기' 기능을 이용하여 용어를 등록합니다.

    ※ 1번과 3번은 META시스템마다 약간의 차이가 있으며
        여기에서는 2번에 해당하는 작업을 프로그램화 하였습니다.

■ SOURCE

    /**
     * 표준용어 등록문서 생성
     * - 컬럼매핑정의서의 "미등록 용어"를 일괄등록 양식에 맞춰 등록문서를 생성한다.
     */
    private static void createMetaTerm( ArrayList<ArrayList<String>> arr2AT ) {
        
        System.out.println( "■ META 표준용어 등록문서 생성 START" );
        
        HashMap<String, ArrayList<ArrayList<String>>> ma2MetaTermUp = new HashMap<String, ArrayList<ArrayList<String>>>();  // 담당자별 META 등록문서
        
        HashMap<String, String> mapDupReg = new HashMap<String, String>();   // 중복용어 제거용
        
        for( int iRow = 0; iRow < arr2AT.size(); iRow++ ) {
            
            ArrayList<String> arrATRow = arr2AT.get( iRow );
            
            String strTerm = arrATRow.get( T논리명 );  // TOBE컬럼한글명
            
            // <상태>가 '삭제'이거나 '표준용어'이면 SKIP.
            // <담당자:기타>이면 SKIP.
            if( arrATRow.get( 상태 ).contains( "삭제" ) ) continue;
            if( !arrATRow.get( 상태 ).equals( "미등록 용어" ) || arrATRow.get( 담당자 ).equals( "기타" ) ) continue;
            if( mapDupReg.containsKey( strTerm ) ) continue;
            
            mapDupReg.put( strTerm, "" );

            // [표준용어] 등록양식 생성
            ArrayList<ArrayList<String>> arr2MetaTermUp = new ArrayList<ArrayList<String>>();  // META 등록문서
            ArrayList<String> arrMetaTermUpRow = new ArrayList<String>();
            
            if( ma2MetaTermUp.containsKey( arrATRow.get( 담당자 ) ) ) arr2MetaTermUp = ma2MetaTermUp.get( arrATRow.get( 담당자 ) );
            
            // 생성문서 Template 생성
            for( int iCol = 0; iCol < 21; iCol++ ) arrMetaTermUpRow.add( "" );  // 21개 항목
            
                // No
                String strNo = ( arr2MetaTermUp.size() + 1 ) + "";
                
                // 논리명기준구분
                String strTermKorDiv = "";
                for( int k = 단어분할시작; k < arrATRow.size(); k++ ) {
                    if( !arrATRow.get( k ).isEmpty() ) {
                        if( strTermKorDiv.isEmpty() ) strTermKorDiv += arrATRow.get( k );
                        else strTermKorDiv += ";" + arrATRow.get( k );
                    }
                }
                
                ArrayList<String> arrMetaDmn = maMetaDmn.get( arrATRow.get( 1 ) );  // 도메인정보 매핑
                String strTmp = "";
                
                if( strTermKorDiv.lastIndexOf( ";" ) >= 0 ) {
                    strTmp = strTermKorDiv.substring( strTermKorDiv.lastIndexOf( ";" ) );
                    if( strTmp.equals( ";" + arrMetaDmn.get(0) ) ) strTermKorDiv = strTermKorDiv.substring( 0, strTermKorDiv.lastIndexOf( ";" ) );
                }
                
                // 물리명기준구분
                String strTermEngDiv = "";
                String[] saTEng = arrATRow.get( T물리명 ).split( "\\_" );
                for( int k = 0; k < saTEng.length; k++ ) {
                    if( strTermEngDiv.isEmpty() ) strTermEngDiv += saTEng[k];
                    else strTermEngDiv += ";" + saTEng[k];
                }
                
            // DATA Setting
            arrMetaTermUpRow.set(  0, strNo             );  // No. 
            arrMetaTermUpRow.set(  1, arrATRow.get(1)   );  // 선택
            arrMetaTermUpRow.set(  2, "신규/변경"       );  // 요청구분(*)
            arrMetaTermUpRow.set(  3, ""                );  // 등록유형
            arrMetaTermUpRow.set(  4, ""                );  // 검증결과
            arrMetaTermUpRow.set(  5, "TO-BE"           );  // 표준분류(*)
            arrMetaTermUpRow.set(  6, arrATRow.get(19)  );  // 표준용어논리명(*)
            arrMetaTermUpRow.set(  7, arrATRow.get(18)  );  // 표준용어물리명(*)
            arrMetaTermUpRow.set(  8, strTermKorDiv     );  // 논리명기준구분
            arrMetaTermUpRow.set(  9, strTermEngDiv     );  // 물리명기준구분
            arrMetaTermUpRow.set( 10, arrMetaDmn.get(0) );  // 도메인논리명
            arrMetaTermUpRow.set( 11, arrMetaDmn.get(1) );  // 도메인물리명
            arrMetaTermUpRow.set( 12, ""                );  // 도메인그룹
            arrMetaTermUpRow.set( 13, arrMetaDmn.get(2) );  // 인포타입논리명
            arrMetaTermUpRow.set( 14, arrATRow.get(20)  );  // 데이터타입
            arrMetaTermUpRow.set( 15, arrATRow.get(21)  );  // 길이
            arrMetaTermUpRow.set( 16, arrATRow.get(22)  );  // 소수점
            arrMetaTermUpRow.set( 17, "아니요"          );  // 암호화여부
            arrMetaTermUpRow.set( 18, arrATRow.get(25)  );  // 설명(*)
            arrMetaTermUpRow.set( 19, ""                );  // 요청일시
            arrMetaTermUpRow.set( 20, ""                );  // 요청자명
            
            arr2MetaTermUp.add( arrMetaTermUpRow );
            ma2MetaTermUp.put( arrATRow.get( 담당자 ), arr2MetaTermUp );
        }
        
        // META 등록문서 출력
        String strTitle = "No, 선택, 요청구분(*), 등록유형, 검증결과, " + 
                          "표준분류(*), 표준용어논리명(*), 표준용어물리명(*), 논리명기준구분, 물리명기준구분, " +
                          "도메인논리명, 도메인물리명, 도메인그룹, 인포타입논리명, 데이터타입, " +
                          "길이, 소수점, 암호화여부, 설명(*), 요청일시, 요청자명";
        
        for( String strKey : ma2MetaTermUp.keySet() ) {
            XlsFile.writeArr2( "C:/workspace/컬럼매핑정의서/결과_프로그램/META_표준용어_등록문서_" + strKey , strTitle, ma2MetaTermUp.get( strKey ) );
        }
    }

 

private static void createMetaTerm( ArrayList<ArrayList<String>> arr2AT ) {

인자로 받는 arr2AT는 '컬럼매핑정의서를 2차원배열 형태로 읽은 정보'입니다.

 

if( !arrATRow.get( 상태 ).equals( "미등록 용어" ) || arrATRow.get( 담당자 ).equals( "기타" ) ) continue;

[상태] [담당자] 등은 컬럼매핑정의서 배열Index값인데, 가독성을 위해 '상수Const'로 한글명을 명시한것 입니다.

 

몇 년전에 K은행 프로젝트를 할때, 담당고객이 한 질문이 기억나네요.

    "왜 테이블과 컬럼의 물리명을 '영문'으로 써요? 그냥 한글로 하면 되지 않나요?"

 

실제 K은행의 물리모델은 한글명을 사용하고 있었습니다.

그 말을 듣고 보니 변수도 그렇고, 테이블도 그렇고 모두 한글을 지원하는데, 왜 영문으로만 쓰고 있을까요?

 

여튼, 여기서는 가독성을 위해 한글로 명시한 것이며, 실제로는 배열의 Index값입니다.

 

// 논리명기준구분
String strTermKorDiv = "";
for( int k = 단어분할시작; k < arrATRow.size(); k++ ) {
    if( !arrATRow.get( k ).isEmpty() ) {
        if( strTermKorDiv.isEmpty() ) strTermKorDiv += arrATRow.get( k );
        else strTermKorDiv += ";" + arrATRow.get( k );
    }
}

논리명/물리명기준구분이 있습니다.

META표준용어의 물리명은 [단어]와 [단어]를 '_'로 연결하여 사용합니다.

Ex) 한글고객명 : KOR_CUS_NM

 

그런데, META를 등록하기 위해서 '논리/물리명기준구분'을 사용하는데, 이것은 [단어]들의 구분입니다.

META시스템을 사용해 보시면 아시겠지만, [단어분할]을 하면 ';'으로 단어를 구분합니다.

Ex) 한글고객명 : KOR;CUS;NM

 

 그래서, 물리명을 ';'로 분할하여 세팅하는 로직입니다.

 

※ 참고

    - 링크 ☞ 2차원배열 형태로 텍스트파일 읽기

 

끝.

반응형