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. 탈퇴
1 // 로그인 선택
ID와 패스워드를 입력하세요.
ID: user01
Password: 1111
로그인 성공user01 user01
어서오세요! 자전거 대여 서비스 빌리거입니다.
1. 로그아웃
2. 탈퇴
1 // 로그아웃 선택
로그아웃되었습니다.
어서오세요! 자전거 대여 서비스 빌리거입니다.
1. 로그인
2. 회원가입
3. 탈퇴
2 // 회원가입 선택
회원정보를 입력하세요.
아이디: user01
이미 있는 아이디입니다. 다시 입력해주세요.
아이디: user04
패스워드: 4444
패스워드 확인 : 5555
패스워드가 틀렸습니다. 회원정보를 정확히 입력하세요.
아이디: user04
패스워드: 4444
패스워드 확인 : 4444
이름: 사사미
전화번호: 02-444-4444
회원가입이 완료되었습니다.
1. 로그인
2. 회원가입
3. 탈퇴
3 // 탈퇴 선택
먼저 로그인을 해주세요.
ID와 패스워드를 입력하세요.
ID: user04
Password: 4444
로그인 성공
어서오세요! 자전거 대여 서비스 빌리거입니다.
1. 로그아웃
2. 탈퇴
2
탈퇴하시겠습니까?(y/n): n
어서오세요! 자전거 대여 서비스 빌리거입니다.
1. 로그아웃
2. 탈퇴
2
탈퇴하시겠습니까?(y/n): y
탈퇴되었습니다.
1. 로그아웃
2. 탈퇴
오라클 상에서 위의 회원가입(INSERT), 회원탈퇴(DELETE)를 실행시켜보면 이상없이 DB에 반영된 것을 확인할 수 있다.