1. USERINFO 데이터 베이스 

오라클에서 USERID, USERPW, USERNAME, PHONENO, CHARGE, BLACKLIST 컬럼을 가진 된 USERINFO 테이블을 생성.




2. 프로그램 로직 설계

자바에서 만들어서 실행할 프로그램은 [1.로그인, 2.회원가입, 3.탈퇴] 3개의 메뉴를 가진다.


로직은 

1) 로그인

- ID와 PASSWORD를 입력한다.

- 없는 ID를 입력하면 "아이디가 없습니다."라고 표시된다.

- 패스워드를 잘못 입력하면 "패스워드가 틀렸습니다."라고 표시된다.

- 무사히 로그인 하면 메뉴가 [1.로그아웃 2.탈퇴]2개로 로 변경된다.

- 로그인 후 3. 탈퇴를 선택시 1. 로그인에서 입력한 ID 값을 기준으로 해당 행을 삭제한다. 

(실제로 어떤 계정에 로그인하는 것은 아니고 로그인한 것처럼 보이게 만드는 프로그램이다.)


2) 회원가입 (INSERT)

- ID, PASSWORD, NAME, PHONENO를 입력 한다. 

- ID가 테이블에 이미 있는 ID이면 "이미 있는 아이디입니다."라고 표시된다.

- PASSWORD는 2번 입력하여 2개가 일치해야만 회원가입 완료. 틀리면 "패스워드가 틀렸습니다."라고 표시된다.

- 회원가입이 성공하면 CHARGE는 기본 5000, BLACKLIST는 O값이 자동으로 들어간다.


3) 탈퇴 (DELETE)

- 로그인 한 상태에서 탈퇴를 선택하면 로그인 시 입력한 ID를 기준으로 해당 ID의 정보가 삭제된다.

- 로그인하지 않은 상태로 탈퇴를 선택하면 "먼저 로그인을 해주세요." 메시지 출력 후 1번 로그인을 선택했을 때의 화면으로 넘어간다.




2. UserInfo 빈즈 클래스

빈즈 클래스처럼 데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는 것을 VO, DAO라고 한다.


package st02;

import java.sql.*;

public class UserInfo


private String userId; // 사용자ID

private String userPw; // 사용자PW

private String userName; // 사용자 이름

private String phoneNo; // 전화번호

private int chargeBalance; // 충전금액

private char blacklist; // 블랙리스트

public String getUserId() {

return userId;

}

public void setUserId(String userId) {

this.userId = userId;

}

public String getUserPw() {

return userPw;

}

public void setUserPw(String userPw) {

this.userPw = userPw;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPhoneNo() {

return phoneNo;

}

public void setPhoneNo(String phoneNo) {

this.phoneNo = phoneNo;

}

public int getChargeBalance() {

return chargeBalance;

}

public void setChargeBalance(int chargeBalance) {

this.chargeBalance = chargeBalance;

}

public char getBlacklist() {

return blacklist;

}

public void setBlacklist(char blacklist) {

this.blacklist = blacklist;

}

}



3. DAO 인터페이스
- JDBC에서 사용할 메소드를 선언해둔다.
- 이 DAO 인터페이스를 implements를 하여 JDBC를 사용한다.

package st02;
import java.sql.*;
import java.util.*;

public interface DAO {

public ArrayList<UserInfo> getUserInfo() throws SQLException, Exception;
// UserInfo를 배열로 받아오는 메소드 SELECT * FROM USERINFO

public void insertMember(UserInfo userInfo);
// 유저 신규가입 메소드. 

public void deleteMember(String userId);
// 유저 탈퇴 메소드.
}




4. 접속을 담당할 ConnectDAO 클래스
- JDBC에서 사용할 접속 메소드를 만들어둔다.
- 드라이버, url, 계정아이디와 패스워드를 미리 만들어둔다.
- try, catch문으로 접속시의 익셉션을 미리 잡아둔다.
- excute()라는 메소드를 만들어서 init(), query(), close() 3개의 메소드를 실행시킨다.
- init는 접속을 담당, query는 서브클래스에서 반드시 쿼리를 구현할 추상(abstract) 메소드, close는 접속 종료를 담당할 메소드.

package st02;
import java.sql.*;

public abstract class ConnectDAO {

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
public final void excute() {
try {
init();
query();
close();
}
catch (Exception e) {
e.getMessage();
}
}
public void init() throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@211.183.9.66:1521:xe", "st03", "st03");
}

public abstract void query() throws Exception;
private void close() {
 if(rs != null)try {rs.close();} catch (Exception e) {}
          if(pstmt != null)try {pstmt.close();} catch (Exception e) {}
          if(conn != null)try {conn.close();} catch (Exception e) {}
}
}



5. User_JDBC 클래스
- 위의 DAO 인터페이스를 implements하여 DAO 인터페이스에서 선언한 메소드를 사용한다.
- JDBC에는 각 쿼리만 각각의 메소드로 정리해둔다.

package st02;
import java.sql.*;
import java.util.*;

public class User_JDBC implements DAO // 접속을 담당할 JDBC 연결 메소드

final UserInfo user = new UserInfo(); // 자바빈즈를 user로

public ArrayList<UserInfo> getUserInfo() { // 유저 정보를 불러올 메소드

ArrayList<UserInfo> userInfos = new ArrayList<UserInfo>();
String sql = "SELECT * FROM USERINFO";

new ConnectDAO() {
public void query() throws Exception {
pstmt = conn.prepareStatement(sql.toString());
rs = pstmt.executeQuery();
while (rs.next()) {
UserInfo userinfo = new UserInfo(); // 임시
userinfo.setUserId(rs.getString("USERID"));
userinfo.setUserPw(rs.getString("USERPW"));
userinfo.setBlacklist(rs.getString("BLACKLIST").charAt(0));
userInfos.add(userinfo); // 한명의 정보를 전체 유저 정보 배열에 포함
}
}
}.excute();
return userInfos;
}

public void insertMember(UserInfo userInfo) {

String sql = "INSERT INTO USERINFO(USERNO, USERID, USERPW, USERNAME,PHONENO, CHARGE, BLACKLIST) "
+ "VALUES(USERINFO_SEQ.NEXTVAL, ?, ?, ?, ?, ?, 'O')";

new ConnectDAO()// ConnectDAO 클래스의 query() 부분을 각 메소드마다 이렇게 넣어준다.
public void query() throws Exception {

pstmt = conn.prepareStatement(sql);

while (true) {
pstmt.setString(1, userInfo.getUserId());
pstmt.setString(2, userInfo.getUserPw());
pstmt.setString(3, userInfo.getUserName());
pstmt.setString(4, userInfo.getPhoneNo());
pstmt.setInt(5, 5000);
int cnt = pstmt.executeUpdate();
break;
}
}
}.excute();
}

public void deleteMember(String userId) {
String sql = "DELETE FROM USERINFO WHERE USERID = ?";

new ConnectDAO() {
public void query() throws Exception {
pstmt = conn.prepareStatement(sql);
}
}.excute();
}

}

- 본 프로그램은  UserInfo를 배열로 받아와서 뿌려주는 SELECT * FROM USERINFO를 실행하는 메소드는 사용되지 않는다.
- 예제로서 참고로 넣음.



6. 프로그램을 실행할 UserPage 클래스

- 로그인, 회원가입, 탈퇴를 실행할 메인 클래스가 담긴 UserPage이다.

- 로그인을 하지 않았을 때의 화면과, 로그인을 했을 때의 화면을 별도의 메소드로 구분 한다.

- 메인 메소드는 일단 로그인을 하지 않았을 때의 메소드를 실행하여 보여준다.


package st02;

import java.util.Scanner;


public class UserPage {

Scanner scan = new Scanner(System.in);

UserLogin userlogin = new UserLogin();

UserJoin join = new UserJoin();

UserDelete delete = new UserDelete(userlogin);


public UserPage(){

userlogin.userpage = this;

}

public void userPage() {  // 로그인을 하지 않았을 때의 초기 메뉴 메소드 (1.로그인 2.회원가입 3.탈퇴)

Scanner scan = new Scanner(System.in);

System.out.println("어서오세요! 자전거 대여 서비스 빌리거입니다.");


while (true) {

System.out.println("1. 로그인\n" + "2. 회원가입\n" + "3. 탈퇴");

int cmdNo = scan.nextInt();

if (cmdNo == 1) {

userlogin.login();

}

else if (cmdNo == 2) {

join.insertMethod();

}

else if (cmdNo == 3) {

System.out.println("먼저 로그인을 해주세요.");

userlogin.login();

}

}

}

public void UserPage2() { // 로그인 상태일 때의 메뉴 메소드 (1.로그아웃 2.탈퇴)

Scanner scan = new Scanner(System.in);

System.out.println("어서오세요! 자전거 대여 서비스 빌리거입니다.");

while (true) {

System.out.println("1. 로그아웃\n" + "2. 탈퇴");

int cmdNo = scan.nextInt();

if (cmdNo == 1) {

System.out.println("로그아웃되었습니다.");

userPage();

}

else if (cmdNo == 2) {

delete.deleteMethod();

}

}

}

public static void main(String[] args) { // 위의 로그인 메소드를 실핼할 메인 메소드

UserPage userpage = new UserPage();

userpage.userPage();

}

}



7. 로그인을 담당하는 UserLogin 클래스

- 아이디 입력할 때 DB의 아이디와 비교하여 있는 아이디일 때 로그인, 없으면 "아이디가 없습니다"

- 패스워드를 입력 후 DB와 비교하여 맞으면 로그인, 없으면 "패스워드가 틀립니다."

- Blacklist가 X로 체크된 사람인 경우는 로그인 후 "이용이 정지된 회원입니다."

- 위의 모든 조건을 만족하면 로그인 성공.


package st02;
import java.sql.*;
import java.util.*;

public class UserLogin {

public String loginId = ""; // UserPage에서 입력한 ID를 넣을 지역변수를 선언해둠.
public UserPage userpage = null;
public UserInfo userInfo = new UserInfo();

public void login() { // 로그인 메소드
User_JDBC dao = new User_JDBC(); // 접속 및 메소드 구현을 위한 JDBC 가져옴
ArrayList<UserInfo> userInfos = new ArrayList<UserInfo>(); // 유저정보 배열

userInfos = dao.getUserInfo();  
Scanner scan = new Scanner(System.in);
System.out.println("ID와 패스워드를 입력하세요.");

loop: while (true) {
System.out.print("ID: "); 
String userId = scan.nextLine().trim();

int idCheck = 0; // for문을 빠져나가기 위한 변수
int pwCheck = 0; // for문을 빠져나가기 위한 변수

for (int i = 0; i < userInfos.size(); i++) { // 1. ID를 체크하는 알고리즘
UserInfo userinfo = userInfos.get(i); // userinfo 배열
if (userinfo.getUserId().equals(userId)) // userinfo의 userid와 입력한 userid 비교
idCheck = 1; // DB에 있는 ID라면 임시변수에 1을 넣고 다음으로 PW 입력으로 넘어감.
} // for
if (idCheck == 0) { // 같지 않다면 idCheck는 그대로 0이므로 아래를 실행 후 다시 ID를 묻도록 
System.out.println("아이디가 없습니다.");
continue;
}

System.out.print("Password: ");
String userPw = scan.nextLine().trim();

for (int j = 0; j < userInfos.size(); j++) {
UserInfo userinfo = userInfos.get(j);
 // 2. 패스워드를 체크하는 알고리즘. ID도 같고 패스워드도 같은 조건으로 해야함.
// 패스워드만 같게 하면 아이디가 틀려도 DB에 있는 패스워드이기만 하면 로그인이 된다.
if (userinfo.getUserId().equals(userId) && userinfo.getUserPw().equals(userPw)) {
pwCheck = 1; // 위와 같은 알고리즘으로 패스워드를 확인

for (int k = 0; k < userInfos.size(); k++) {
UserInfo userinfoPw = userInfos.get(k);
// 3. 아이디도 같고 패스워드도 같은 조건일 때 블랙리스트도 체크.
if (userinfo.getUserId().equals(userId) && userinfoPw.getUserPw().equals(userPw)) {
if (userinfoPw.getBlacklist() == 'X') {
System.out.println("이용이 정지된 회원입니다.");
System.out.println("1. 뒤로가기");
int selectNum = scan.nextInt();
if (selectNum == 1) {
login();
break loop;
}
}
System.out.println("로그인 완료!");
// 유저 인포의 유저 ID를 set
userInfo.setUserId(userId);
// loginSystem.userInfo = userInfo;
// 확인용@@@@@@@@@@@@@
System.out.println(userInfo.getUserId());
// loginSystem.loginUser();
break;
}
}
}

} // for
if (pwCheck == 0) { 
System.out.println("패스워드가 틀렸습니다.");
continue;
}

loginId = userId;
System.out.println("로그인 성공" + loginId + " " + userId);
userpage.UserPage2(); // 로그인 성공하면 로그인한 상태의 화면으로 넘어감

} // while*/

} // login() 메소드

} // 클래스



7. 회원가입을 담당하는 UserJoin 클래스


package st02;

import java.sql.*;

import java.util.*;


public class UserJoin {


public void insertMethod() {


Scanner scan = new Scanner(System.in);

User_JDBC dao = new User_JDBC();

ArrayList<UserInfo> userInfos = new ArrayList<UserInfo>();


userInfos = dao.getUserInfo();

System.out.println("회원정보를 입력하세요.");


while (true) {


System.out.print("아이디: ");

String userId = scan.nextLine().trim();

int continueCheck = 0; // for문을 빠져나가기 위한 변수

for (int i = 0; i < userInfos.size(); i++) {

UserInfo userinfo = userInfos.get(i);


if (userinfo.getUserId().equals(userId)) {

System.out.println("이미 있는 아이디입니다. 다시 입력해주세요.");

continueCheck = 1; // for문을 빠져나가 계속하기 위함

break;

}

} // for


if (continueCheck == 1)

continue; // for문을 빠져나가 계속하기 위한 변수

System.out.print("패스워드: ");

String userPw = scan.nextLine().trim();

System.out.print("패스워드 확인 : ");

String userPw2 = scan.nextLine().trim();


if (userPw.equals(userPw2)) {

System.out.print("이름: ");

String userName = scan.next();

System.out.print("전화번호: ");

String phoneNo = scan.next();

System.out.println("");

// 위에서 입력한 userId, userPw, userName, phoneNo를 DB에 insert

UserInfo userInfo = new UserInfo();

userInfo.setUserId(userId);

userInfo.setUserPw(userPw);

userInfo.setUserName(userName);

userInfo.setPhoneNo(phoneNo);

dao.insertMember(userInfo);

System.out.println("회원가입이 완료되었습니다.");

break;

} else {

System.out.println("패스워드가 틀렸습니다. 회원정보를 정확히 입력하세요.");

}


} // while

}

}




8. 회원탈퇴를 담당하는 UserDelete 클래스


package st02;
import java.sql.*;
import java.util.*;

public class UserDelete {
UserLogin userLogin = null; // UserLogin에서 userId를 가져오기 위한 메소드
public UserDelete(UserLogin userLogin) {
this.userLogin = userLogin;
}
public void deleteMethod() {
Scanner scan = new Scanner(System.in);
User_JDBC dao = new User_JDBC();
ArrayList<UserInfo> userInfos = new ArrayList<UserInfo>();
userInfos = dao.getUserInfo();
System.out.print("탈퇴하시겠습니까?(y/n): ");
String choice = scan.next();

while (true) {
if (choice.equals("y") || choice.equals("Y")) {
String userId = userLogin.loginId; // UserLogin에서 받아온 id값을 넣음.
dao.deleteMember(userId);// JDBC의 deleteMember 메소드에 위의 id값을 대입
System.out.println("탈퇴되었습니다.");
// System.out.println("login.loginId = " +userLogin.loginId); 탈퇴 아이디 제대로 받아왔나 체크
break;
}
else if (choice.equals("n") || choice.equals("N")) {
UserPage userpage = new UserPage();
userpage.UserPage2();
} else {
System.out.println("y나 n을 입력하세요.");
break;
}
} // while
}
}


9. 결과


어서오세요! 자전거 대여 서비스 빌리거입니다.

1. 로그인

2. 회원가입

3. 탈퇴


// 로그인 선택
ID와 패스워드를 입력하세요.
ID: user01
Password: 1111
로그인 성공user01 user01

어서오세요! 자전거 대여 서비스 빌리거입니다.
1. 로그아웃
2. 탈퇴

// 로그아웃 선택

로그아웃되었습니다.

어서오세요! 자전거 대여 서비스 빌리거입니다.

1. 로그인

2. 회원가입

3. 탈퇴


2  // 회원가입 선택
회원정보를 입력하세요.
아이디: user01
이미 있는 아이디입니다. 다시 입력해주세요.
아이디: user04
패스워드: 4444
패스워드 확인 : 5555
패스워드가 틀렸습니다. 회원정보를 정확히 입력하세요.
아이디: user04
패스워드: 4444
패스워드 확인 : 4444
이름: 사사미
전화번호: 02-444-4444

회원가입이 완료되었습니다.
1. 로그인
2. 회원가입
3. 탈퇴

// 탈퇴 선택
먼저 로그인을 해주세요.
ID와 패스워드를 입력하세요.
ID: user04
Password: 4444
로그인 성공
어서오세요! 자전거 대여 서비스 빌리거입니다.
1. 로그아웃
2. 탈퇴

2
탈퇴하시겠습니까?(y/n): n
어서오세요! 자전거 대여 서비스 빌리거입니다.
1. 로그아웃
2. 탈퇴

2
탈퇴하시겠습니까?(y/n): y
탈퇴되었습니다.
1. 로그아웃
2. 탈퇴


오라클 상에서 위의 회원가입(INSERT), 회원탈퇴(DELETE)를 실행시켜보면 이상없이 DB에 반영된 것을 확인할 수 있다.







Posted by netyhobby
,