TIL - 27. 게시판 Main [230818]

송원철·2023년 8월 21일
0

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>
profile
초보자

0개의 댓글

관련 채용 정보