2015년 7월 27일 월요일

C# WebForm : 사용자 관리 (3) : 사용자 등록 페이지 - BeHind Code (2)

이전에는 BeHind Code 의 기본 틀을 만들었으니, 이제 BizLayer 의 기본 틀을 만든다.


"Site.FrameWork" 에 "BizBase" 클래스를 등록한 다음...


대충 요런식으로 데이터를 등록.

[BizBase.cs]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;
using Site.Dac;
using Site.FrameWork.Common;

namespace Site.FrameWork.BaseClass
{
    public class BizBase : IDisposable
    {
        SqlConnection connection = new SqlConnection(Config.connectionString);

        // DB 연결
        public void DBCon()
        {
            if ((connection == null) || (connection.State == ConnectionState.Closed))
            {
                connection.Open();
            }
        }

        // DB 연결 종료
        public void DBClose()
        {
            if ((connection != null) && (connection.State != ConnectionState.Closed))
            {
                connection.Close();
                connection.Dispose();
                connection = null;
            }
        }

        #region DB Execute Func. --------------
        public cReturnValue.iReturnValue ExecuteNonQuery(CommandType commandType, String commandText, params SqlParameter[] parameters)
        {
            cReturnValue.iReturnValue iReVal = new cReturnValue.iReturnValue();
            iReVal.Result = 0;
            iReVal.Message = "";

            SqlCommand command = connection.CreateCommand();
            command.Connection = connection;
            command.CommandType = commandType;
            command.CommandText = commandText;

            foreach (SqlParameter parameter in parameters)
            {
                command.Parameters.Add(parameter);
            }

            try
            {
                iReVal.Result = command.ExecuteNonQuery();
                iReVal.Message = null;
            }
            catch (Exception ex)
            {
                iReVal.Result = -1;
                iReVal.Message = ex.Message;
            }
            finally
            {
                command.Dispose();
                command = null;
            }

            return iReVal;
        }
        #endregion

        #region IDisposable 멤버
        public void Dispose()
        {
            DBClose();
        }
        #endregion
    }
}


BizBase 는 BizLayer 클래스가 공통적으로 사용하는 모듈들이 등록되는데, 일반적으로 BizLayer 는 DB 처리를 주로 하게 되므로, DB Connection / Close 를 기본적으로 처리하게끔 구성.

BizBase 에 "IDisposable" 속성이 지정되어 있는데, 이건 DB Close 를 반드시 하기 위해 지정해놓은것. (IDisposable 가 지정되어 있으면, Dispose() 함수가 반드시 생성되어 있어야 하므로, 여기에 DB Close 를 구현.)

아직까지는 "Insert" 기능만 구현하므로, ExecuteNonQuery() 만 구현해놨음.

이렇게 BizBase 가 생성되었으면,


"BizLayer" 솔루션 폴더에 "Site.Biz" 라는 클래스 라이브러리를 하나 생성하고...


"Site.Dac", "Site.FrameWork" 를 참조로 등록해 줌.


그리고, "MemberBiz" 라는 클래스를 하나 생성. (명칭은 마음대로)
요게 실질적으로 데이터를 처리할 로직이 위치할 클래스.

일단 사용자 정보를 담을 구조체를 하나 생성해 놓음.
그리고, 처음으로 구현할 내용인 사용자 정보 등록 기능은 "Insert" 를 하나 생성.
자세한 구현 내용은 나중에 보도록 하고...


여기에 "Site.FrameWork.BaseClass" 를 참조로 등록하고, BizBase 를 상속받게 해 놓으면, BizBase 에 구현 되어 있는 항목을 사용할 수 있음.

즉... BizBase 에 "ExecuteNonQuery" 라는 기능을 구현해 놓으면...


MemberBiz 에서...


이렇게 BizBase 에서 구현된것을 갖다 쓸수 있음.
궂이 저렇게 BizBase 를 생성하지 않고, 각 Biz 단에서 각각 모든 처리를 하겠다면 BizBase 는 생략해도 됨.
이건 어디까지나, 공통적으로 많이 쓰이니 한곳에 모아 놓았을 뿐...
(원래 원칙대로 하자면, 저 BizBase 에 있는 쿼리 처리 부분은 원칙적으로 DacLayer 에 DB 처리 모듈로 별도로 구현해 놓는게 맞음 (DB 처리 부분이니, Db Access Layer 에 있는게 맞긴함...) ... 나의 경우는 이게 손에 익어서 이렇게 하는 것일 뿐... 뭐, 그냥 원칙상 그렇다는 거지 여기 있든 저기 있든 별 상관없음.)

그리고, 사용자 정보를 등록하는 저장 프로시저를 작성 한다.


데이터 베이스 프로젝트에 파일 하나 생성하고...

[P_MEMBER_MemberInfo_INSERT01.sql]

IF (OBJECT_ID ('[dbo].[P_MEMBER_MemberInfo_INSERT01]', 'P') IS NOT NULL)
BEGIN
    DROP PROCEDURE [dbo].[P_MEMBER_MemberInfo_INSERT01];
END
GO

/*
** Description: 1.회원 데이터를 조회한다.
** Author:  Son10001
** Create date: 2015-07-15
** Sample: Exec [P_MEMBER_MemberInfo_INSERT01]
*/

CREATE PROCEDURE [dbo].[P_MEMBER_MemberInfo_INSERT01]
(
    @strLoginID Varchar(128), 
    @strGroup Varchar(128), 
    @strLoginPwd Varchar(128), 
    @strLoginName Varchar(128), 
    @strEmail Varchar(128), 
    @strBirthday Varchar(128), 
    @strHomePost Varchar(128), 
    @strHomeAddr1 Varchar(128), 
    @strHomeAddr2 Varchar(128), 
    @strHomeTel Varchar(128), 
    @strMobile Varchar(128), 
    @intVisit int, 

    @strSignIP Varchar(128), 
    @dateSignDate Varchar(128), 
    @strRegID Varchar(128), 
    @dateRegDate Varchar(128), 
    @strModID Varchar(128), 
    @dateModDate Varchar(128)
)
AS

INSERT INTO T_MEMBER_LIST 
(
    strLoginID, strGroup, strLoginPwd, strLoginName, strEmail, strBirthday, 
    strHomePost, strHomeAddr1, strHomeAddr2, strHomeTel, strMobile, 
    intVisit, strSignIP, dateSignDate
) 
Values 
(
    @strLoginID, @strGroup, @strLoginPwd, @strLoginName, @strEmail, @strBirthday, 
    @strHomePost, @strHomeAddr1, @strHomeAddr2, @strHomeTel, @strMobile, 
    @intVisit, @strSignIP, @dateSignDate
) 


쿼리를 작성하고, 소스 상에서 마우스 오른쪽 버튼을 클릭해 "실행" 해서...


저장 프로시져를 생성.

이제 기본 틀은 다 만들었으니, 이제 순서대로 데이터를 처리할 로직을 진행하면 된다.

WebLayer 에서 데이터를 모아 -> BizLayer 에 데이터를 전달 -> DacLayer 에서 데이터 처리 -> 결과를 BizLayer 에 전달 -> 결과를 WebLayer 에 표시

이런 순서를 거치면 된다.


Write 버튼을 클릭하면...

WebLayer 인 "MemberEntry.aspx" 에서 "MemberBiz" 를 생성하고, "insert" 를 호출.
"CollectData()" 는 "MemberBiz" 에 선언되어 있는 Member 구조체 형태로 입력값을 만들어 주는 함수다.

"MemberEntry.aspx" 하단에 이렇게 정의되어 있음.

[MemberEntry.aspx]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Site.FrameWork.BaseClass;
using Site.FrameWork.Common;

public partial class web_member_MemberEntry : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void btnInsert_Click(object sender, EventArgs e)
    {
        cReturnValue.bReturnValue bReValue = fnCheckVal();

        if (bReValue.Result.Equals(false))
        {
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "SysMessage", "alert('" + bReValue.Message + "')", true);
            return;
        }

        if (strLoginPwd.Text.Trim() == "")
        {
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "SysMessage", "alert('비밀번호를 지정해 주십시오.');", true);
            return;
        }

        bReValue.Result = false;
        bReValue.Message = "";

        // Biz  생성
        using (Site.Biz.MemberBiz biz = new Site.Biz.MemberBiz())
        {
            bReValue = biz.Insert(this.CollectData());

            if (!bReValue.Result)              // 그룹 등록
            {
                ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "SysMessage", "alert('" + bReValue.Message.Replace("'", "\\'").Replace("\r\n", "\\r\\n") + "')", true);
                return;
            }
        }

        ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "SysMessage", "alert('등록 하였습니다.')", true);
    }

    private Site.Biz.MemberBiz.MemInfo CollectData()
    {
        Site.Biz.MemberBiz.MemInfo info = new Site.Biz.MemberBiz.MemInfo();

        info.strLoginID = strLoginID.Text;
        info.strGroup = "";
        info.strLoginPwd = strLoginPwd.Text;
        info.strLoginName = strLoginName.Text;
        info.strEmail = strEmail.Text;
        info.strBirthday = strByear.Text + strBmonth.Text + strBday.Text;
        info.strHomePost = strHomePost1.Text + strHomePost2.Text;
        info.strHomeAddr1 = strHomeAddr1.Text;
        info.strHomeAddr2 = strHomeAddr2.Text;
        info.strHomeTel = strMobile1.Text + "-" + strMobile2.Text + "-" + strMobile3.Text;
        info.strMobile = strMobile1.Text + "-" + strMobile2.Text + "-" + strMobile3.Text;
        info.intVisit = 0;

        info.strSignIP = "";
        info.dateSignDate = "";
        info.strRegID = "";
        info.dateRegDate = "";
        info.strModID = "";
        info.dateModDate = "";

        return info;
    }

    private cReturnValue.bReturnValue fnCheckVal()
    {
        cReturnValue.bReturnValue bReVal = new cReturnValue.bReturnValue();
        bReVal.Result = true;
        bReVal.Message = "";

        if (strLoginID.Text.Trim() == "")
        {
            bReVal.Result = false;
            bReVal.Message = "사용자 아이디를 지정해 주십시오.";
            return bReVal;
        }

        if (strLoginPwd.Text.Trim() != strLoginPwdRe.Text.Trim())
        {
            bReVal.Result = false;
            bReVal.Message = "비밀번호 확인이 일치 하지 않습니다.";
            return bReVal;
        }

        if (strLoginName.Text.Trim() == "")
        {
            bReVal.Result = false;
            bReVal.Message = "이름을 지정해 주십시오.";
            return bReVal;
        }


        if (strByear.Text.Length != 0 && strByear.Text.Length != 4)
        {
            bReVal.Result = false;
            bReVal.Message = "출생년도를 4자리 숫자로 넣어 주십시오.";
            return bReVal;
        }
        if (strBmonth.Text.Length != 0 && strBmonth.Text.Length != 2)
        {
            bReVal.Result = false;
            bReVal.Message = "출생월을 2자리 숫자로 넣어 주십시오.";
            return bReVal;
        }
        if (strBday.Text.Length != 0 && strBday.Text.Length != 2)
        {
            bReVal.Result = false;
            bReVal.Message = "출생일을 2자리 숫자로 넣어 주십시오.";
            return bReVal;
        }

        return bReVal;

    }
}

이렇게 biz 를 호출하면, Biz 단에서 DB 에 등록함.

[MemberBiz.cs]


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

using Site.FrameWork;
using Site.FrameWork.BaseClass;
using Site.FrameWork.Common;

namespace Site.Biz
{
    public class MemberBiz : BizBase
    {
        // User 데이터
        public struct MemInfo
        {
            public int intNum;
            public string strLoginID;
            public string strGroup;
            public string strLoginPwd;
            public string strLoginName;
            public string strEmail;
            public string strBirthday;
            public string strHomePost;
            public string strHomeAddr1;
            public string strHomeAddr2;
            public string strHomeTel;
            public string strMobile;
            public int intVisit;
            public string strSignIP;
            public string dateSignDate;
            public string strRegID;
            public string dateRegDate;
            public string strModID;
            public string dateModDate;
        }

        public cReturnValue.bReturnValue Insert(MemInfo ro)
        {
            cReturnValue.bReturnValue bReVal = new cReturnValue.bReturnValue();
            bReVal.Result = true;
            bReVal.Message = "";

            string setQuery = string.Empty;

            try
            {
                DBCon();       // DB 커넥션 생성

                // item 등록
                setQuery = "P_MEMBER_MemberInfo_INSERT01";

                SqlParameter[] sqlParams = {
                            new SqlParameter("strLoginID",     SqlDbType.VarChar, 200), 
                            new SqlParameter("strGroup",     SqlDbType.Char, 4), 
                            new SqlParameter("strLoginPwd",     SqlDbType.VarChar, 20), 
                            new SqlParameter("strLoginName",    SqlDbType.VarChar, 20), 
                            new SqlParameter("strEmail",     SqlDbType.VarChar, 64), 
                            new SqlParameter("strBirthday",     SqlDbType.VarChar, 9), 
                            new SqlParameter("strHomePost",     SqlDbType.VarChar, 6), 
                            new SqlParameter("strHomeAddr1",    SqlDbType.VarChar, 64), 
                            new SqlParameter("strHomeAddr2",    SqlDbType.VarChar, 64), 
                            new SqlParameter("strHomeTel",     SqlDbType.VarChar, 14), 
                            new SqlParameter("strMobile",     SqlDbType.VarChar, 13), 
                            new SqlParameter("intVisit",     SqlDbType.Int), 
                            new SqlParameter("strSignIP",       SqlDbType.VarChar, 15), 
                            new SqlParameter("dateSignDate",    SqlDbType.VarChar, 128), 
                            new SqlParameter("strRegID",        SqlDbType.VarChar, 200), 
                            new SqlParameter("dateRegDate",     SqlDbType.VarChar, 128), 
                            new SqlParameter("strModID",        SqlDbType.VarChar, 200), 
                            new SqlParameter("dateModDate",     SqlDbType.VarChar, 128)
                        };

                sqlParams[0].Value = ro.strLoginID;
                sqlParams[1].Value = ro.strGroup;
                sqlParams[2].Value = ro.strLoginPwd;
                sqlParams[3].Value = ro.strLoginName;
                sqlParams[4].Value = ro.strEmail;
                sqlParams[5].Value = ro.strBirthday;
                sqlParams[6].Value = ro.strHomePost;
                sqlParams[7].Value = ro.strHomeAddr1;
                sqlParams[8].Value = ro.strHomeAddr2;
                sqlParams[9].Value = ro.strHomeTel;
                sqlParams[10].Value = ro.strMobile;
                sqlParams[11].Value = ro.intVisit;
                sqlParams[12].Value = ro.strSignIP;
                sqlParams[13].Value = ro.dateSignDate;
                sqlParams[14].Value = ro.strRegID;
                sqlParams[15].Value = ro.dateRegDate;
                sqlParams[16].Value = ro.strModID;
                sqlParams[17].Value = ro.dateModDate;

                cReturnValue.iReturnValue iReVal = new cReturnValue.iReturnValue();
                iReVal.Result = -1;
                iReVal.Message = "";

                iReVal = ExecuteNonQuery(CommandType.StoredProcedure, setQuery, sqlParams);

                if (iReVal.Result < 1)    // Error !!
                {
                    bReVal.Message = iReVal.Message;
                    bReVal.Result = false;
                    return bReVal;
                }

                return bReVal;
            }
            catch (Exception ex)
            {
                bReVal.Message = ex.Message;
                bReVal.Result = false;
                return bReVal;
            }
        }

    }
}


요렇게 해놓고 사이트를 빌드 한다음에 테스트 해보면...
중복된 항목을 입력했을때, DB 오류 메시지를 보여줌.
정상적으로 처리되었다면 완료 메시지를 보여줌.

실제로 등록된 데이터.