singleton패턴
==> 객체가 1개만 만들어지게 하는 프로그래밍 패턴
(외부에서 new명령을 사용하지 못하게 한다.)
인터페이스
package kr.or.ddit.mvc.dao;
import java.util.List;
import java.util.Map;
import kr.or.ddit.mvc.vo.MemberVO;
/**
* 실제 DB서버에 연결해서 SQL문을 수행하여 결과를 작성해서
* Service에 전달하는 DAO의 interface
*
* @author PC-05
*
*/
public interface IMemberDao {
/**
* MemberVO에 담겨진 자료를 DB에 insert하는 메서드
*
* @param memvo DB에 insert할 자료가 저장된 MemberVO객체
* @return insert작업성공 : 1이상의 정수, insert작업실패 : 0
*/
public int insertMember(MemberVO memvo);
/**
* 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
* @param memId 삭제할 회원 ID
* @return 삭제성공 : 1, 삭제실패 : 0
*/
public int deleteMember(String memId);
/**
* MemberVO자료를 이용하여 회원 정보를 Update하는 메서드
* @param memvo update할 회원 정보가 저장된 MemberVO객체
* @return 수정성공 : 1, 수정실패 : 0
*/
public int updateMember(MemberVO memvo);
/**
* DB의 회원 테이블의 전체 레코드를 가져와서
* List에 담아서 반환하는 메서드
*
* @return MemberVO객체를 담고있는 List
*/
public List<MemberVO> getAllMember();
/**
* 회원ID를 인수값으로 받아서 해당 회원데이터의 개수를 반환하는 메서드
*
* @param memId 검색할 회원ID
* @return 검색된 회원ID 개수
*/
public int getMemberCount(String memId);
/**
* MemberVO자료를 이용하여 회원 정보를 Update하는 메서드
*
* @param memvo update할 회원 정보가 저장된 MemberVO객체
* @return 수정성공 : 1, 수정실패 : 0
*/
public int updateMember2(MemberVO memvo, String updateField, String updateData);
/**
* Member 1명의 정보를 불러오는 메서드
*
* @param memId
* @return Member객체를 map에 담아 return
*/
public MemberVO getMember(String memId);
/**
* 수정할 정보를 갖는 Map을 인수값으로 받아서 회원정보를 수정하는 메서드
*
* @param paraMap 수정할 정보를 갖는 Map객체
* ( key : field(수정할 컬럼명), data(수정할 값), memid(수정할회원ID) )
* @return 수정작업성공 : 1 , 수정작업실패 : 0
*/
// update mymember set 수정할컬럼명 = 수정할값 where mem_id=수정할 회원ID
public int updateMember3(Map<String,String> paraMap);
//DB에 적용할 데이터는 한 묶음으로 묶어야 함
}
IMemberDao를 상속받는 Class
package kr.or.ddit.mvc.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import kr.or.ddit.mvc.vo.MemberVO;
import kr.or.ddit.util.DBUtil3;
public class MemberDaoImpl implements IMemberDao{
// 1번
private static MemberDaoImpl dao;
// 2번
private MemberDaoImpl() {}
// 3번
public static MemberDaoImpl getInstance() {
if(dao==null) dao = new MemberDaoImpl();
return dao;
}
@Override
public int insertMember(MemberVO memvo) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0; // 반환값이 저장될 변수
try {
conn = DBUtil3.getConnection();
String sql = "insert into mymember(mem_id, mem_name, mem_pass,mem_tel, mem_addr)"
+ " values(?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memvo.getMem_id());
pstmt.setString(2, memvo.getMem_name());
pstmt.setString(3, memvo.getMem_pass());
pstmt.setString(4, memvo.getMem_tel());
pstmt.setString(5, memvo.getMem_addr());
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
cnt = 0;
e.printStackTrace();
}finally{
if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {}
if(conn!=null)try {conn.close();}catch(SQLException e) {}
}
return cnt;
}
@Override
public int deleteMember(String memId) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0;
try {
conn = DBUtil3.getConnection();
String sql = "delete mymember where mem_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memId);
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
cnt = 0;
e.printStackTrace();
}finally {
if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {}
if(conn!=null)try {conn.close();}catch(SQLException e) {}
}
return cnt;
}
@Override
public int updateMember(MemberVO memvo) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0; //반환값 변수
try {
conn = DBUtil3.getConnection();
String sql = "update mymember set MEM_NAME =?, MEM_PASS =?, MEM_TEL=?, MEM_ADDR=? where MEM_ID=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memvo.getMem_name());
pstmt.setString(2, memvo.getMem_pass());
pstmt.setString(3, memvo.getMem_tel());
pstmt.setString(4, memvo.getMem_addr());
pstmt.setString(5, memvo.getMem_id());
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
cnt = 0;
}finally {
if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {}
if(conn!=null)try {conn.close();}catch(SQLException e) {}
}
return cnt;
}
@Override
public List<MemberVO> getAllMember() {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List<MemberVO> memList = new ArrayList<>(); //반환값이 저장될 변수 선언
try {
conn = DBUtil3.getConnection();
String sql = "select * from mymember";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
// 반복처리 부분에서는 한 레코드의 데이터를 VO에 담고
// 데이터가 저장된 VO를 List에 추가하는 작업을 진행한다.
// 1개의 레코드 값들을 VO에 저장하기
MemberVO memVo = new MemberVO(); // VO 객체 생성
memVo.setMem_id(rs.getString("mem_id")); // VO에 데이터베이스에서 불러온 데이터를 저장
memVo.setMem_name(rs.getString("mem_name"));
memVo.setMem_pass(rs.getString("mem_pass"));
memVo.setMem_tel(rs.getString("mem_tel"));
memVo.setMem_addr(rs.getString("mem_addr"));
memList.add(memVo); // VO 객체를 List에 추가한다.
}
} catch (SQLException e) {
memList = null;
e.printStackTrace();
}finally {
if(rs!=null)try {rs.close();}catch(SQLException e) {}
if(stmt!=null)try {stmt.close();}catch(SQLException e) {}
if(conn!=null)try {conn.close();}catch(SQLException e) {}
}
return memList;
}
@Override
public int getMemberCount(String memId) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int count = 0; // 반환값 저장 변수
try {
conn = DBUtil3.getConnection();
String sql = "select count(*) cnt from mymember "
+ " where mem_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memId);
rs = pstmt.executeQuery();
if(rs.next()) {
count = rs.getInt("cnt");
}
} catch (SQLException e) {
count = 0;
e.printStackTrace();
}finally {
if(rs!=null)try {rs.close();}catch(SQLException e) {}
if(pstmt!=null)try {pstmt.close();}catch(SQLException e) {}
if(conn!=null)try {conn.close();}catch(SQLException e) {}
}
return count;
}
@Override
public int updateMember2(MemberVO memvo, String updateField, String updateData) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt;
try {
conn = DBUtil3.getConnection();
String sql = "update mymember "
+ " set " + updateField + "= ? "
+ " where mem_id =?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, updateData);
pstmt.setString(2, memvo.getMem_id());
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
cnt = 0;
e.printStackTrace();
}finally {
if(pstmt!=null) try{pstmt.close();}catch(SQLException e) {}
if(conn!=null) try{conn.close();}catch(SQLException e) {}
}
return cnt;
}
@Override
public MemberVO getMember(String memId) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
MemberVO member = new MemberVO();
try {
conn = DBUtil3.getConnection();
String sql = "select * from mymember where mem_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memId);
rs = pstmt.executeQuery();
if(rs.next()) {
member.setMem_name(rs.getString("mem_name"));
member.setMem_pass(rs.getString("mem_pass"));
member.setMem_tel(rs.getString("mem_tel"));
member.setMem_addr(rs.getString("mem_addr"));
member.setMem_id(memId);
}
} catch (SQLException e) {
// TODO: handle exception
}finally {
if(rs!=null) try{rs.close();}catch(SQLException e) {}
if(pstmt!=null) try{pstmt.close();}catch(SQLException e) {}
if(conn!=null) try{conn.close();}catch(SQLException e) {}
}
return member;
}
@Override
public int updateMember3(Map<String, String> paraMap) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0; //반환값 저장 변수
try {
conn = DBUtil3.getConnection();
String sql = "update mymember "
+ " set " + paraMap.get("field") + "= ? "
+ " where mem_id =?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, paraMap.get("data"));
pstmt.setString(2, paraMap.get("memid"));
cnt = pstmt.executeUpdate();
} catch (SQLException e) {
cnt = 0;
e.printStackTrace();
}finally {
if(pstmt!=null) try{pstmt.close();}catch(SQLException e) {}
if(conn!=null) try{conn.close();}catch(SQLException e) {}
}
return cnt;
}
}
인터페이스
package kr.or.ddit.mvc.service;
import java.util.List;
import java.util.Map;
import kr.or.ddit.mvc.vo.MemberVO;
/**
* Service객체는 DAO에 만들어진 메서드를 원하는 작업에 맞게 호출하여
* 그 결과를 받아서 Controller에게 보내주는 역할을 한다.
*
* @author PC-05
*
*/
public interface IMemberService {
/**
* MemberVO에 담겨진 자료를 DB에 insert하는 메서드
*
* @param memvo DB에 insert할 자료가 저장된 MemberVO객체
* @return insert작업성공 : 1이상의 정수, insert작업실패 : 0
*/
public int insertMember(MemberVO memvo);
/**
* 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
* @param memId 삭제할 회원 ID
* @return 삭제성공 : 1, 삭제실패 : 0
*/
public int deleteMember(String memId);
/**
* MemberVO자료를 이용하여 회원 정보를 Update하는 메서드
* @param memvo update할 회원 정보가 저장된 MemberVO객체
* @return 수정성공 : 1, 수정실패 : 0
*/
public int updateMember(MemberVO memvo);
/**
* DB의 회원 테이블의 전체 레코드를 가져와서
* List에 담아서 반환하는 메서드
*
* @return MemberVO객체를 담고있는 List
*/
public List<MemberVO> getAllMember();
/**
* 회원ID를 인수값으로 받아서 해당 회원데이터의 개수를 반환하는 메서드
*
* @param memId 검색할 회원ID
* @return 검색된 회원ID 개수
*/
public int getMemberCount(String memId);
/**
* MemberVO자료를 이용하여 회원 정보를 Update하는 메서드
*
* @param memvo update할 회원 정보가 저장된 MemberVO객체
* @return 수정성공 : 1, 수정실패 : 0
*/
public int updateMember2(MemberVO memvo,String updateField, String updateData);
/**
* Member 1명의 정보를 불러오는 메서드
*
* @param memId
* @return Member객체를 map에 담아 return
*/
public MemberVO getMember(String memId);
/**
* 수정할 정보를 갖는 Map을 인수값으로 받아서 회원정보를 수정하는 메서드
*
* @param paraMap 수정할 정보를 갖는 Map객체
* ( key : field(수정할 컬럼명), data(수정할 값), memid(수정할회원ID) )
* @return 수정작업성공 : 1 , 수정작업실패 : 0
*/
// update mymember set 수정할컬럼명 = 수정할값 where mem_id=수정할 회원ID
public int updateMember3(Map<String,String> paraMap);
//DB에 적용할 데이터는 한 묶음으로 묶어야 함
}
IMemberService를 상속받는 Class
package kr.or.ddit.mvc.service;
import java.util.List;
import java.util.Map;
import kr.or.ddit.mvc.dao.IMemberDao;
import kr.or.ddit.mvc.dao.MemberDaoImpl;
import kr.or.ddit.mvc.vo.MemberVO;
public class MemberServiceImpl implements IMemberService {
private IMemberDao dao; // DAO 객체의 참조값이 저장될 변수 선언
private static MemberServiceImpl service; // 1번
// 2번
private MemberServiceImpl() {
dao = MemberDaoImpl.getInstance();
}
// 3번
public static MemberServiceImpl getInstance() {
if(service == null) service = new MemberServiceImpl();
return service;
}
/*
* public MemberServiceImpl() { //dao = new MemberDaoImpl(); // DAO객체 생성 dao =
* MemberDaoImpl.getInstance(); // DAO객체 생성 }
*/
@Override
public int insertMember(MemberVO memvo) {
// TODO Auto-generated method stub
return dao.insertMember(memvo);
}
@Override
public int deleteMember(String memId) {
// TODO Auto-generated method stub
return dao.deleteMember(memId);
}
@Override
public int updateMember(MemberVO memvo) {
// TODO Auto-generated method stub
return dao.updateMember(memvo);
}
@Override
public List<MemberVO> getAllMember() {
// TODO Auto-generated method stub
return dao.getAllMember();
}
@Override
public int getMemberCount(String memId) {
// TODO Auto-generated method stub
return dao.getMemberCount(memId);
}
@Override
public int updateMember2(MemberVO memvo,String updateField, String updateData) {
// TODO Auto-generated method stub
return dao.updateMember2(memvo, updateField, updateData);
}
@Override
public MemberVO getMember(String memId) {
// TODO Auto-generated method stub
return dao.getMember(memId);
}
@Override
public int updateMember3(Map<String, String> paraMap) {
// TODO Auto-generated method stub
return dao.updateMember3(paraMap);
}
}
controller
package kr.or.ddit.mvc.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import kr.or.ddit.mvc.service.IMemberService;
import kr.or.ddit.mvc.service.MemberServiceImpl;
import kr.or.ddit.mvc.vo.MemberVO;
public class MemberController {
private Scanner scan;
private IMemberService service; // service 객체 변수 선언
public MemberController() {
scan = new Scanner(System.in);
service = MemberServiceImpl.getInstance();
}
public static void main(String[] args) {
new MemberController().memberStart();
}
// 메뉴를 출력하고
private int displayMenu() {
System.out.println("== 작업 선택 ==");
System.out.println("1. 자료 추가");
System.out.println("2. 자료 삭제");
System.out.println("3. 자료 수정");
System.out.println("4. 전체 자료 출력");
System.out.println("5. 자료 수정2");
System.out.println("0. 작업 끝");
System.out.println("=============");
System.out.print("선택 >");
int input = scan.nextInt();
return input;
}
public void memberStart() {
while(true){
int choice = displayMenu();
switch(choice){
case 1 : // 추가
insertMember(); break;
case 2 : // 삭제
deleteMember(); break;
case 3 : // 수정 ==> 전체 항목 수정
updateMember(); break;
case 4 : // 전체 자료 출력
displayMember(); break;
case 5 : // 수정 ==> 원하는 항목만 수정
updateMember2(); break;
case 0 : // 종료
System.out.println("작업을 마칩니다.");
return;
default :
System.out.println("번호를 잘못 입력했습니다. 다시입력하세요.");
}
}
}
private void updateMember3() {
System.out.println();
System.out.println("수정할 회원 정보를 입력하세요.");
System.out.print("수정할 회원ID >> ");
String memId = scan.next();
int num; // 수정할 컬럼에 대한 선택 값이 지정될 변수
String updateField = null;
String updateTitle = null;
do {
System.out.println();
System.out.println("수정할 항목을 선택하세요.");
System.out.println("1. 회원이름 2. 비밀번호 3. 전화번호 4.회원주소");
System.out.println("----------------------------------------");
System.out.print("수정할 항목 선택>>");
num = scan.nextInt();
switch(num) {
case 1: updateField = "mem_name";
updateTitle = "회원이름"; break;
case 2: updateField = "mem_pass";
updateTitle = "비밀번호"; break;
case 3: updateField = "mem_tel";
updateTitle = "전화번호"; break;
case 4: updateField = "mem_addr";
updateTitle = "회원주소"; break;
default :
System.out.println("수정할 항목을 잘못 선택했습니다.");
System.out.println("다시 선택하세요");
}
}while(num<1 || num>4);
//update mymember set 수정할 컬럼명 = 수정할 값 where mem_id=수정할 회원ID
scan.nextLine();
System.out.println();
System.out.print("새로운 " + updateTitle + ">>");
String updateData = scan.nextLine();
Map<String, String> paraMap = new HashMap<>();
paraMap.put("field", updateField);
paraMap.put("data", updateData);
paraMap.put("memid", memId);
int cnt = service.updateMember3(paraMap);
if(cnt>0) {
System.out.println("수정 작업 성공");
}else {
System.out.println("수정 작업 실패");
}
}
private void updateMember2() {
System.out.println();
System.out.println("수정할 회원 정보를 입력하세요.");
System.out.print("수정할 회원ID >> ");
String memId = scan.next();
int count = service.getMemberCount(memId);
if(count==0){ // 없는 회원이면...
System.out.println(memId + "은(는) 없는 회원ID입니다.");
System.out.println("수정 작업을 중단합니다.");
return;
}
MemberVO mem = service.getMember(memId);
int num; // 수정할 컬럼에 대한 선택 값이 지정될 변수
String updateField = null;
String updateTitle = null;
do {
System.out.println();
System.out.println("수정할 항목을 선택하세요.");
System.out.println("1. 회원이름 2. 비밀번호 3. 전화번호 4.회원주소");
System.out.println("----------------------------------------");
System.out.print("수정할 항목 선택>>");
num = scan.nextInt();
switch(num) {
case 1: updateField = "mem_name";
updateTitle = "회원이름"; break;
case 2: updateField = "mem_pass";
updateTitle = "비밀번호"; break;
case 3: updateField = "mem_tel";
updateTitle = "전화번호"; break;
case 4: updateField = "mem_addr";
updateTitle = "회원주소"; break;
default :
System.out.println("수정할 항목을 잘못 선택했습니다.");
System.out.println("다시 선택하세요");
}
}while(num<1 || num>4);
//update mymember set 수정할 컬럼명 = 수정할 값 where mem_id=수정할 회원ID
scan.nextLine();
System.out.println();
System.out.print("새로운 " + updateTitle + ">>");
String updateData = scan.nextLine();
int cnt = service.updateMember2(mem, updateField, updateData);
if(cnt>0){
System.out.println(memId + "회원 정보 수정 완료!!!");
}else{
System.out.println(memId + "회원 정보 수정 실패~~~");
}
}
private void displayMember() {
System.out.println();
System.out.println("===============================================");
System.out.println(" 회원ID 회원이름 비밀번호 전화번호 주 소");
System.out.println("===============================================");
List<MemberVO> list = service.getAllMember();
if(list==null||list.size()==0) {
System.out.println("출력할 회원정보가 없습니다.");
}
for(MemberVO memVo : list) {
System.out.println(memVo.getMem_id() + "\t"
+ memVo.getMem_name() + "\t"
+ memVo.getMem_pass() + "\t"
+ memVo.getMem_tel() + "\t"
+ memVo.getMem_addr() + "\t");
System.out.println("-----------------------------------------------");
}
System.out.println("===============================================");
}
private void updateMember() {
System.out.println();
System.out.println("수정할 회원 정보를 입력하세요.");
System.out.print("수정할 회원ID >> ");
String memId = scan.next();
int count = service.getMemberCount(memId);
if(count==0){ // 없는 회원이면...
System.out.println(memId + "은(는) 없는 회원ID입니다.");
System.out.println("수정 작업을 중단합니다.");
return;
}
System.out.println();
System.out.println("수정할 내용을 입력하세요.");
System.out.print("새로운 회원이름 >> ");
String memName = scan.next();
System.out.print("새로운 비밀번호 >> ");
String memPass = scan.next();
System.out.print("새로운 전화번호 >> ");
String memTel = scan.next();
scan.nextLine();
System.out.print("새로운 회원주소 >> ");
String memAddr = scan.nextLine();
MemberVO memVo = new MemberVO();
memVo.setMem_id(memId);
memVo.setMem_name(memName);
memVo.setMem_pass(memPass);
memVo.setMem_tel(memTel);
memVo.setMem_addr(memAddr);
int cnt = service.updateMember(memVo);
if(cnt>0){
System.out.println(memId + "회원 정보 수정 완료!!!");
}else{
System.out.println(memId + "회원 정보 수정 실패~~~");
}
}
private void deleteMember() {
System.out.println();
System.out.println("삭제할 회원 정보를 입력하세요.");
System.out.print("삭제할 회원ID >> ");
String memId = scan.next();
int cnt = service.deleteMember(memId);
if(cnt > 0) {
System.out.println("회원ID가 " + memId + "인 회원 삭제 성공!!");
}else {
System.out.println(memId + "은(는) 없는 회원ID이거나 "
+ "삭제에 실패했습니다.");
}
}
private void insertMember(){
System.out.println();
System.out.println("추가할 회원 정보를 입력하세요.");
int count = 0;
String memId = null; // 회원ID가 저장될 변수
do{
System.out.print("회원ID >> ");
memId = scan.next();
count = service.getMemberCount(memId);
if(count>0){
System.out.println(memId + "은(는) 이미 등록된 회원ID입니다.");
System.out.println("다른 회원ID를 입력하세요.");
}
}while(count>0);
System.out.print("회원이름 >> ");
String memName = scan.next();
System.out.print("비밀번호 >> ");
String memPass = scan.next();
System.out.print("전화번호 >> ");
String memTel = scan.next();
scan.nextLine(); // 입력 버퍼 비우기
System.out.print("회원주소 >> ");
String memAddr = scan.nextLine();
//입력한 데이터들을 VO객체에 저장한다.
MemberVO memVo = new MemberVO();
memVo.setMem_id(memId);
memVo.setMem_name(memName);
memVo.setMem_pass(memPass);
memVo.setMem_tel(memTel);
memVo.setMem_addr(memAddr);
int cnt = service.insertMember(memVo);
if( cnt>0 ){
System.out.println("회원 정보 추가 성공!!!");
}else{
System.out.println("회원 정보 추가 실패~~~");
}
}
}