DB - HashMap을 데이터베이스로 전환하여 회원정보 관리 프로그램 구축하는 퀴즈(2022-08-10)

2022. 8. 10. 21:433층 1구역 - 개발의 장/Oracle DataBase

인터페이스 - IMemberDAO.java

 

package jdbc_disassemble.DAO;

import java.util.Collection;
import jdbc_disassemble.DTO.MemberDTO;

public interface IMemberDAO {
	public Collection<MemberDTO> selectAll() ;
	public MemberDTO selectEmail(String email);
	public void insert(MemberDTO member);
	public void update(MemberDTO member);
	public void delete(String email);
	
}

MemberDAO.java

 

package jdbc_disassemble.DAO;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Collection;
import java.util.HashMap;

import jdbc_disassemble.DTO.MemberDTO;


public class MemberDAO implements IMemberDAO{
	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;
	
	public MemberDAO() {
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String username = "<권한받은 계정>";
		String password = "<설치 시 설정한 비밀번호>";
		
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			con = DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public Collection<MemberDTO> selectAll() {
		String sql = "SELECT * FROM <테이블 명>";
		HashMap<String, MemberDTO> members = new HashMap<>();
		try {
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				MemberDTO member = new MemberDTO();
				
				member.setRegisterDate(rs.getString("registerDate"));
				member.setEmail(rs.getString("email"));
				member.setName(rs.getString("name"));
				member.setPassword(rs.getString("password"));
				
				members.put(sql, member);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return members.values();
	}

	@Override
	public MemberDTO selectEmail(String email) {
		String sql = "SELECT * FROM <테이블 명> WHERE email=?";
		
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, email);
			rs = ps.executeQuery();
			
			if(rs.next()) {
				MemberDTO member = new MemberDTO();
				member.setRegisterDate(rs.getString("registerDate"));
				member.setEmail(rs.getString("email"));
				member.setName(rs.getString("name"));
				member.setPassword(rs.getString("password"));
				return member;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public void insert(MemberDTO member) {
		String sql = "INSERT INTO <테이블 명> VALUES(?, ?, ?, ?)";
		
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, member.getRegisterDate());
			ps.setString(2, member.getEmail());
			ps.setString(3, member.getName());
			ps.setString(4, member.getPassword());
			
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	@Override
	public void update(MemberDTO member) {
		String sql = "UPDATE <테이블 명> SET password=?  WHERE email=?";
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, member.getPassword());
			ps.setString(2, member.getEmail());
			
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void delete(String email) {
		String sql = "DELETE FROM <테이블 명> WHERE email=?";
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, email);
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public void disconnection() {
		try {
			if(rs != null) rs.close();
			if(ps != null) ps.close();
			if(con != null) con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	}

인터페이스 - IMemberDTO.java

 

package jdbc_disassemble.DTO;

public interface IMemberDTO {
	public void setEmail(String email);
	public void setPassword(String password);
	public void setName(String name);
	public void setRegisterDate(String registerDate);

	public String getEmail();
	public String getPassword();
	public String getName();
	public String getRegisterDate();
}

MemberDTO.java

 

package jdbc_disassemble.DTO;

/*QL> CREATE TABLE dto(
		  2  registerDate varchar2(50),
		  3  email varchar2(20),
		  4  name varchar2(20),
		  5  password varchar2(20)
		  6  );

		Table created.*/

public class MemberDTO implements IMemberDTO{
private String email, password, name, registerDate;

	
	@Override
	public void setEmail(String email) {
		this.email = email;
		
	}

	@Override
	public void setPassword(String password) {
		this.password = password;
		
	}

	@Override
	public void setName(String name) {
		this.name = name;
		
	}

	@Override
	public void setRegisterDate(String registerDate) {
		this.registerDate = registerDate;
		
	}

	@Override
	public String getEmail() {
		
		return email;
	}

	@Override
	public String getPassword() {
		
		return password;
	}

	@Override
	public String getName() {
		
		return name;
	}

	@Override
	public String getRegisterDate() {
		
		return registerDate;
	}

}

IRegisterRequest.java

 

package jdbc_disassemble.DTO;

public interface IRegisterRequest {
	public String getEmail();
	public String getName() ;
	public String getPassword();
	public String getConfirmPassword();
	
	public void setPassword(String password);
	public void setEmail(String email);
	public void setName(String name);
	public void setConfirmPassword(String confirmPassword);
}

RegisterRequest.java

 

package jdbc_disassemble.DTO;

public class RegisterRequest implements IRegisterRequest{
private String email, name, password, confirmPassword;

	@Override
	public String getEmail() {
		
		return email;
	}

	@Override
	public String getName() {
	
		return name;
	}

	@Override
	public String getPassword() {
		
		return password;
	}

	@Override
	public String getConfirmPassword() {
	
		return confirmPassword;
	}

	@Override
	public void setPassword(String password) {
		this.password = password;
		
	}

	@Override
	public void setEmail(String email) {
		this.email = email;
		
	}

	@Override
	public void setName(String name) {
		this.name = name;
		
	}

	@Override
	public void setConfirmPassword(String confirmPassword) {
		this.confirmPassword = confirmPassword;
		
	}

}

ChangePasswordService.java

 

package jdbc_disassemble.Service;

import jdbc_disassemble.DAO.MemberDAO;
import jdbc_disassemble.DTO.MemberDTO;

public class ChangePasswordService {
	private MemberDAO memberDao;
	
	public ChangePasswordService(MemberDAO memberDao) {
		this.memberDao = memberDao;
	}

	public void changePassword(String email, String oldPw, String newPw) {
		// 이메일 등록여부 확인.
		MemberDTO member = memberDao.selectEmail(email);
		if(member == null) {
			System.out.println("등록되지 않은 이메일 입니다. 사유 : " + email);
		}else {
		// 패스워드 확인 및 MemberDAO.update() 호출 
			if(member.getPassword().equals(oldPw) == false) {
				System.out.println("암호가 일치하지 않습니다.");
			}else {
				member.setPassword(newPw);
				memberDao.update(member);
				System.out.println("암호가 수정되었습니다.");
			}
				}
	}

}

MemberAllService.java

 

package jdbc_disassemble.Service;

import java.util.Collection;

import jdbc_disassemble.DAO.MemberDAO;
import jdbc_disassemble.DTO.MemberDTO;

public class MemberAllService {
	private MemberDAO memberDao;
	
	public MemberAllService(MemberDAO memberDao){
		this.memberDao = memberDao;
	}
	
	public void selectAll() {
		// MemberDAO 객체 내부 selectAll() 호출 후 회원 모든 정보 출력
		Collection<MemberDTO> members = memberDao.selectAll();
		if(members.isEmpty() == false) {
			for(MemberDTO member : members) {
				System.out.println("가입일  : " + member.getRegisterDate());
				System.out.println("이메일  : " + member.getEmail());
				System.out.println("이름 : " + member.getName());
				System.out.println("암호 : " + member.getPassword());
			}
		}else {
			System.out.println("등록 후 이용해주세요.");
		}
	}

}

MemberDeleteService.java

 

package jdbc_disassemble.Service;

import jdbc_disassemble.DAO.MemberDAO;
import jdbc_disassemble.DTO.MemberDTO;

public class MemberDeleteService {

	private MemberDAO memberDao;

	public MemberDeleteService(MemberDAO memberDao) {
		this.memberDao = memberDao;
	}

	public void checkPassword(String email, String password, String confirmPassword) {
		// 패스워드 확인
		if (password != null && password.equals(confirmPassword) == false) {
			System.out.println("암호가 일치하지 않습니다.");
			return;
		}
		// MemberDAO 객체 내 selectEmail() 메소드를 호출
		MemberDTO member = memberDao.selectEmail(email);
		if (member == null) {
			System.out.println("등록되지 않은 이메일 입니다. " + email);
		} else {
			// 저장된 회원 정보와 입력된 회원 정보 검증
			if (password.equals(member.getPassword()) == false) {
				System.out.println("저장된 암호와 일치하지 않습니다.");
			} else {
				// MemberDAO 객체 내 delete() 호출
				memberDao.delete(email);
				System.out.println("계정이 삭제되었습니다.");
			}
		}

	}
}

MemberRegisterService.java

 

package jdbc_disassemble.Service;

import java.text.SimpleDateFormat;
import java.util.Date;

import jdbc_disassemble.DAO.MemberDAO;
import jdbc_disassemble.DTO.MemberDTO;
import jdbc_disassemble.DTO.RegisterRequest;

public class MemberRegisterService {
	private MemberDAO memberDao = new MemberDAO();
	
	public MemberRegisterService(MemberDAO memberDao) {
		this.memberDao = memberDao;
	}
	public void regist(RegisterRequest req) {
		
		// password == confirmPassword
		if(req.getPassword().equals(req.getConfirmPassword()) == false) {
			System.out.println("암호가 일치하지 않습니다.");
			return;
		}
		
		// email로 계정 등록 여부 확인
		MemberDTO check = memberDao.selectEmail(req.getEmail());
		if(check != null) {
			System.out.println(req.getEmail() + "는/은 등록된 이메일입니다.");
			return;
		}
		// memberDao.insert() 계정 등록
		MemberDTO member = new MemberDTO();
		member.setEmail(req.getEmail());
		member.setName(req.getName());
		member.setPassword(req.getPassword());
		
		Date date = new Date();
		SimpleDateFormat day = new SimpleDateFormat("yyyy년 MM월 dd일");
		String fday = day.format(date);
		member.setRegisterDate(fday);
		
		memberDao.insert(member);
	}

}

Main.java

 

package jdbc_disassemble.main;

import java.util.Scanner;
import jdbc_disassemble.DAO.MemberDAO;
import jdbc_disassemble.DTO.RegisterRequest;
import jdbc_disassemble.Service.ChangePasswordService;
import jdbc_disassemble.Service.MemberAllService;
import jdbc_disassemble.Service.MemberDeleteService;
import jdbc_disassemble.Service.MemberRegisterService;

public class Main {
	private static MemberDAO memberDao = new MemberDAO();
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while(true){
			System.out.println("명령어를 입력하세요");
			System.out.print("> ");
			String command = sc.nextLine();
			if(command.equalsIgnoreCase("exit")){
				memberDao.disconnection();
				System.out.println("종료합니다.");
				break;
			}
			if(command.startsWith("new")){
				processNewCommand(command.split(" "));
				continue;
			} else if(command.startsWith("change")){
				processChangeCommand(command.split(" "));
				continue;
			} else if(command.startsWith("all")) {
				processAllCommand();
				continue;
			} else if(command.startsWith("delete")) {
				processDeleteCommand(command.split(" "));
				continue;
			}
			
			printHelp();
		}
	}
	private static void processNewCommand(String[] arg) {
		//"정보 등록 : new [이메일] [이름] [암호] [암호확인]"
		if(arg.length != 5){
			printHelp();
			return;
		}
		// MemberRegisterService 객체 생성
		MemberRegisterService regSvc = new MemberRegisterService(memberDao);
		// RegisterRequest 객체 생성 
		RegisterRequest req = new RegisterRequest();
		// 데이터는 RegisterRequest 객체에 입력
		req.setEmail(arg[1]);
		req.setName(arg[2]);
		req.setPassword(arg[3]);
		req.setConfirmPassword(arg[4]);
		// regSvc.regist() 호출
		regSvc.regist(req);
	}
	
	private static void processAllCommand() {
		// MemberAllService 객체 생성
		MemberAllService allSvc = new MemberAllService(memberDao);
		// allSvc.selectAll() 호출
		allSvc.selectAll();
	}

	private static void processChangeCommand(String[] arg) {
		if(arg.length != 4) {
			printHelp();
			return;
		}
		// ChangePasswordService 객체 생성
		ChangePasswordService change = new ChangePasswordService(memberDao);
		// change.changePassword() 호출
		change.changePassword(arg[1], arg[2], arg[3]);
	}

	private static void processDeleteCommand(String[] arg) {
		if(arg.length != 4) {
			printHelp();
			return ;
		}
		// MemberDeleteService 객체 생성
		MemberDeleteService delete = new MemberDeleteService(memberDao);
		// delete.checkPassword() 호출
		delete.checkPassword(arg[1], arg[2], arg[3]);
	}

	private static void printHelp(){
		System.out.println();
		System.out.println("명령어 사용법을 확인하세요.");
		System.out.println("usage : ");
		System.out.println("모든 정보 출력 : all");
		System.out.println("정보 등록 : new [이메일] [이름] [암호] [암호확인]");
		System.out.println("비밀번호 수정 : change [이메일] [현재비밀번호] [변경할비밀번호]");
		System.out.println("정보 삭제 : delete [이메일] [암호] [암호확인]");
		System.out.println("종료 : exit");
		System.out.println();
	}
}