2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

[C#] 간단한 로그인 기능 만들기 with 폼에서 다른 폼으로 객체를 전달

C#에서는 어떻게 로그인 기능을 구현해야 하나..
웹에서는 세션을 사용하면 서비스 전체 전역변수 처럼 사용이 되는데 C#은 그런 개념을 잘 모르겠다..그래서 현재 시험하는 방법은 로그인 시 사용자 객체를 생성한 후, 로그인이 성공하면 그 객체를 다른 폼으로 전달하는 방법이다.
문제는 이렇게 되면 페이지마다 객체를 전달하고 확인하는 과정과, 그 객체를 잘 관리해서 메모리 누수가 생기지 않게 해야하는데...우선 만들고 보자 ㅋㅋ

먼저, 정리를 하자면 다음과 같은 3개의 파일을 만든다.
  • login_form.cs : 로그인 폼, 로그인 버튼을 클릭하면 로그인 처리를 함.
  • main_form.cs : 메인 폼, 로그인이 성공하면 표시되어 객체정보를 표시함.
  • MEMBER.cs : 멤버객체 생성 및 값을 가지고 있음, 로그인과 로그아웃 처리함.
특히, MEMBER.cs 가 중요한데, 자동으로 관리되지 않는 사용자 객체를 만들 것이기 때문에 수동으로 객체를 생성하고 소멸시켜야만 한다. 생성이야 문제가 안되지만 소멸은 어쩌지?? 하고 찾아봤는데.. 결과적으로는 클래스에 IDisposable 인터페이스를 상속받은 후, Dispose 메소드를 오버로딩해서 기술하면 된다는 듯 싶다. 이 때, dispose 상태인지 아닌지 판별하는 변수를 하나 만들어준다.

[참조]

폼에서 값을 주고받을 땐 이런저런 방법이 있지만, 기본적으로는 바로 던질 수 없는 듯 싶다. 객체지향적인 방법을 유지하면서 값을 전달하고 받으려면, get과 set 프로퍼티를 수동으로 정의한 후 객체를 생성한 뒤에 프로퍼티에 값을 넘기면 자동으로 처리해준다는.

[참조]

여러가지 문제는 있겠지만 일단~돌아가게끔 만들기는 했으니 정리해둠.

[login_form.cs]
namespace FourTypesApp
{
    // 코드생략
    public partial class login_form : Form
    {
        private void btn_login_Click(object senderEventArgs e)
        {
            // 텍스트박스에서 사용자 이름과 패스워드를 받아 옴
            string UserName = tb_username.Text;
            string PassWord = tb_password.Text;
            // 멤버객체를 생성함
            MEMBER member = new MEMBER();
            try
            {
                // 멤버객체 안에 있는 로그인 함수를 호출해서 객체를 리턴받음
                member = member.login(UserNamePassWord);
                if (member != null)
                {
                    // 로그인이 성공한 경우, 페이지를 이동함
                    this.Hide();
                    main_form MainForm = new main_form();
                    // *메인폼에 있는 memberObj의 set 프로퍼티를 사용하여 멤버객체를 전달한다.
                    MainForm.memberObj = member;
                    MainForm.Show();
                }
                else
                {
                    throw new Exception();
                }
            }
            catch (Exception ex)
            {
                // login Failed
                MessageBox.Show("ログインに失敗しました。会員名とパスワードをご確認ください。[内容]" + ex.Message"ログインエラー"MessageBoxButtons.OKMessageBoxIcon.Error);
                member.Dispose();
            }
        }
    }
}

[main_form.cs]
namespace FourTypesApp
{
    public partial class main_form : Form
    {
        // 전달받은 객체를 담을 변수를 정의
        MEMBER member;
        // get과 set 파라미터 정의
        public MEMBER memberObj 
        {
            get {return this.member; }
            set {this.member = value; } 
        }
        public main_form()
        {
            InitializeComponent();
        }
        // 화면이 호출되면 넘겨받은 객체의 값을 라벨에 출력한다.
        private void main_form_Load(object senderEventArgs e)
        {
            testLable.Text = "UserName : " + this.member.UserName;
            label1.Text = "TypeId : " + this.member.TypeId.ToString();
            label2.Text = "DryScore : " + this.member.DryScore.ToString();
            label3.Text = "HotScore : " + this.member.HotScore.ToString();
            label4.Text = "HumidScore : " + this.member.HumidScore.ToString();
            label5.Text = "ColdScore : " + this.member.ColdScore.ToString();
            label6.Text = "UserId : " + this.member.UserId.ToString();
        }
    }
}

[MEMBER.cs]
namespace FourTypesApp
{
// IDisposable 를 상속받아 클래스를 작성
    public class MEMBER : IDisposable
    {
        // Properties
        private int userid;
        private string username;
        private int generation;
        private string gender;
        private int typeid;
        private short dryscore;
        private short hotscore;
        private short coldscore;
        private short humidscore;
// Dispose 상태인지 아닌지 확인하기 위한 변수
        private bool isDispose = false;
        // 메모리에 객체를 띄우기 위한 컴포넌트 생성
        private Component component = new Component();

        // get, set Metchod
        public int UserId
        {
            get { return this.userid; }
            set { this.userid = value; }
        }
        public string UserName
        {
            get {return this.username; }
            set {this.username = value; } 
        }
        public int Generation
        {
            get { return this.generation; }
            set { this.generation = value; }
        }
        public string Gender
        {
            get { return this.gender; }
            set { this.gender = value; }
        }
        public int TypeId
        {
            get { return this.typeid; }
            set { this.typeid = value; }
        }
        public short DryScore
        {
            get { return this.dryscore; }
            set { this.dryscore = value; }
        }
        public short HotScore
        {
            get { return this.hotscore; }
            set { this.hotscore = value; }
        }
        public short ColdScore
        {
            get { return this.coldscore; }
            set { this.coldscore = value; }
        }

        public short HumidScore
        {
            get { return this.humidscore; }
            set { this.humidscore = value; }
        }

        // destructor
        ~MEMBER()
        {
            if (!isDispose)
            {
                Dispose();
            }
        }
        // Dispose를 오버로딩 해서 재정의 한다. 컴포넌트를 소멸시켜 줌.
        public void Dispose() 
        {
            isDispose = true;
            component.Dispose();
            component = null;
            GC.SuppressFinalize(this);
        }
        // LOGIN 처리
        public MEMBER login(string UserNamestring PassWord)
        {
            try
            {
                using (var model = new FourTypesModel())
                {
                    // 모델로부터 users 테이블의 값을 가져와서 사용자명과 패스워드가 일치하는 항목의 id값을 가져온다.
                    var targetUserId = model.users
                             .Where(user => user.username == UserName)
                             .Where(user => user.password == PassWord)
                             .Select(user => user.id)
                             .FirstOrDefault();

                    if (targetUserId == 0)
                    {
                        // 일치하는 항목이 없는 경우에는 null을 리턴해서 에러출력.
                        return null;
                    }
                    else
                    {
                        // 타겟이 되는 사용자id를 가지고 두 테이블을 내부결합 한 후 값을 변수에 담는다.
                        // query 는 생략.
                        // var query = model.users.Join(........);
                        userid = query.userid;
                        username = query.username;
                        generation = query.generation;
                        gender = query.gender;
                        typeid = query.typeid;
                        dryscore = (short)query.dryscore;
                        hotscore = (short)query.hotscore;
                        humidscore = (short)query.humidscore;
                        coldscore = (short)query.coldscore;
                    }
                }
                // MEMBER객체를 반환한다.
                return this;
            }
            catch (Exception
            {
                // 에러인 경우에는 오류처리
                throw;
            }
        }
    }
}      

[결과]

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법