로그인 시스템.

이번 프로젝트에서 구현해야 할 클래스 중 계정 생성, 계정 찾기, 로그인 시스템을 설계에 대한 이야기를 시작하겠다.

지난 글에서 구체적인 클래스에 대한 설계와 클래스 다이어그램을 올리겠다고 했었다.

열심히 머리로 굴려본 결과 대충 설계도가 나오긴 했는데 잘 구성 했는지에 대한 여부는 짜보지 않아서 모르겠다.

일단 이야기 해보도록 하자.
가장 먼저 DB를 활용한다는 점이 특징이다.

프로그램이 동작 되는 동안 해당 유저가 꼭 가지고 있어야 할 클래스가 필요하다고 판단됐다.
바로 Data 클래스이다. Data 클래스는 DB에 User 테이블의 6개의 필드와 같은 형태로 구성돼야 한다.

DB에 있는 User 테이블에는
아이디/비밀번호/생년월일/쉬운난이도점수/보통난이도점수/어려운난이도점수
이렇게 6개의 필드를 갖는다.

그러므로 Data 클래스 또한 이와 같이 구성한다.

Data

-String id

-String passwd

-String birth

-int score_easy

-int score_normal

-int score_hard

+void:setID(String id)

+void:setPasswd(String passwd)

+void:setBirth(String birth)

+void:setEScore(int score_easy)

+void:setNScore(int score_normal)

+void:setHScore(int score_hard)

+String:setID()

+String:setPasswd()

+String:setBirth()

+int:setEScore()

+int:setNScore()

+int:setHScore()

왜? 이렇게 해야 할까? 본인 판단은 다음과 같다. 데이터가 필요할 때마다 계속 DB를 활용해서 불러오고 저장하고 업데이트 한다는 것이 매우 불편하다고 생각 되기 때문에 한번 가져온 DB 데이터들을 프로그램이 동작 하는 동안 기억해 줘야 할 공간이 필요하다고 판단되기 때문이다. 그 것을 Data 클래스가 대신해 줄 것이다.

그리고 Data 클래스를 통해서 DB에 데이터를 삽입,변경,삭제를 할 클래스에게 객체를 전달하고 DB를 객체로 전달 받아야 하기 때문에 중계 역할을 위해서 필수적으로 필요한 것이다.

그럼 바로 DB 클래스 구성에 대해 이야기 하자.

DB<interface>

+void:dbInput(String query)

UserDB

+void:dbInput(String query)

+Data:dbOutput(String query)

## DB에 내용을 넣을 때와 DB에 내용을 검색하는 것에는 차이가 있다. 검색의 경우는 명령어 입력 후에 결과가 출력된다. 자바에서 검색 기능을 이용하려면 반환형이 필요하다.

반대로 내용을 추가, 수정, 삭제의 경우에는 반환형이 없다.

+void:dbInput(String query)

DB에 쿼리를 덜질 내용을 인수로 받아서 질의한다. 추가, 삭제, 수정의 경우 이 메소드를 이용할 것이다.

+Data:dbOutput(String query)

검색의 결과를 반환해야 한다.


UserDB 클래스는 DB 인터페이스를 구현 하도록 한다. UserDB는 DB에 던질 쿼리를 인수로 받아서 DB에 쿼리를 던지고 또한 반환값이 있는 질의를 던질 때는 반환받은 값을 Data형 객체로 반환하게 했다. 이 부분에서 조금의 오류가 있을 수도 있다고 판단이 된다. 반환형을 오브젝트 혹은 벡터형으로 설정을 한다면 인터페이스 자체에서 모두 추상 메소드를 갖고 각각 DB 활용이 필요한 클래스에서 구현하는 형태를 취하는 쪽이 어떨까 하는 생각이 들기 떄문이다. 일단은 이부분에 대해서는 조금 더 생각을 해야 할 것 같다.
그럼 다음으로 넘어가자.

로그인 클래스.

Login

-Data data

-JButton btn_login

-JButton btn_search

-JButton btn_creat

-JTextField tf_login

-JTextField tf_passwd

+Login(String title)

+void:search()

+void:creatID()

+Data:successLogin()

## 로그인을 성공하면 DB에서 데이터를 가져와 리턴 한다.

## 검색과 생성 버튼을 누르면 각각의 클래스로 연결 이벤트

## 로그인 다이얼로그에서 시스템 메뉴에 닫기를 누르면 프로그램 종료

## 스윙에 경우에는 닫기 버튼을 누르면 이벤트 설정을 하지 않아도 폼이 없어진다.

+Login(String title)

생성자를 통해서 인터페이스를 구성한다.(키워드 interface와는 관련없다.)

+void:search()

Search 다이얼로그를 불러온다.

+void:creatID()

Create 다이얼로그를 불러온다.

+Data:successLogin()

로그인을 성공하면 Data형 객체를 반환한다.


로그인 클래스는 질의문장을 완성해서 UserDB클래스에게 전달해 로그인 성공 여부를 확인하게 된다.
지금 이 부분에서 빠진 부분이 한가지 있다면 로그인 성공 여부를 어떻게 확인 할 것인가이다. 이 부분은 추가적으로 boolean형을 반환하는 메소드를 적당한 클래스에 넣어줘야 할 것이라 생각 된다.

그럼 다음으로 ~

검색 클래스

Search

-JLabel id_label

-JLabel passwd_label

-JTextField id_tf

-Choice yy

-Choice mm

-Choice dd

-JButton btn_id

-JButton btn_passwd

-JButton btn_search

+Search(String title)

+String:searchID(String id)

+String:searchPasswd(String id, String yy, String mm, String dd)

+Data:getSearch(String query)

+String:getID(Data data)

+String:getPasswd(Data data)

## 다이얼로그 하나에 ID 찾기와 패스워드 찾기가 구성된 형태 카드레이아웃으로 구성해야 할 것이다.

## 메소드에서 아이디 찾기와 비밀번호 찾기 명령어를 완성하고 메소드를 전달 후 결과물은 Data형 객체로 받는다.

+Search(String title)

생성자를 통해서 인터페이스를 구성한다.(키워드 interface와는 관련없다.)

+String:getID(Data data)

Data형 객체를 인수로 받아 id필드를 반환한다.

+String:getPasswd(Data data)

Data형 객체를 인수로 받아 passwd필드를 반환한다.

+String:searchID(String yy,String mm,String dd)

id를 검색하기 위해 DB에 쿼리를 던질 생년월일을 인수로 받아 쿼리를 완성하고 반환한다.

+String:searchPasswd(String id, String yy, String mm, String dd)

password를 검색하기 위해 DB에 쿼리를 던질 아이디와 생년월일을 인수로 받아 쿼리를 완성하고 반환한다.

+Data:getSearch(String query)

완성된 쿼리를 인수로 받아 DBconnect형 객체에 Data형 객체를 반환형으로 갖는 메소드에 쿼리를 인수로 전달 하고 Data형 객체를 반환한다.

이 부분에서도 일부 오류가 발견된다.(미리 짜둔거라 다시 보니 설계도가 엉망이네 -_-..)
DB에 질문을 던지고 그 결과를 가져다 주는 메소드는 이미 UserDB에 존재하고 이 클래스에서 해야 할 일인지 의문이다. 본격적으로 구현 할 때는 이런 점을 개선하도록 하자.

다음!!

계정생성 클래스

Create

+JTextField id_tf

+JTextField passwd_tf

+JTextField passwd2_tf

+Choice yy

+Choice mm

+Choice dd

+JButton btn_create

+Create(String title)

+boolean:qualification(String str)

+void:createQuery(String id, String passwd, String yy, String mm, String dd)

## 사용자 계정을 생성한다.

+Create(String title)

생성자를 통해서 인터페이스를 구성한다.(키워드 interface와는 관련없다.)

+boolean:qualification(String str)

계정을 생성 할 때 id 최소 문자열, 비밀번호와 비밀번호확인 부분에 대한 제한조건이 성립하는 여부를 반환한다.

+String:createQuery(String id, String passwd, String yy, String mm, String dd)

DB에 들어가야 할 각 필드는

id/passwd/(yy+mm+dd)/score_easy/score_normal/score_hard

이다. 인수로 받지 않은 부분은 0으로 직접 설정한다.

완선된 라인을 이용해 UserDB형 객체를 통해 반환형이 없는 메소드를 실행한다.

여기에서는 계정을 생성하는 것이다. 같은 아이디가 존재하면 계정 생성을 막아야 한다는 것이 생각나서 설계 당시에는 boolean형으로 그 여부를 판단하도록 했으나..DB 자체에서 그 것을 걸러주는 기능이 있지 않나 하는 생각이 든다. 분명 있을것이다. 오라클을 배울 때 그 부분에 대해서 이야기 들은 기억이 있었던 것 같기 때문이다.

그리고 마지막으로 클래스 다이어그램을 그리려다 실패한 것이다.





















클래스 다이어그램을 그리는데 실패한 이유는 아직은 조금 어렵다 -_-; 혼자서 보는 책이 있는데 클래스간 집약관계, 사용, 생성, 전달의 관계를 나타내는 설명은 그림과 더불어 간단히 소개가 돼 있으나 무슨 책이 정말 간단하게 나와 있다 -_-..

그리다가 보니 저번학기 처럼 흐름도 비슷하게 그려진 것 같아서 기분은 별로 좋지 못했다...-ㅛ-!!

아무튼 이런 형식으로 설계를 하면서 진행을 하는 것이 확실히 객체지향적인 사고를 하는데는 도움이 된다. 그리고 재대로 써먹지는 못하겠지만 지금 따로 공부하고 있는 디자인 패턴이 객체지향프로그래밍에 도움이 되고 있다.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 만성피로 | 2008/10/04 23:01 | 정리할 자료들 | 트랙백 | 덧글(1)

트랙백 주소 : http://maydaisy.egloos.com/tb/911616
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 김교수 at 2008/10/16 23:36
설계를 비교적 잘 했네요. 뭐...로그인, 검색, 계정생성 등은 그 자체가 클래스로 하는 것은 좀...그렇긴 합니다만...

:         :

:

비공개 덧글

◀ 이전 페이지다음 페이지 ▶