DA(Data Architecture) 도구/데이터 표준점검 도구

데이터 표준점검 도구_4.별첨

ProDA 2021. 6. 19.

이 글은 새로운 블로그로 옮겼습니다. 5초후 자동으로 이동합니다.

▶ 새로운 블로그 주소: https://prodskill.com/

▶ 새로운 글 주소: https://prodskill.com/data-standard-checker-5-appendix/

목차


    이전 글에서 이어지는 내용이다.

    2021.06.13 - [엑셀 & VBA/Tools] - 데이터 표준점검 도구_3.표준점검 케이스

     

    데이터 표준점검 도구_3.표준점검 케이스

    목차 이전 글에서 이어지는 내용이다. 2021.06.13 - [엑셀&VBA/Tools] - 데이터 표준점검 도구_2.3.표준사전 구성 데이터 표준점검 도구_2.3.표준사전 구성 목차 이전 글에서 이어지는 내용이다. 2021.06.06 -

    prodtool.tistory.com


    4. 별첨

     

    4.1. 속성명의 숫자 Suffix에 대한 처리

    속성명에 숫자 Suffix(후위 숫자)가 있는 경우 그 숫자는 제외하고 표준용어사전 또는 표준단어사전을 탐색한다. 숫자 Suffix는 찾아진 표준용어 또는 표준단어 조합의 결과 뒤에 추가된다.

    속성명의 숫자 Suffix에 대한 처리
    속성명의 숫자 Suffix에 대한 처리

    위 그림에서 속성 "개인대상여부1"의 물리명은 "PERSN_TGT_YN1"로 생성된다. 속성명 종결어는 정상적으로 "여부"로 식별하였다.

    속성명의 숫자 Suffix에 대한 처리 로직은 다음과 같다.

    • 점검대상 속성명의 뒤로부터 연속된 숫자(a)만 찾아서 보관하고 그 숫자를 삭제하고 점검
    • 점검결과 “표준단어 논리명 조합”, “표준단어 물리명 조합”에 보관한 숫자 a를 우측에 붙임

     

    4.2. 표준단어사전 Simulation 방법

    단어물리명이 정해지지 않은 상태에서 입력 속성명에 대한 단어 조합이 성공하는지, 즉 표준용어로 등록할 수 있는 지를 확인해 보기 위하여, “표준단어사전” sheet에 논리명을 등록하고 물리명은 “(” + 논리명 + “)” 로 구성하여 simulation 할 수 있다. 이 경우, 표준점검결과의 "표준단어 물리명 조합" 항목은 초록색으로 표시된다.

    표준단어사전 Simulation 방법
    표준단어사전 Simulation 방법

    표준점검결과에서 "단어사전에 추가" 버튼을 클릭하면 "추가 후보단어" 전체에 대하여 각 단어의 물리명을 “(” + 논리명 + “)” 로 만들어서 단어사전에 추가한다. 이미 등록되어 있는 단어는 추가하지 않는다.

    덧붙여서, 단어의 물리명 약어를 자동으로 생성하려면, 이 VBA 프로젝트에 포함된 사용자 함수 "약어생성"을 사용할 수 있다. 함수의 소스코드는 다음과 같다.

    Public Function 약어생성(aFullName As String, Optional aMaxSize = 4) As String
        Dim sFullName As String, sAbbName As String
        Dim i As Integer
        
        '영문 Full Name 중에 포함된 '-' 는 공백으로 변경하여 처리한다.
        sFullName = Trim(Replace(aFullName, "-", " "))
        
        '/* 영문 Full Name이 숫자로 시작하는 경우 단어 순서를 변경한다. (첫번째, 두번째 단어 순서만 변경) */
        Select Case Mid(sFullName, 1, 1)
            Case "0" To "9"
                sFullName = Trim(단어순서변경(sFullName))
        End Select
    
        sFullName = StrConv(sFullName, vbProperCase)
        sFullName = Replace(sFullName, "A ", "")
        sFullName = Replace(sFullName, "An ", "")
        sFullName = Replace(sFullName, "The ", "")
    
        If InStr(1, sFullName, " ") = 0 Then '/* 영문FullName이 하나의 단어일 경우*/
            If Len(sFullName) <= 4 Then '/* 영문FullName의 길이가 4 이하 일 경우 */
                sAbbName = sFullName
            Else
                '/* 영문FullName의 4자 이후 단어들이 모두 모음인 경우 - 앞 4자리 단어를 축약어로 사용 */
                If 모음제거(Mid(sFullName, 5)) = "" Then
                    sAbbName = Mid(sFullName, 1, 4)
                Else
                    sAbbName = Mid(sFullName, 1, 1) + 모음제거(Mid(sFullName, 2))   '-- 모음시작 단어 첫모음 살림
                    '/* 축약 결과 길이제한 : 최대 aMaxSize 자리까지 */
                    If Len(sAbbName) > aMaxSize Then
                        sAbbName = Mid(sAbbName, 1, aMaxSize)
                    End If
                End If
    
            End If
        Else '/* 영문FullName이 여러 단어로 구성되어 있을 경우 */
            Dim iBlankCnt As Integer
            iBlankCnt = Len(sFullName) - Len(Replace(sFullName, " ", ""))
    
            '각 단어 첫글자
            sAbbName = sFullName
    
            Dim iPos As Integer, sChar As String, sAbbTmp As String
            If iBlankCnt = 1 Then '/* 단어수가 2개인 경우 - 각 단어의 시작 2글자 조합으로 생성 */
                sAbbName = 모음제거(sAbbName)
                i = InStr(1, sAbbName, " ") + 1
                sAbbName = UCase(Left(sAbbName, 2) + Mid(sAbbName, i, 2))
            ElseIf iBlankCnt <= 4 Then '/* 단어수가 4개 이하인 경우 - 첫글자 조합으로 생성 */
                 For iPos = 1 To Len(sAbbName)
                    sChar = Mid(sAbbName, iPos, 1)
                    If (sChar >= "A" And sChar <= "Z") Or (sChar >= "0" And sChar <= "9") Then
                        sAbbTmp = sAbbTmp + sChar
                    End If
                    If Len(sAbbTmp) >= aMaxSize Then GoTo Exit_For1
                 Next iPos
    Exit_For1:
                 sAbbName = sAbbTmp
            Else
                '/* 단어의 길이가 최대 허용자리수 이하인 경우 - 그대로 사용 */
                If Len(Replace(sFullName, " ", "")) <= aMaxSize Then
                    sAbbName = UCase(Replace(sFullName, " ", ""))
                Else
                    Dim sInText As String
                    sInText = 등위접속사정리(UCase(sFullName))
                    '/* 등위접속사가 존재하면 첫글자들로 구성 */
                    If sInText <> sFullName Then
                        sAbbName = 모음제거(sInText)
                        For iPos = 1 To Len(sAbbName)
                            sChar = Mid(sAbbName, iPos, 1)
                            If (sChar >= "A" And sChar <= "Z") Or (sChar >= "0" And sChar <= "9") Then
                                sAbbTmp = sAbbTmp + sChar
                            End If
                            If Len(sAbbTmp) >= aMaxSize Then GoTo Exit_For2
                        Next iPos
    Exit_For2:
                        sAbbName = sAbbTmp
                    Else
                        '/* 두단어로 구성된 경우, 각각의 단어에서 앞 2자리 문자를 가지고 약어 생성 */
                        Dim iUnitLen As Integer, aWordArray() As String, sWord As String
                        iUnitLen = 2
                        aWordArray = Split(sFullName)
                        For iPos = 0 To UBound(aWordArray)
                            sWord = aWordArray(iPos)
                            If Len(sWord) = iUnitLen Then
                                sAbbTmp = sAbbTmp + sWord
                            Else
                                If 모음제거(Mid(sWord, iUnitLen + 1)) = "" Then
                                    sAbbTmp = sAbbTmp + Mid(sWord, 1, iUnitLen)
                                Else
                                    sAbbTmp = sAbbTmp + Mid(Mid(sWord, 1, 1) + 모음제거(이중자음정리(Mid(sWord, 2))), 1, iUnitLen)
                                End If
                            End If
                        Next
                        sAbbName = sAbbTmp
                    End If
                End If
    
            End If
    
        End If
        약어생성 = UCase(sAbbName)
    End Function

     

     

    4.3. 표준점검대상 속성의 참조정보 설명

    표준화 작업중에 속성명을 변경하거나, 데이터 타입/길이가 변경된다. 변경전 속성명, 컬럼명, 데이터타입/길이 등의 참조정보나 표준화 작업중 메모등을 관리할 항목이 필요하다.

    “속성명 표준화” sheet 표준점검결과 우측 부분에 표준점검결과 추가 정보와 각 속성명에 필요한 추가 참조 정보를 관리할 수 있는 항목을 만들어 두었다. 참조 정보는 사용자가 필요한 항목을 추가할 수 있다.

    표준점검대상 속성의 참조정보
    표준점검대상 속성의 참조정보

    ▼ 표준점검 추가 정보

    • 물리명 Length: 표준점검결과로 생성된 물리명의 길이. 물리명 최대길이 옵션 설정에 따라 조건부서식으로 최대길이(예: 26)를 초과하는 Cell의 배경색을 붉은 색으로 표시
    • 단어 수: 표준점검결과로 생성된 물리명의 조합단어 수
    • _개수: 표준점검결과로 생성된 물리명의 ‘_’ 문자 수
    • 속성명 CNT: 입력한 속성명의 수(중복 입력한 속성명이 있는 경우, 즉 속성명 CNT가 2이상인 경우 Cell의 배경색을 붉은 색으로 표시)

    ▼ 추가 참조 정보

    • 변경전 속성명: 속성명을 표준점검하기 전에 최초 입력한 속성명.
      • 자동으로 설정되지는 않고, 속성명의 목록을 작성한 다음 사용자가 직접 복사&붙여넣기하여 설정.
      • 표준점검을 여러 번 실행하면서 속성명을 변경하는 경우에 원래 입력한 속성명이 무엇인지를 확인하기 위한 용도이며, 가급적 사용을 권장함
    • 변경후 속성명: 현재 속성명(수식으로 자동 설정)
    • As-Is 속성명: 입력한 속성명의 As-Is 속성명(As-Is 추적을 위해 필요)
    • As-Is 컬럼명: 입력한 속성명의 As-Is 컬럼명(As-Is 추적을 위해 필요)
    • As-Is DataType: 입력한 속성명의 As-Is Data Type(As-Is 추적을 위해 필요)
    • 속성명 변경 여부: 변경전 속성명과 변경후 속성명을 비교하여 변경된 경우에 “O”로 표시
    • 확인 필요 사항: 표준점검 작업중에 확인 필요한 사항 등을 자유롭게 기록하여 활용
    • 그외(필요시 추가): "확인 필요 사항” 우측으로 열을 추가하여 필요한 항목 관리

     

    4.4. 라이선스

    이 표준점검 도구를 필요로 하고 사용하고자 하는 이용자에게 제약을 두지 않는다. 라이선스 내용은 BSD-2 라이선스를 준용하여 간략하게 작성하였다.

    라이선스 내용
    라이선스 내용


    • 저작자: 이영민
    • 이메일: leeyoungmin@gmail.com
    • 블로그: https://prodtool.tistory.com/
    • github: https://github.com/DAToolset
    • 라이선스 내용: 기본적으로 github Repository에 명시된 BSD-2 라이선스를 따릅니다. 명시된 내용이 없는 경우 아래 내용에 따릅니다
      • 1. 저작권자 표기: 저작권자명, 이메일 주소, 블로그 주소, github repository 주소는 변경없이 그대로 사용해야 합니다. 소스코드를 변경하여 사용하는 경우 2차 저작자 관련 내용은 추가할 수 있습니다.
      • 2. 보증 부인: 이 소스코드와 도구를 사용함으로 인해 어떠한 문제가 발생하더라도 저작권자에게 책임을 물을 수 없습니다
      • 위 조건을 만족한다면, 학습/활용 등 개인적인 용도, 회사에서 업무에 이 도구를 활용하거나 소스코드를 변경하여 상용 제품에 포함하는 용도 등 모든 용도에 허용됩니다.
      • 이 라이선스 내용은 제거할 수 없습니다.
    • 일러두기
      • 2차 저작물의 소스코드를 공개하지 않아도 됩니다. 다만, 문제가 되지 않는다면 어떤 2차 저작물에 사용했는지 제게 알려주시면 좋겠네요. 이메일로 보내주시거나 블로그 댓글로 남겨 주시면 됩니다.
      • 도구의 기능상 오류 또는 개선요구사항, 가이드 문서의 오류 또는 개선 요구사항 등도 이메일 또는 블로그 댓글로 알려주시기 바랍니다.

    참고로, 공개하는 도구의 라이선스는 아래 블로그 글로 공지하였다.

    https://prodtool.tistory.com/notice/19

     

    [중요] 공개하는 도구의 라이선스

    제가 공개하는 도구들은 모두 소스코드를 github에 업로드 합니다. 각 도구의 라이선스는 각 github repository에 지정된 라이선스를 따릅니다. github link: https://github.com/DAToolset DAToolset - Overview..

    prodtool.tistory.com

     

     

    4.5. VBA 코드 구성

    WorkSheet, UserForm, Module, Class 목록. 이 도구의 VBA 코드는 재사용성과 유지보수성을 향상시키고자 Module과 Class로 구성되어 있고, MVC 디자인 패턴에 따라 M(Model)은 Class로, V(View)는 엑셀 UI로, C(Control)은 Module로 적용하였다.

    VBA 코드 구성
    VBA 코드 구성

    ▼ Worksheet 개체

    • 프로그램 Sheet: shtRun (속성명 표준화): 속성명 표준점검을 위한 기능과 속성목록을 관리하는 Sheet
    • 데이터 Sheet: 프로그램에서 참조하는 Sheet: 표준단어사전, 표준용어사전, 표준도메인사전

    ▼ 폼 개체

    • frmAbout: “About...” 버튼을 클릭할 때 보여지는 Form. 안내문구를 포함하고 있음

    ▼ 모듈 개체

    • modControlStd: 표준점검결과 생성, 후보단어 추가 등 표준점검 관련 기능
    • modTest: Test 코드
    • modUtil: 공통기능(로깅, 서식설정, Suffix 제거 등)
    • mod약어생성: 단어의 영문 Full Name과 약어의 최대 자리수를 입력으로 하여 약어 생성

    ▼ 클래스 모듈 개체

    • CDBConnectionUnit: 표준 Repository DB로부터 표준단어/용어/도메인을 갱신하기 위하여 DB 접속, SQL 실행 및 결과 생성 기능등을 제공하는 클래스
    • CStdDomain: 표준도메인 1개 단위의 클래스
    • CStdDomainDic
      • 표준도메인 목록을 Dictionary 구조(Key-Value)로 탐색하기 위한 클래스
      • Key: 도메인 분류명
      • Value: 해당 도메인 분류명의 도메인 Collection
    • CStdTerm: 표준용어 1개 단위의 클래스
    • CStdTermDic
      • 표준용어 목록을 Dictionary 구조(Key-Value)로 탐색하기 위한 클래스
      • Key: 용어논리명
      • Value: CStdTerm 클래스의 instance
      • 표준용어사전을 읽어서 Dictionary 구조로 memory에 적재
    • CStdWord: 표준단어 1개 단위의 클래스
    • CStdWordCol: 하나의 표준단어에 대한 동음이의어 목록을 관리하기 위한 클래스
    • CStdWordDic
      • 표준단어 목록을 Dictionary 구조(Key-Value)로 탐색하기 위한 클래스
      • Key: 단어논리명
      • Value: CStdWord 클래스의 instance collection (CStdWordCol object)
      • 내부적으로 단어물리명을 Key로 하는 Dictionary를 추가로 관리함
      • 표준단어사전을 읽어서 Dictionary로 memory에 적재하는 과정에서 중복 논리명과 중복 물리명 점검

     

    4.6. 주요 VBA Class 설명 및 전체 로직 흐름 요약

    주요 Class는 표준단어사전을 관리하는 "CStdWordDic", 표준용어사전을 관리하는 "CStdTermDic", 표준도메인사전을 관리하는 "CStdDomainDic"이다. 전체 로직은 "modControlStd" 모듈의 "표준점검" 프로시저에서 처리한다.

    요약하여 살펴보면 다음과 같다.

    4.6.1. CStdWordDic 클래스

    CStdWordDic 구성
    CStdWordDic 구성

    CStdWordDic 클래스는 Dictionary type 멤버변수를 이용하여 각 표준단어의 목록을 관리한다. Key는 단어명(단어 논리명)이고, Value는 일반적인 경우 단어 개체(CStdWord type) 1개를 가진다. 단어 논리명에 중복을 허용하는 경우, 다시 말하여 동음이의어가 허용되는 경우 Value는 복수개의 단어 개체(CStdWord type)들을 보유하는 Collection 개체이다. 내부적으로는 단어 물리명을 Key로하고 단어 개체를 Value로 하는 Dictionary를 추가로 관리한다.

    동음이의어가 있다는 것을 판단하기 위해 Value 개체의 type으로 구분할지, Value 개체는 Collection으로 동일하게 하고 Collection의 item count가 1인지 2이상인지로 구분할지 고민하다가, 이미 구현되어 있는 코드의 변경을 최소화하고자 type으로 구분하도록 하였다.

    그래서, "modControlStd" 모듈의 "표준점검" 프로시저에 다음과 같은 형태의 코드가 여러 군데 나타난다.

    If TypeOf oStdWordObj Is CStdWord Then
        '논리명이 유일한 경우
        Set oStdWord = oStdWordObj
        sToken = oStdWord.m_s단어논리명
        ...
    ElseIf TypeOf oStdWordObj Is CStdWordCol Then
        '동음이의어가 있어 논리명이 2개 이상인 경우
        b동음이의어Matched = True
        ...
    End If

    Dictionary type에 대해 다음 내용을 참고하기 바란다.

    • 엑셀 VBA의 Dictionary type은 Key, Value로 구성된 HashMap 구조를 가진다.
    • 기본으로 제공되는 type이 아니며, “Microsoft Scripting Runtime” 라이브러리를 참조한 이후에 사용하거나, Object type으로 선언하고 CreateObject("Scripting.Dictionary")로 intance를 생성해서 사용한다.

     

    4.6.2. CStdTermDic 클래스

    CStdTermDic 구성
    CStdTermDic 구성

    CStdTermDic 클래스는 Dictionary type 멤버변수를 이용하여 각 표준용어의 목록을 관리한다. Key는 용어 논리명이고, Value는 용어 개체(CStdTerm type)이다. 속성 표준점검시 용어단위 일치여부를 판별하는 로직에 사용한다.

     

    4.6.3. CStdDomainDic 클래스

    CStdDomainDic 구성
    CStdDomainDic 구성

    CStdDomainDic 클래스는 Dictionary type 멤버변수를 이용하여 각 표준도메인의 목록을 관리한다. Key는 도메인분류명, Value는 도메인 Collection이다. 도메인 Collection의 item은 CStdDomain type 도메인 개체이다.

     

    4.6.4. 전체 로직 흐름 요약

    전체 로직 흐름 요약
    전체 로직 흐름 요약

    전체 로직은 모듈 modControl의 "표준점검" 프로시져에 구현되어 있다. 처리 과정을 간략하게 요약하면 다음과 같다.

    1. 표준 단어/용어/도메인 각 사전 sheet에서 데이터를 읽어 각 클래스 타입의 변수로 생성한다. 각 클래스 타입의 Load() 프로시져에 구현되어 있다.
    2. 점검대상 속성 목록을 읽어서 Variant array 에 저장한다.
    3. 점검대상 속성 각각에 대해 표준사전 key-value 구조를 이용하여 탐색하고 점검결과를 Variant type 배열에 저장한다. 처리가 끝나면 Variant type에 저장된 점검결과를 sheet에 출력한다.

     


    여기까지 데이터 표준점검 도구에 대한 설명을 마무리한다. 궁금한 점은 댓글로 남겨주시기 바란다.

    댓글

    💲 추천 글