![](https://velog.velcdn.com/images/songt/post/5fbb454b-9a79-4ae6-9273-9264c413f469/image.png)
MainRun
package edu.kh.jdbc.main.run;
import edu.kh.jdbc.main.view.MainView;
public class MainRun {
public static void main(String[] args) {
// 객체를 1회만 사용할 때 작성하는 방식
new MainView().mainMenu();
}
}
MainView
package edu.kh.jdbc.main.view;
import java.util.InputMismatchException;
import java.util.Scanner;
import edu.kh.jdbc.board.view.BoardView;
import edu.kh.jdbc.common.Session;
import edu.kh.jdbc.main.model.service.MainService;
import edu.kh.jdbc.member.model.dto.Member;
import edu.kh.jdbc.member.view.MemberView;
public class MainView {
private Scanner sc = new Scanner(System.in);
private MainService service = new MainService();
// 회원 기능 화면 객체 생성
private MemberView memberView = new MemberView();
// 게시판 기능 화면 객체 생성
private BoardView boardView = new BoardView();
/**
* 메인 메뉴 출력
*/
public void mainMenu() {
int input = 0;
do {
try {
if(Session.loginMember == null) {
// 로그인 X
System.out.println("\n===== 회원제 게시판 프로그램 =====\n");
System.out.println("1. 로그인");
System.out.println("2. 회원 가입");
System.out.println("0. 프로그램 종료");
System.out.print("\n메뉴 선택 : ");
input = sc.nextInt();
sc.nextLine(); // 입력 버퍼 개행 문자 제거
switch(input) {
case 1: login(); break;
case 2: signUp(); break;
case 0: System.out.println("\n=== 프로그램 종료 ===\n"); break;
default : System.out.println("\n*** 메뉴 번호만 입력 해주세요 ***\n");
}
}else {
// 로그인 O
System.out.println("\n===== 로그인 메뉴 =====\n");
System.out.println("1. 회원 기능");
System.out.println("2. 게시판 기능");
System.out.println("3. 로그아웃");
System.out.println("0. 프로그램 종료");
System.out.print("\n메뉴 선택 : ");
input = sc.nextInt();
sc.nextLine(); // 입력 버퍼 개행 문자 제거
switch(input) {
case 1: memberView.memberMenu(); break;
case 2: boardView.boardMenu(); break;
case 3:
System.out.println("\n=== 로그아웃 되었습니다 ===\n");
Session.loginMember = null;
// 참조 하고있던 로그인 회원 객체를 없앰
break;
case 0: System.out.println("\n=== 프로그램 종료 ===\n"); break;
default : System.out.println("\n*** 메뉴 번호만 입력 해주세요 ***\n");
}
}
}catch (InputMismatchException e) {
System.out.println("\n*** 입력 형식이 올바르지 않습니다***\n");
sc.nextLine(); // 입력버퍼에 잘못된 문자열 제거
input = -1; // while문 종료 방지
}
}while(input != 0);
}
/**
* 로그인
*/
private void login() {
System.out.println("\n[로그인]\n");
System.out.print("아이디 : ");
String memberId = sc.next();
System.out.print("비밀번호 : ");
String memberPw = sc.next();
try {
// 로그인 서비스 호출 후 결과 반환 받기
// -> 반환 받은 결과는 Session.loginMember에 저장
Session.loginMember = service.login(memberId, memberPw);
if(Session.loginMember == null) { // 로그인 실패
System.out.println("\n*** 아이디/비밀번호가 일치하지 않습니다. ***\n");
}else {
System.out.printf("\n=== %s님 환영합니다 ===\n\n",
Session.loginMember.getMemberName());
}
}catch (Exception e) {
System.out.println("\n***** 로그인 중 예외 발생 *****\n");
e.printStackTrace();
}
}
/**
* 회원 가입
*/
private void signUp() {
System.out.println("\n[회원 가입]\n");
// 아이디, 비밀번호, 이름, 성별(M/F)을 저장할 변수 선언
String memberId = null;
String memberPw = null;
String pwConfirm = null; // 비밀번호 확인용 변수
String memberName = null;
String memberGender = null;
try {
// 아이디 입력
// - DB에 탈퇴하지 않은 회원 중
// 입력한 아이디와 같은 아이디가 존재하면 중복으로 판정
// -> 중복이 입력되지 않을 때 까지 무한 반복
while(true) {
System.out.print("아이디 입력 : ");
memberId = sc.next();
// 아이디 중복 확인 서비스 호출
// -> 중복인 경우 1, 아니 경우 0 반환
int result = service.idDuplicationCheck(memberId);
// 중복 검사 결과에 따라 반복 제어
if(result == 0) {
System.out.println("\n=== 사용 가능한 아이디 입니다 ===\n");
break;
}else {
System.out.println("\n*** 이미 사용중인 아이디 입니다 ***\n");
}
}
// 비밀번호, 확인 입력을 받아서 같을 때 까지 무한 반복
while(true) {
System.out.print("비밀번호 입력 : ");
memberPw = sc.next();
System.out.print("비밀번호 확인 : ");
pwConfirm = sc.next();
if(memberPw.equals(pwConfirm) ) { // 같을 때
System.out.println("\n=== 비밀번호 일치 ===\n");
break;
} else {
System.out.println("\n*** 비밀번호가 일치하지 않습니다 ***\n");
}
}
// 이름 입력
System.out.print("이름 : ");
memberName = sc.next();
// 성별 입력
// M 또는 F가 입력될 때까지 무한 반복
while(true) {
System.out.print("성별(M/F) : ");
memberGender = sc.next().toUpperCase();
// 정상 입력
if(memberGender.equals("M") || memberGender.equals("F")) {
break;
} else {
System.out.println("\n*** M 또는 F만 입력해주세요 ***\n");
}
}
// Member 객체를 생성하여 입력 받은 값 세팅
Member member = new Member();
member.setMemberId(memberId);
member.setMemberPw(memberPw);
member.setMemberName(memberName);
member.setMemberGender(memberGender);
// 회원 가입 서비스 호출
int result = service.signUp(member);
if(result > 0) { // 삽입 성공
System.out.println("\n=== 회원 가입 성공 ===\n");
}else {
System.out.println("\n*** 회원 가입 실패 ***\n");
}
}catch (Exception e) {
System.out.println("\n***** 회원 가입 중 예외 발생 *****\n");
e.printStackTrace();
}
}
}
MainService
package edu.kh.jdbc.main.model.service;
import static edu.kh.jdbc.common.JDBCTemplate.*;
import java.sql.Connection;
import edu.kh.jdbc.main.model.dao.MainDAO;
import edu.kh.jdbc.member.model.dto.Member;
public class MainService {
private MainDAO dao = new MainDAO();
/** 로그인 서비스
* @param memberId
* @param memberPw
* @return member
* @throws Exception
*/
public Member login(String memberId, String memberPw) throws Exception{
// 1. Connection 생성
Connection conn = getConnection();
// 2. DAO 호출
Member member = dao.login(conn, memberId, memberPw);
// 3. Connection 반환
close(conn);
// 4. 결과 반환
return member;
}
/** 아이디 중복 검사 서비스
* @param memberId
* @return result
* @throws Exception
*/
public int idDuplicationCheck(String memberId) throws Exception{
Connection conn = getConnection();
int result = dao.idDuplictaionCheck(conn, memberId);
close(conn);
return result;
}
/** 회원 가입 서비스
* @param member
* @return result
* @throws Exception
*/
public int signUp(Member member) throws Exception{
Connection conn = getConnection();
// DAO 호출
int result = dao.signUp(conn, member); // -> INSERT 수행
// 트랜잭션 처리
if(result > 0) commit(conn);
else rollback(conn);
close(conn);
return result;
}
}
MainDAO
package edu.kh.jdbc.main.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.Properties;
import edu.kh.jdbc.member.model.dto.Member;
public class MainDAO {
// 필드
// JDBC 객체 참조 변수
private Statement stmt; // SQL 수행, 결과 반환
private PreparedStatement pstmt; // placeholder를 포함한 SQL 세팅/수행
private ResultSet rs; // SELECT 수행 결과 저장
private Properties prop;
// - Map<String, String> 형태
// - XML 파일 입/출력 메서드를 제공
public MainDAO() { // 기본 생성자
// DAO 객체가 생성될 때 XML 파일을 읽어와 Properties 객체에 저장
try {
prop = new Properties();
prop.loadFromXML(new FileInputStream("main-sql.xml"));
// -> Properties 객체에
// key:value 형식으로 xml내용이 저장됨
// -> prop.getProperty("key") 호출
// --> value (SQL) 반환
}catch (Exception e) {
e.printStackTrace();
}
}
/** 아이디, 비밀번호 일치 회원 조회
* @param conn
* @param memberId
* @param memberPw
* @return member
* @throws Exception
*/
public Member login(Connection conn, String memberId, String memberPw) throws Exception{
// 1. 결과 저장용 변수 선언/객체 생성
Member member = null;
try {
// 2. SQL 작성 후 수행
String sql = prop.getProperty("login");
// PreaparedStatement 객체를 생성하고 SQL를 담아둠
pstmt = conn.prepareStatement(sql);
// placeholder에 알맞은 값 대입
pstmt.setString(1, memberId);
pstmt.setString(2, memberPw);
rs = pstmt.executeQuery(); // SELECT 수행 후 결과 반환 받기
// 3. 조회 결과를 1행씩 접근해서 얻어오기
if(rs.next()) {
int memberNo = rs.getInt("MEMBER_NO");
//String memberId = rs.getString("MEMBER_ID");
// 입력 받은 아이디 == 조회한 아이디
// -> DB에서 얻어올 필요가 없음
String memberName = rs.getString("MEMBER_NM");
String memberGender = rs.getString("MEMBER_GENDER");
String enrollDate = rs.getString("ENROLL_DT");
// Member 객체 생성 후 값 세팅
member = new Member();
member.setMemberNo(memberNo);
member.setMemberId(memberId);
member.setMemberName(memberName);
member.setMemberGender(memberGender);
member.setEnrollDate(enrollDate);
}
}finally {
// 4. 사용한 JDBC 객체 자원 반환
close(rs);
close(pstmt);
}
// 5. 결과 반환
return member;
}
/** 아이디 중복 검사 SQL 수행
* @param conn
* @param memberId
* @return result
* @throws Exception
*/
public int idDuplictaionCheck(Connection conn, String memberId) throws Exception{
int result = 0;
try {
String sql = prop.getProperty("idDuplictaionCheck");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memberId);
rs = pstmt.executeQuery();
if(rs.next()) {
result = rs.getInt(1);
}
}finally {
close(rs);
close(pstmt);
}
return result;
}
/** 회원 가입 SQL 수행(INSERT)
* @param conn
* @param member
* @return result
* @throws Exception
*/
public int signUp(Connection conn, Member member) throws Exception{
int result = 0;
try {
String sql = prop.getProperty("signUp");
pstmt = conn.prepareStatement(sql);
// ?(placeholder)에 값 세팅
pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getMemberPw());
pstmt.setString(3, member.getMemberName());
pstmt.setString(4, member.getMemberGender());
// 수행 후 결과 반환
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
}
main-sql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>main-sql.xml file</comment>
<entry key="login">
SELECT MEMBER_NO, MEMBER_ID, MEMBER_NM, MEMBER_GENDER,
TO_CHAR(ENROLL_DT, 'YYYY"년" MM"월" DD"일" HH24:MI:SS') ENROLL_DT
FROM MEMBER
WHERE MEMBER_ID = ?
AND MEMBER_PW = ?
AND UNREGISTER_FL = 'N'
</entry>
<entry key="signUp">
INSERT INTO "MEMBER" VALUES(SEQ_MEMBER_NO.NEXTVAL, ?, ?, ?, ?, DEFAULT, DEFAULT)
</entry>
<entry key="updateMemberPassword">
UPDATE MEMBER
SET MEMBER_PW = ?
WHERE MEMBER_ID = ? AND MEMBER_PW = ?
</entry>
<entry key="deleteMember">
UPDATE MEMBER
SET UNREGISTER_FL = 'Y'
WHERE MEMBER_PW = ?
</entry>
<entry key ="idDuplicationCheck">
SELECT COUNT(*) FROM MEMBER
WHERE UNREGISTER_FL = 'N'
AND MEMBER_ID = ?
</entry>
</properties>