MVC패턴 - JDBC , CRUD
MVC (Model, View, Controller)
Model ==> 데이터 및 데이터를 만들기 위한 작업
View ==> 사용자에게 데이터를 보여주는 작업
Controller ==> 사용자의 요청을 받아서 Model을 작성하고
작성된 Model을 View에 전달하는 작업을 진행한다.
-----------------------------------------------------------------------------------
- MVC 패턴의 비지니스 로직을 처리하는 클래스들...
1. VO, DTO ==> 데이터를 저장하는 역할만 하는 클래스
(VO => Value Object, DTO => Data Transfer Object)
2. DAO ==> SQL문을 DB서버에 보내서 결과를 얻어오는 역할을 수행하는 클래스
(DAO => Data Access Object)
3. Service ==> 작업을 수행하는 중간 관리자와 같은 역할을 수행하는 클래스
서비스는 일이 있으면 그 일에 필요한 DAO를 호출해서 일을 처리한 후
처리 결과를 Controller에게 전달한다.
4. Controller ==> 비지니스 로직이 시작되는 곳으로 사용자의 요청이 오면
그 요청에 맞는 Service에게 일을 시키고 Sercvice가 보내온 처리결과를
View에 보내서 화면에 반영시키는 일을 수행한다.
1. model 1을 이용한 게시판 crud
* controller , dao, service, vo 생성
1) vo
package kr.or.ddit.mvc.vo;
/*
DB테이블에 있는 컬럼을 기준으로 데이터를 객체화 할 클래스
DB 테이블의 '컬럼명'이 이 클래스의 '멤버변수'가 된다.
DB 테이블의 컬럼과 클래스의 멤버변수를 매핑하는 역할을 수행한다.
오라클에서 컬럼명이 대문자여도 자바에서 소문자로 써도 됨
*/
public class MemberVO {
private String mem_id;
private String mem_pass;
private String mem_name;
private String mem_tel;
private String mem_addr;
// VO클래스에서 별도의 생성자를 만들 때에는 기본생성자도 반드시 같이 만들어 준다.
// (아무일 안해도 기본생성자는 필수임)
// getter, setter
public String getMem_id() {
return mem_id;
}
public void setMem_id(String mem_id) {
this.mem_id = mem_id;
}
public String getMem_pass() {
return mem_pass;
}
public void setMem_pass(String mem_pass) {
this.mem_pass = mem_pass;
}
public String getMem_name() {
return mem_name;
}
public void setMem_name(String mem_name) {
this.mem_name = mem_name;
}
public String getMem_tel() {
return mem_tel;
}
public void setMem_tel(String mem_tel) {
this.mem_tel = mem_tel;
}
public String getMem_addr() {
return mem_addr;
}
public void setMem_addr(String mem_addr) {
this.mem_addr = mem_addr;
}
@Override
public String toString() {
return "MemberVO [mem_id=" + mem_id + ", mem_pass=" + mem_pass + ", mem_name=" + mem_name + ", mem_tel="
+ mem_tel + ", mem_addr=" + mem_addr + "]";
}
}
2) Dao
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<br><br>
*
* 메서드 하나가 DB와 관련된 작업 1개를 수행하도록 작성한다.
*
* MVC패턴에서는 데이터를 여러개로 보내는 것을 추천하지 않음!!!
*
*
*
*/
public interface IMemberDao {
/**
* MemberVO객체에 담겨진 자료를 DB에 insert하는 메서드
*
* @param memVo DB에 insert할 자료가 저장된 MemberVO객체
* @return 작업 성공 : 1, 작업 실패 : 0
*/
public int insertMember(MemberVO memVo);
/**
* 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
*
* @param memId 삭제할 회원ID
* @return 작업 성공 : 1, 작업 실패 : 0
*/
public int deleteMember(String memId);
/**
* MemberVO자료를 이용하여 DB에 update하는 메서드
*
* @param memVo update할 회원 정보가 저장된 MemberVO객체
* @return 작업 성공: 1, 작업 실패 : 0
*/
public int updateMember(MemberVO memVo);
/**
* DB의 전체 회원 정보를 가져와서 List에 담아서 반환하는 메서드
* @return MemberVO객체가 저장된 List객체
*/
public List<MemberVO> getAllMember();
/**
* 회원ID를 인수값으로 받아서 해당 회원ID의 개수를 반환하는 메서드
* @param memId 검색할 회원ID
* @return 검색된 회원ID의 개수
*/
public int getMemberCount(String memId);
/**
* Map의 정보를 이용하여 회원 정보 중 원하는 컬럼을 수정하는 메서드
* key값 정보 : 수정할컬럼명 : field, 수정할데이터: data, 회원ID: memid
*
* @param paramMap 수정할 컬럼명, 수정할 데이터, 수정할 회원ID가 저장된 Map객체
* @return 작업 성공 : 1, 작업 실패 : 0
*/
public int updateMember2(Map<String,String> paramMap);
}
package kr.or.ddit.mvc.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import kr.or.ddit.mvc.vo.MemberVO;
import kr.or.ddit.util.DBUtil;
import kr.or.ddit.util.DBUtil3;
public class MemberDaoImpl implements IMemberDao {
//싱글톤 만들기 과정 1 ~ 3
// 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_pass, mem_name, mem_tel, mem_addr)"
+ "values(?, ?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memVo.getMem_id());
pstmt.setString(2, memVo.getMem_pass());
pstmt.setString(3, memVo.getMem_name());
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 from 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_pass =?, mem_name =?,"
+ "mem_tel =?, mem_addr =?"
+ "where mem_id =?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memVo.getMem_pass());
pstmt.setString(2, memVo.getMem_name());
pstmt.setString(3, memVo.getMem_tel());
pstmt.setString(4, memVo.getMem_addr());
pstmt.setString(5, 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 List<MemberVO> getAllMember() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
List<MemberVO> memList = null; // 반환값이 저장될 변수
try {
conn = DBUtil3.getConnection();
String sql = "select * from mymember";
pstmt = conn.prepareStatement(sql);
rs= pstmt.executeQuery();
memList = new ArrayList<MemberVO>(); // List객체 생성
while(rs.next()) {
MemberVO memVo = new MemberVO(); // 1개의 레코드를 저장할 VO객체 생성
// DB의 컬럼값을 가져와 VO의 멤버변수에 저장한다.
memVo.setMem_id(rs.getString("mem_id"));
memVo.setMem_pass(rs.getString("mem_pass"));
memVo.setMem_name(rs.getString("mem_name"));
memVo.setMem_tel(rs.getString("mem_tel"));
memVo.setMem_addr(rs.getString("mem_addr"));
//VO객체를 List에 추가한다.
memList.add(memVo);
}
} catch (SQLException e) {
memList = null;
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 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(Map<String, String> paramMap) {
Connection conn = null;
PreparedStatement pstmt = null;
int cnt = 0;
try {
//key값 정보 : 수정할컬럼명 : field, 수정할데이터: data, 회원ID: memid
conn = DBUtil3.getConnection();
String sql = "update mymember set " + paramMap.get("field") + " = ? where mem_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, paramMap.get("data"));
pstmt.setString(2, paramMap.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;
}
}
3)service
package kr.or.ddit.mvc.service;
import java.util.List;
import java.util.Map;
import kr.or.ddit.mvc.vo.MemberVO;
/**
* Service객체는 DAO에 작성된 메서드를 원하는 작업에 맞게 호출하여 실행하고
* 그 결과를 받아서 Controller에게 전달하는 역할을 한다.
* 보통은 DAO의 메서드 구조와 같게 만든다.
*/
public interface IMemberService {
/**
* MemberVO객체에 담겨진 자료를 DB에 insert하는 메서드
*
* @param memVo DB에 insert할 자료가 저장된 MemberVO객체
* @return 작업 성공 : 1, 작업 실패 : 0
*/
public int insertMember(MemberVO memVo);
/**
* 회원ID를 인수값으로 받아서 해당 회원 정보를 삭제하는 메서드
*
* @param memId 삭제할 회원ID
* @return 작업 성공 : 1, 작업 실패 : 0
*/
public int deleteMember(String memId);
/**
* MemberVO자료를 이용하여 DB에 update하는 메서드
*
* @param memVo update할 회원 정보가 저장된 MemberVO객체
* @return 작업 성공: 1, 작업 실패 : 0
*/
public int updateMember(MemberVO memVo);
/**
* DB의 전체 회원 정보를 가져와서 List에 담아서 반환하는 메서드
* @return MemberVO객체가 저장된 List객체
*/
public List<MemberVO> getAllMember();
/**
* 회원ID를 인수값으로 받아서 해당 회원ID의 개수를 반환하는 메서드
* @param memId 검색할 회원ID
* @return 검색된 회원ID의 개수
*/
public int getMemberCount(String memId);
/**
* Map의 정보를 이용하여 회원 정보 중 원하는 컬럼을 수정하는 메서드
* key값 정보 : 수정할컬럼명 : field, 수정할데이터: data, 회원ID: memid
*
*
* @param paramMap 수정할 컬럼명, 수정할 데이터, 수정할 회원ID가 저장된 Map객체
* @return 작업 성공 : 1, 작업 실패 : 0
*/
public int updateMember2(Map<String,String> paramMap);
}
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 {
// 1번
private static MemberServiceImpl service;
private IMemberDao dao; //DAO객체 변수 선언
// 생성자 ==> 번
// public MemberServiceImpl() {
private MemberServiceImpl() {
// dao = new MemberDaoImpl(); //DAO객체 생성
dao = MemberDaoImpl.getInstance(); // DAO객체 생성 (싱글톤 적용된거
}
//3번
public static MemberServiceImpl getInstance() {
if(service == null) service = new MemberServiceImpl();
return service;
}
@Override
public int insertMember(MemberVO memVo) {
return dao.insertMember(memVo);
}
@Override
public int deleteMember(String memId) {
return dao.deleteMember(memId);
}
@Override
public int updateMember(MemberVO memVo) {
// TODO Auto-generated method stub
return dao.updateMember(memVo);
}
@Override
public List<MemberVO> getAllMember() {
return dao.getAllMember();
}
@Override
public int getMemberCount(String memId) {
return dao.getMemberCount(memId);
}
@Override
public int updateMember2(Map<String, String> paramMap) {
return dao.updateMember2(paramMap);
}
}
3) controller
package kr.or.ddit.mvc.controller;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
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;
import kr.or.ddit.util.DBUtil3;
public class MemberController {
private IMemberService service;
Scanner scan;
// 생성자
public MemberController() {
service = MemberServiceImpl.getInstance();
scan = new Scanner(System.in);
}
public static void main(String[] args) {
new MemberController().startMember();
}
// 시작 메서드
public void startMember() {
System.out.println();
System.out.println("******************************************");
System.out.println(" 회 원 관 리 프 로 그 램");
System.out.println("******************************************");
System.out.println();
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 : // 수정2
updateMember2(); break;
case 0 : // 작업 끝.
System.out.println("회원 관리 프로그램을 마칩니다...");
return;
default :
System.out.println("작업 번호를 잘못 입력했습니다. 다시 입력하세요.");
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 + "은(는) 등록되지 않은 회원입니다.");
System.out.println("수정 작업을 마칩니다...");
return;
}
// 수정할 항목을 선택하기
int num; // 수정할 항목의 선택 번호
String updateField = null; // 수정할 컬럼명이 저장될 변수
String updateTitle = null; // 입력할 때 출력할 제목이 저장될 변수
do {
System.out.println();
System.out.println("수정할 항목을 선택하세요...");
System.out.println("1.비밀번호 2.회원이름 3.전화번호 4.회원주소");
System.out.print("수정할 항목 선택 >> ");
num = scan.nextInt();
switch (num) {
case 1: updateField = "mem_pass"; updateTitle="비밀번호"; break;
case 2: updateField = "mem_name"; 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);
scan.nextLine(); // 입력 버퍼 비우기
System.out.println();
System.out.print("새로운" + updateTitle + " >> ");
String updateData = scan.nextLine();
// 만들어진 데이터를 저장할 Map객체 생성
Map<String, String> pMap = new HashMap<String, String>();
// 데이터를 Map에 추가
pMap.put("field", updateField);
pMap.put("data", updateData);
pMap.put("memid", memId);
int cnt = service.updateMember2(pMap);
if(cnt >0) {
System.out.println("수정 작업 성공 !!!");
}else {
System.out.println("수정 작업 실패 ~~~");
}
}
private void displayMember() {
List<MemberVO> memList=service.getAllMember();
System.out.println();
System.out.println("----------------------------------------------------");
System.out.println(" ID 비밀번호 이름 전화번호 주소");
System.out.println("----------------------------------------------------");
if(memList==null || memList.size()==0) {
System.out.println("등록된 회원 정보가 하나도 없습니다...");
}else {
for(MemberVO mvo : memList) {
String memId = mvo.getMem_id();
String memPass = mvo.getMem_pass();
String memName = mvo.getMem_name();
String memTel = mvo.getMem_tel();
String memAddr = mvo.getMem_addr();
System.out.println(" " + memId + " " + memPass + " " + memName + " " + memTel + " " + memAddr );
}
}
System.out.println("----------------------------------------------------");
}
private void updateMember() {
System.out.println();
System.out.println("수정할 회원 정보를 입력하세요...");
System.out.print("회원 아이디 >> ");
String memId=scan.next();
int count=service.getMemberCount(memId);
if(count==0) {
System.out.println(memId+"은(는) 등록되지 않은 회원입니다.");
System.out.println("수정 작업을 마칩니다....");
return;
}
System.out.print("새로운 비밀번호 >> ");
String newMemPass=scan.next();
System.out.print("새로운 이름 >>");
String newMemName=scan.next();
System.out.print("새로운 전화번호 >> ");
String newMemTel=scan.next();
scan.nextLine();//버퍼 비우기
System.out.print("새로운 회원주소 >>");
String newMemAddr=scan.nextLine();
// 수정할 데이터를 VO객체에 저장한다.
MemberVO memVo=new MemberVO();
memVo.setMem_id(memId);
memVo.setMem_pass(newMemPass);
memVo.setMem_name(newMemName);
memVo.setMem_tel(newMemTel);
memVo.setMem_addr(newMemAddr);
int cnt=service.updateMember(memVo);
if(cnt>0) {
System.out.println("회원ID가 "+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+" 회원은 없는 회원이거나 삭제에 실패했습니다~~~");
}
}
private void insertMember() {
System.out.println();
System.out.println("추가할 회원 정보를 입력하세요...");
int count=0; //회원ID의 개수가 저장될 변수
String memId; //회원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 memPass=scan.next();
System.out.print("회원이름 >> ");
String memName=scan.next();
System.out.print("전화번호 >> ");
String memTel=scan.next();
scan.nextLine(); //입력 버퍼 비우기
System.out.print("회원주소 >> ");
String memAddr=scan.nextLine();
// MemberVO객체에 입력한 데이터를 저장한다.
MemberVO memVo=new MemberVO();
memVo.setMem_id(memId);
memVo.setMem_pass(memPass);
memVo.setMem_name(memName);
memVo.setMem_tel(memTel);
memVo.setMem_addr(memAddr);
int cnt=service.insertMember(memVo);
if(cnt>0) {
System.out.println(memId+" 회원 정보 추가 완료!!!");
}else {
System.out.println(memId+" 회원 정보 추가 실패!!!");
}
}
// 메뉴를 출력하고 입력한 작업 번호를 반환하는 메서드
private int displayMenu() {
System.out.println();
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(" 작업 번호 입력 >> ");
return scan.nextInt();
}
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(conn != null) try { conn.close(); } catch(SQLException e ) {}
if(pstmt != null) try { pstmt.close(); } catch(SQLException e ) {}
if(rs != null) try { rs.close(); } catch(SQLException e ) {}
}
return count;
}
}