![](https://velog.velcdn.com/images/songt/post/ce04e8eb-b024-4498-8e75-5d8da9ec048d/image.png)
Member
package edu.kh.jdbc.member.model.dto;
public class Member {
private int memberNo; // 회원 번호
private String memberId; // 회원 아이디
private String memberPw; // 회원 비밀번호
private String memberName; // 회원 이름
private String memberGender;// 회원 성별
private String enrollDate; // 가입일
private String unregisterFlag; // 탈퇴여부
public Member() { }
public int getMemberNo() {
return memberNo;
}
public void setMemberNo(int memberNo) {
this.memberNo = memberNo;
}
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getMemberPw() {
return memberPw;
}
public void setMemberPw(String memberPw) {
this.memberPw = memberPw;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public String getMemberGender() {
return memberGender;
}
public void setMemberGender(String memberGender) {
this.memberGender = memberGender;
}
public String getEnrollDate() {
return enrollDate;
}
public void setEnrollDate(String enrollDate) {
this.enrollDate = enrollDate;
}
public String getUnregisterFlag() {
return unregisterFlag;
}
public void setUnregisterFlag(String unregisterFlag) {
this.unregisterFlag = unregisterFlag;
}
}
MemberView
package edu.kh.jdbc.member.view;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import edu.kh.jdbc.common.Session;
import edu.kh.jdbc.member.model.dto.Member;
import edu.kh.jdbc.member.model.service.MemberService;
/** 회원 전용 화면
* @author 백동현(baekdh@iei.or.kr)
*/
public class MemberView {
private Scanner sc = new Scanner(System.in);
private MemberService service = new MemberService();
/**
* 회원 기능 메뉴
*/
public void memberMenu() {
int input = 0;
do {
try {
System.out.println("\n===== 회원 기능 =====\n");
System.out.println("1. 내 정보 조회");
System.out.println("2. 회원 목록 조회(아이디, 이름, 성별)");
System.out.println("3. 내 정보 수정(이름, 성별)");
System.out.println("4. 비밀번호 변경(현재 비밀번호, 새 비밀번호, 새 비밀번호 확인)");
System.out.println("5. 회원 탈퇴(보안코드, 비밀번호, UPDATE)");
System.out.println("9. 메인 메뉴로 돌아가기");
System.out.println("0. 프로그램 종료");
System.out.print("\n메뉴 선택 : ");
input = sc.nextInt();
sc.nextLine();
switch(input) {
case 1: selectMyInfo(); break;
case 2: selectMemberList(); break;
case 3: updateMember(); break;
case 4: updatePassword(); break;
case 5:
if( unRegisterMember() ) {
return; // 메인 메뉴
}
break;
case 9:
System.out.println("\n===== 메인 메뉴로 돌아갑니다 =====\n");
break;
case 0:
System.out.println("\n=== 프로그램 종료 ===\n");
// JVM 강제 종료 구문
// 매개변수는 기본 0, 다른 숫자는 오류를 의미
System.exit(0);
// Terminates the currently running Java Virtual Machine.
default: System.out.println("\n*** 메뉴 번호만 입력 해주세요 ***\n");
}
}catch (InputMismatchException e) {
System.out.println("\n*** 입력 형식이 올바르지 않습니다***\n");
sc.nextLine(); // 입력버퍼에 잘못된 문자열 제거
input = -1; // while문 종료 방지
}
}while(input != 9);
}
/**
* 내 정보 조회
*/
private void selectMyInfo() {
System.out.println("\n===== 내 정보 조회 =====\n");
// 회원 번호, 아이디, 이름, 성별(남/여), 가입일
// Session.loginMember 이용
System.out.println("회원 번호 : " + Session.loginMember.getMemberNo());
System.out.println("아이디 : " + Session.loginMember.getMemberId());
System.out.println("이름 : " + Session.loginMember.getMemberName());
if(Session.loginMember.getMemberGender().equals("M")) {
System.out.println("성별 : 남");
}else {
System.out.println("성별 : 여");
}
System.out.println("가입일 : " + Session.loginMember.getEnrollDate());
}
/**
* 회원 목록 조회
*/
private void selectMemberList() {
System.out.println("\n===== 회원 목록 조회 =====\n");
try {
// 회원 목록 조회 서비스 호출 후 결과 반환 받기
List<Member> memberList = service.selectMemberList();
if(memberList.isEmpty()) { // 조회 결과 X
System.out.println("\n===== 조회 결과가 없습니다 =====\n");
return;
}
// 1 user04 유저사 남
// 2 user03 유저삼 여
// 3 user02 유저이 남
// 4 user01 유저일 여
for(int i=0 ; i<memberList.size() ; i++) {
System.out.printf("%d\t\t%s\t\t%s\t\t%s \n",
i+1,
memberList.get(i).getMemberId(),
memberList.get(i).getMemberName(),
memberList.get(i).getMemberGender());
}
}catch (Exception e) {
System.out.println("\n***** 회원 목록 조회 중 예외 발생 *****\n");
e.printStackTrace();
}
}
/**
* 내 정보 수정
*/
private void updateMember() {
System.out.println("\n===== 내 정보 수정 =====\n");
// 이름(VARCHAR2) / 성별(CHAR, M/F)
System.out.print("수정할 이름 : ");
String memberName = sc.next();
String memberGender = null;
while(true) {
System.out.print("수정할 성별(M/F) : ");
// Java char : 문자 1개
// DB CHAR : 고정 길이 문자열 (== Java String)
memberGender = sc.next().toUpperCase();
if(memberGender.equals("M") || memberGender.equals("F")) {
break;
}
System.out.println("[M 또는 F를 입력해주세요]");
}
try {
int result = service.updateMember(memberName, memberGender,
Session.loginMember.getMemberNo());
// Session.loginMember.getMemberNo() : 로그인한 회원의 번호
// Service 호출 -> DAO호출 -> UPDATE 수행 -> 결과 행(int)
if(result > 0) { // 성공
System.out.println("\n=== 수정 되었습니다 ===\n");
// Service를 호출해서 DB만 수정
// -> DB와 Java프로그램 데이터 동기화
Session.loginMember.setMemberName(memberName);
Session.loginMember.setMemberGender(memberGender);
}else {
System.out.println("\n*** 수정 실패 ***\n");
}
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 비밀번호 변경
*/
private void updatePassword() {
System.out.println("\n===== 비밀번호 변경 =====\n");
// 현재 비밀번호 입력
System.out.print("현재 비밀번호 : ");
String current = sc.next();
String newPw1 = null;
while(true) {
// 새 비밀번호 입력
System.out.print("새 비밀번호 : ");
newPw1 = sc.next();
// 새 비밀번호 확인 입력
System.out.print("새 비밀번호 확인: ");
String newPw2 = sc.next();
// 같을 때 까지 무한 반복
if(newPw1.equals(newPw2)) {
break;
}
// 아닐 때
System.out.println("\n*** 새 비밀번호가 일치하지 않습니다 ***\n");
}
try {
// 서비스 호출(현재 비밀번호, 새 비밀번호, 로그인한 회원 번호)
// -> 성공하면 1 / 실패하면 0 -> int형 변수
int result = service.updatePassword(current, newPw1,
Session.loginMember.getMemberNo());
if(result > 0) { // 1인 경우
System.out.println("\n=== 비밀번호가 변경되었습니다 ===\n");
}else { // 0인 경우
System.out.println("\n*** 현재 비밀번호가 일치하지 않습니다 ***\n");
}
}catch (Exception e) {
System.out.println("\n***** 비밀번호 변경 중 예외 발생 *****\n");
e.printStackTrace();
}
}
/**
* @return true/false
* 회원 탈퇴
*/
private boolean unRegisterMember() {
System.out.println("\n===== 회원 탈퇴 =====\n");
System.out.print("현재 비밀번호 : ");
String memberPw = sc.next();
String code = service.createSecurityCode();
System.out.printf("보안문자 입력 [%s] :", code);
String input = sc.next();
// 보안문자 일치여부 확인
if(!input.equals(code)) { // 일치하지 않으면
System.out.println("\n*** 보안문자가 일치하지 않습니다 ***\n");
return false;
}
while(true) {
System.out.print("정말 탈퇴 하시겠습니까(Y/N) ?");
char check = sc.next().toUpperCase().charAt(0);
if(check == 'N') {
System.out.println("\n=== 탈퇴 취소 === \n");
return false; // 메서드 종료
}
if(check == 'Y') {
break; // 반복문 종료
}
// 'Y', 'N'이 아닌 경우
System.out.println("\n*** 잘못 입력 하셨습니다 ***\n");
}
try {
// 회원 탈퇴 서비스 호출
int result = service.unRegisterMember(memberPw,
Session.loginMember.getMemberNo());
if(result > 0) {
System.out.println("\n=== 탈퇴 되었습니다...... ===\n");
// 로그아웃
Session.loginMember = null;
return true;
}else {
System.out.println("\n*** 비밀번호가 일치하지 않습니다 ***\n");
}
}catch (Exception e) {
System.out.println("\n***** 회원 탈퇴 중 예외 발생 *****\n");
e.printStackTrace();
}
return false;
}
}
MemberService
package edu.kh.jdbc.member.model.service;
import static edu.kh.jdbc.common.JDBCTemplate.*;
import java.sql.Connection;
import java.util.List;
import java.util.Random;
import java.util.zip.CRC32;
import edu.kh.jdbc.member.model.dao.MemberDAO;
import edu.kh.jdbc.member.model.dto.Member;
public class MemberService {
private MemberDAO dao = new MemberDAO();
/** 회원 목록 조회 서비스
* @return memberList
* @throws Exception
*/
public List<Member> selectMemberList() throws Exception{
Connection conn = getConnection();
List<Member> memberList = dao.selectMemberList(conn);
close(conn);
return memberList;
}
/** 회원 정보 수정 서비스
* @param memberName
* @param memberGender
* @param memberNo
* @return result
* @throws Exception
*/
public int updateMember(String memberName,
String memberGender, int memberNo) throws Exception{
Connection conn = getConnection();
// dao 호출 후 결과 반환 받기
int result = dao.updateMemnber(conn, memberName, memberGender, memberNo);
// 트랜잭션 처리
if(result > 0) commit(conn);
else rollback(conn);
close(conn);
return result;
}
/** 비밀번호 변경 서비스
* @param current
* @param newPw1
* @param memberNo
* @return result
* @throws Exception
*/
public int updatePassword(String current,
String newPw1, int memberNo) throws Exception {
Connection conn = getConnection();
int result = dao.updatePassword(conn, current, newPw1, memberNo);
if(result > 0) commit(conn);
else rollback(conn);
close(conn);
return result;
}
/** 숫자 6자리 보안코드 생성 서비스
* @return code
*/
public String createSecurityCode() {
StringBuffer code = new StringBuffer();
// String : 불변성
// StringBuffer : 가변성
/* StringBuffer는 문자열을 추가하거나 변경할 때 주로 사용하는 자료형이다.
* StringBuffer 자료형은 append 메서드를 사용하여 문자열을 계속해서 추가해 나갈 수 있다. */
Random ran = new Random(); // 난수 생성 객체
for(int i=0; i<6 ; i++) {
int x = ran.nextInt(10); // 0이상 10미만 정수
code.append(x); // StringBuffer 마지막에 추가(뒤에 이어 붙임)
}
return code.toString();
/* toString() 메서드를 사용하면 StringBuffer를 String 자료형으로 변경할 수도 있다. */
}
/** 회원 탈퇴 서비스
* @param memberPw
* @param memberNo
* @return result
* @throws Exception
*/
public int unRegisterMember(String memberPw, int memberNo) throws Exception {
Connection conn = getConnection();
int result = dao.unRegisterMember(conn, memberPw, memberNo);
if(result > 0) commit(conn);
else rollback(conn);
close(conn);
return result;
}
}
MemberDAO
package edu.kh.jdbc.member.model.dao;
import static edu.kh.jdbc.common.JDBCTemplate.*;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import edu.kh.jdbc.member.model.dto.Member;
public class MemberDAO {
// JDBC 객체 참조 변수
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
// xml에 작성된 SQL을 읽어와 저장할 객체 참조 변수
private Properties prop;
public MemberDAO() { // 기본 생성자로 객체 생성 시 XML 읽어오기
try {
prop = new Properties();
prop.loadFromXML(new FileInputStream("member-sql.xml"));
}catch (Exception e) {
e.printStackTrace();
}
}
/** 회원 목록 조회 SQL 수행
* @param conn
* @return memberList
* @throws Exception
*/
public List<Member> selectMemberList(Connection conn) throws Exception{
// 결과 저장용 변수 선언 / 객체 생성
List<Member> memberList = new ArrayList<>();
try{
String sql = prop.getProperty("selectMemberList");
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
String memberId = rs.getString("MEMBER_ID");
String memberName = rs.getString("MEMBER_NM");
String memberGender = rs.getString("성별");
// 컬럼 값을 Member 객체에 저장
Member member = new Member();
member.setMemberId(memberId);
member.setMemberName(memberName);
member.setMemberGender(memberGender);
// Member객체를 List에 추가
memberList.add(member);
}
}finally {
close(rs);
close(stmt);
}
return memberList;
}
/** 회원 정보 수정 SQL 수행
* @param conn
* @param memberName
* @param memberGender
* @param memberNo
* @return result
* @throws Exception
*/
public int updateMemnber(Connection conn, String memberName,
String memberGender, int memberNo) throws Exception {
// 1. 결과 저장용 변수 선언
int result = 0;
try{
// 2. SQL 작성, 수행
String sql = prop.getProperty("updateMember");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memberName);
pstmt.setString(2, memberGender);
pstmt.setInt(3, memberNo);
result = pstmt.executeUpdate();
}finally {
// 3. JDBC 객체 자원 반환
close(pstmt);
}
// 4. 결과 반환
return result;
}
/** 비밀번호 변경 SQL 수행
* @param conn
* @param current
* @param newPw1
* @param memberNo
* @return result
* @throws Exception
*/
public int updatePassword(Connection conn, String current,
String newPw1, int memberNo) throws Exception {
int result = 0;
try {
String sql = prop.getProperty("updatePassword");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, newPw1);
pstmt.setString(2, current);
pstmt.setInt(3, memberNo);
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
/** 회원 탈퇴 SQL 수행
* @param conn
* @param memberPw
* @param memberNo
* @return result
* @throws Exception
*/
public int unRegisterMember(Connection conn, String memberPw, int memberNo) throws Exception {
int result = 0;
try{
String sql = prop.getProperty("unRegisterMember");
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, memberNo);
pstmt.setString(2, memberPw);
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
}
member-sql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>member-sql.xml file</comment>
<entry key="selectMemberList">
SELECT MEMBER_ID, MEMBER_NM,
DECODE(MEMBER_GENDER, 'M', '남', '여') 성별
FROM MEMBER
WHERE UNREGISTER_FL = 'N'
ORDER BY MEMBER_NO DESC
</entry>
<entry key="updateMember">
UPDATE MEMBER
SET MEMBER_NM = ?, MEMBER_GENDER = ?
WHERE MEMBER_No = ?
</entry>
<entry key="updatePassword">
UPDATE MEMBER
SET MEMBER_PW = ?
WHERE MEMBER_PW = ?
AND MEMBER_NO = ?
</entry>
<entry key="unRegisterMember">
UPDATE MEMBER
SET UNREGISTER_FL = 'Y'
WHERE MEMBER_NO = ?
AND MEMBER_PW = ?
</entry>
</properties>