Course B-1

[공통 코드 관리] 개발

목표

  • 이미 등록된 데이터 컴포넌트를 이용하여 두 개의 새로운 테이블을 정의하고, 가장 많이 사용되는 list-master-detail 패턴의 화면을 구성한 다음 테이블 반환 함수를 사용한 데이터 처리 과정을 이해합니다.

  • 학습 인정 시간: 5 시간

주의 사항

  • GPM에서 데이터 컴포넌트는 새로 등록하지 않고 테이블만 새로 정의합니다.

  • 이전 과정에서 진행했던 내용과 중복되거나 응용하여 해결할 수 있는 부분은 생략했습니다.

개발 화면

1. 테이블 정보

2. 모델링

2.1) 코드 그룹 정보 테이블 생성 [GPM→모델링→테이블 관리]

  • 신규 버튼 클릭 - 상위 메뉴 "EDU" 선택

  • 테이블 명 : comCodeGroup_xxx

  • 테이블 설명 : 코드 그룹 정보

2.2) 코드 세부 정보 테이블 생성 [GPM→모델링→테이블 관리]

  • 신규 버튼 클릭 - 상위 메뉴 "EDU" 선택

  • 테이블 명 : comCodeMaster_xxx

  • 테이블 설명 : 코드 세부 정보

3. 비즈니스 로직 생성

3.1) 공통 코드 관리 조회 프로시저 생성 [GPM→개발→SP편집]

  • 신규 버튼 클릭 - 상위 메뉴 "EDU" 선택

  • SP 명 : P_DEV002_xxx_Q

  • SP 설명 : 공통 코드 관리 조회

  • 테이블 탭으로 이동하여 'comCodeGroup_xxx' 테이블만 드래그 드랍하여 Parameter 탭에만 세팅 후 "SP 편집창에 적용" → "SP 생성" 순서로 처리합니다.

  • SP 정보 생성 후 SSMS 도구를 이용해 아래 쿼리를 참고하여 저장 프로시저 내용을 완성합니다.

    ----------------------------------------------------------------------------------------------------------------------- 
    -- 요약 정보
    IF @p_work_type IN ( 'list' ) 
    BEGIN
    ----------------------------------------------------------------------------------------------------------------------- 

        SELECT A.*
        FROM comCodeGroup_xxx A
        WHERE group_code LIKE '%' + @p_group_code + '%'
        AND group_name LIKE '%' + @p_group_name + '%'
        AND group_category LIKE @p_group_category + '%'
    
        SELECT @p_row_count = @@ROWCOUNT

        IF @p_row_count > 0  
            SET @p_error_code = 'MSG0001'                                -- 정상적으로 조회가 되었습니다  
        ELSE 
            SET @p_error_code = 'MSG0006'                                -- 조회된 자료가 없습니다.                 

    END -- 요약 정보 끝 
    ----------------------------------------------------------------------------------------------------------------------- 

    ----------------------------------------------------------------------------------------------------------------------- 
    -- 상세 정보
    IF @p_work_type IN ( 'detail' ) 
    BEGIN
    ----------------------------------------------------------------------------------------------------------------------- 

        SELECT A.*
        FROM comCodeMaster_xxx A
        WHERE group_code = @p_group_code

        SELECT @p_row_count = @@ROWCOUNT

        IF @p_row_count > 0  
            SET @p_error_code = 'MSG0001'                                -- 정상적으로 조회가 되었습니다  
        ELSE 
            SET @p_error_code = 'MSG0006'                                -- 조회된 자료가 없습니다.                 

    END -- 상세 정보 끝 
    -----------------------------------------------------------------------------------------------------------------------

3.2) 공통 코드 관리 저장용 프로시저 생성 [GPM→개발→SP편집]

  • 신규 버튼 클릭 - 상위 메뉴 "EDU" 선택

  • SP 명 : P_DEV002_xxx_S

  • SP 설명 : 공통 코드 관리 저장

  • 조회용 프로시저와 마찬가지로 아래 사진과 같이 Parameter 탭에만 세팅 후 "SP 편집창에 적용" → "SP 생성" 순서로 처리합니다.

4. 저장용 프로시저 완성

4.1) 파라미터 수정

4.2) 테이블 변수 처리

  • 하나의 문자열로 받아온 여러 행(Row)에 대한 각 필드별 값을 파싱하여 테이블 형태로 보관하기 위해 변수를 정의합니다.

  • 테이블 반환 함수 "SplitTableNVarchar"를 사용해 테이블 변수(@tb_comCodeMaster_xxx)에 데이터를 삽입합니다.

4.3) 작업 타입: 신규 (@p_work_type = 'N')

  • 신규 저장은 새로운 그룹 코드(group_code)에 대한 세부 코드(sub_code)들을 한 번에 입력하고 저장한다는 의미입니다.

  • 입력된 그룹코드가 이미 등록된 코드인지 확인 후 comCodeGroup_xxx, comCodeMaster_xxx 테이블 순서로 데이터를 삽입합니다.

4.4) 작업 타입: 수정 (@p_work_type = 'U')

  • 처리하려는 세부 코드 대상 중 신규(row_status='N')인 데이터의 중복 여부를 확인합니다.

  • comCodeGroup_xxx 테이블의 데이터 수정 → comCodeMaster_xxx 테이블의 데이터 삭제 → 수정 → 삽입 순서로 처리합니다.

4.5) 작업 타입: 삭제 (@p_work_type = 'D')

  • 삭제는 그룹 코드(group_code)에 대한 삭제를 의미하므로 comCodeGroup_xxx, comCodeMaster_xxx 두 테이블에 전달받은 그룹 코드 파라미터(@p_group_code)로 등록된 모든 데이터를 삭제합니다.

5. 화면 개발

5.1) 폼 생성 [Visual Studio→도구→GPM Tools]

5.2) 화면 디자인

  • 디자인 리스트를 아래 사진처럼 구성하고 "디자인 적용" 버튼을 누른 다음 [개발 화면]의 이미지를 참고하여 컨트롤을 재배치 합니다.

5.3) 컨트롤 배치

  • [개발 화면]과 같이 화면 구성과 컨트롤들을 배치합니다.

6. 기능 구현

저장 프로시저를 처리하는 코드 패턴은 폼 템플릿에 미리 작성되어 있는 #region [예시 코드]를 참고합니다.

6.1) 조회용 프로시저 실행 메서드 [Func_P_DEV001_xxx_Q]

private bool Func_P_DEV002_xxx_Q(string workType)
{
    string groupCode = string.Empty;
    string groupName = string.Empty;
    string groupCategory = string.Empty;

    if (workType.Equals("list"))
    {
        groupCode = txtGroup_code.Text;
        groupName = txtGroup_name.Text;
        groupCategory = cboGroup_category.EditValue?.ToString() ?? string.Empty;
    }
    else if (workType.Equals("detail"))
    {
        groupCode = gvwList.GetValue("group_code")?.ToString() ?? string.Empty;
    }

    try
    {
        P_DEV002_xxx_Q procInfo = new P_DEV002_xxx_Q();

        procInfo.AddParamData(
            workType,
            groupCode,
            groupName,
            groupCategory);

        ResultSet result = ExecuteProcedure(procInfo);

        if (workType.Equals("list"))
        {
            SetData(grdList, result?[0]);
        }
        else if (workType.Equals("detail"))
        {
            SetData(grdDetail, result?[0]);
        }

        return result?.IsSuccess ?? false;
    }
    catch (Exception ex)
    {
        ShowErrorMessageBox(ex);
        return false;
    }
}

6.2) 저장용 프로시저 실행 메서드 [Func_P_DEV001_xxx_S]

  • ParameterBuilder에 대한 자세한 내용은 [기능 문서]를 확인바랍니다.

private bool Func_P_DEV002_xxx_S(string workType)
{
    if (!ValidateControls(grpMaster))
        return false;

    string groupCode = txtGroup_code1.Text;
    string groupName = txtGroup_name1.Text;
    int codeLength = Convert.ToInt32(numCode_length.Value);
    string category = cboGroup_category1.EditValue?.ToString() ?? string.Empty;

    string fieldCaption1 = txtField_caption1.Text;
    string fieldCaption2 = txtField_caption2.Text;
    string numCaption1 = txtNumref_caption1.Text;
    string numCaption2 = txtNumref_caption2.Text;

    string useYN = chkUse_yn.EditValue?.ToString() ?? string.Empty;
    string memo = memoMemo.Text;

    ParameterBuilder paramBuilder = new ParameterBuilder();

    if (!workType.Equals("D"))
    {
        DataTable datas = BindingData(grdDetail);

        if (datas == null)
            return false;
            
        foreach (DataRow row in datas.Rows)
        {
            paramBuilder.Append(row, "row_status");
            paramBuilder.Append(row, "sub_code");
            paramBuilder.Append(row, "code_name");
            paramBuilder.Append(row, "system_yn");
            paramBuilder.Append(row, "extra_field1");
            paramBuilder.Append(row, "extra_field2");
            paramBuilder.Append(row, "numref1");
            paramBuilder.Append(row, "numref2");
            paramBuilder.Append(row, "sort_seq");
            paramBuilder.Append(row, "use_yn");
        }
    }

    try
    {
        P_DEV002_xxx_S procInfo = new P_DEV002_xxx_S();

        procInfo.AddParamData(
            workType,
            groupCode,
            groupName,
            codeLength,
            category,
            fieldCaption1,
            fieldCaption2,
            numCaption1,
            numCaption2,
            useYN,
            memo,
            SessionInfo.UserId,
            $"{GetClientPCName()}/{GetIPAddress()}",
            paramBuilder.GetParameter("row_status"),
            paramBuilder.GetParameter("sub_code"),
            paramBuilder.GetParameter("code_name"),
            paramBuilder.GetParameter("system_yn"),
            paramBuilder.GetParameter("extra_field1"),
            paramBuilder.GetParameter("extra_field2"),
            paramBuilder.GetParameter("numref1"),
            paramBuilder.GetParameter("numref2"),
            paramBuilder.GetParameter("sort_seq"),
            paramBuilder.GetParameter("use_yn"));

        ResultSet result = ExecuteProcedure(procInfo);

        if (!workType.Equals("D"))
        {
            _FindRowValue = result?.ReturnString;
        }

        return result?.IsSuccess ?? false;
    }
    catch (Exception ex)
    {
        ShowErrorMessageBox(ex);
        return false;
    }
}

6.3) 테이블의 기본 키에 대한 수정 제한 처리

  • 테이블의 기본키인 [기본 정보] 영역에 '그룹 코드(group_code)'는 신규로 등록하는 상태에서만 입력이 가능하도록 합니다.

  • GridView를 통해 입력받는 '세부 코드(sub_code)'는 GridColumn 속성을 통해 처리하는데, 필수로 값을 입력 받기 위해 AllowBlank 속성을 false로 설정하고, ColumnOperation 속성의 값을 ColumnLock으로 지정하여 새로 추가된 행(Row)일 때만 입력이 가능하도록 합니다.

  • 참고) GridColumn에 설정된 AllowBlank 속성에 대하여 값 입력 확인은 BindingData 메서드에서 수행합니다.

6.4) 조회 조건 영역의 초기화 버튼 기능

  • [GPM Tools→기본값 설정]에서 조회 조건 기본값 설정 정보를 등록하고 기능을 구현합니다.

6.5) 저장 시 작업 타입(workType) 판단 방법 수정 수정

  • "그룹 코드" 컨트롤(txtGroup_code1)의 ReadOnly 속성의 값이 true이면 수정 상태, false이면 신규 상태로 판단하여 신규 상태일 때 "N"으로, 수정 상태일 때 "U"로 전달합니다.

public override void ClickSaveButton()
{
    if (Func_P_DEV002_xxx_S(txtGroup_code1.ReadOnly ? "U" : "N"))
    {
        ClickRetrieveButton();
    }
}

7. 체크 리스트

  • 검색 / 신규→저장 / 수정→저장 / 삭제 기능이 올바르게 동작하는지 확인합니다.

  • 그룹 코드는 신규 시에만 수정이 가능한지 확인합니다.

  • 저장 시 [기본정보]영역에 필수 입력 항목 체크가 정확히 이루어지는지 확인합니다.

  • 저장 시 [상세정보]영역에 필수 입력 항목 체크가 정확히 이루어지는지 확인합니다.

  • [요약정보]영역과 [상세정보]영역에 데이터 건 수 집계가 제대로 표현되는지 확인합니다.

  • 이미 등록된 그룹 코드(group_code)와 동일한 코드를 신규로 등록했을때 설정한 SP메시지가 제대로 출력되는지 확인합니다.

  • 이미 등록된 세부 코드(sub_code)와 동일한 코드를 신규로 등록했을때 설정한 SP메시지가 제대로 출력되는지 확인합니다.

  • 이미 등록된 세부 코드(sub_code)에 대하여 수정이 되지 않도록 설정되었는지 확인합니다.

  • 조회 조건 영역의 초기화 버튼 기능이 정상 동작하는지 확인합니다.

  • [요약정보]영역의 GridView의 행을 선택하고 Alt+F2 키를 눌러 등록 정보, 수정 정보가 정상 표현되는지 확인합니다.

Last updated

Was this helpful?