2020년 11월 16일
업데이트:
EmpRun.java
public class EmpRun {
public static void main(String[] args) {
new EmpView().displayMain();
}
}
EmpView.java
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import com.kh.scott.model.service.EmpService;
import com.kh.scott.model.vo.Emp;
// View
// - 사용자의 요청을 입력받고, 응답을 출력하는 부분(화면)
public class EmpView {
private Scanner sc = new Scanner(System.in);
private EmpService empService = new EmpService();
// 메인 메뉴 역할
public void displayMain() {
int sel = 0;
do {
try { // 메뉴 입력 예외 처리 부분
System.out.println();
System.out.println("====================================");
System.out.println("[Main Menu]");
System.out.println("1. 전체 사원 정보 조회");
System.out.println("2. 사번으로 사원 정보 조회");
System.out.println("3. 새로운 사원 정보 추가");
System.out.println("4. 사번으로 사원 정보 수정");
System.out.println("5. 사번으로 사원 정보 삭제");
System.out.println("6. 사번, 이름이 모두 일치하는 사원 정보 조회");
System.out.println("0. 프로그램 종료");
System.out.println("====================================");
System.out.print("메뉴 선택 : ");
sel = sc.nextInt();
sc.nextLine();
System.out.println();
switch(sel) {
case 1 : selectAll(); break; // 1_1. 같은 클래스에 있는 selectAll()을 호출
case 2 : selectOne(); break;
case 3 : insertEmp(); break;
case 4 : updateEmp(); break;
case 5 : deleteEmp(); break;
case 6 : selectOne2(); break;
case 0 : System.out.println("프로그램 종료"); break;
default : System.out.println("잘못 입력하셨습니다.");
}
}catch(InputMismatchException e) {
System.out.println("숫자만 입력해주세요.");
sel = -1;
sc.nextLine();
}
}while(sel != 0);
}
public void selectAll() {
System.out.println("[전체 사원 정보 조회]");
//1_3. EmpService.selectAll()을 호출하여
// 전체 사원 정보가 담겨있는 List를 반환 받기
List<Emp> empList = empService.selectAll();
// 1_11. 전체 사원 조회 결과 출력
if(empList == null) { // DB 연결 간 문제 발생으로 empList 객체가 생성되지 않은 경우
System.out.println("전체 사원 정보 조회 과정에서 오류가 발생했습니다.");
} if(empList.isEmpty()) {
// DB 연결, 조회는 성공했으나 조회 결과가 없는 경우
System.out.println("조회 결과가 없습니다.");
} else {
// 조회 성공 시
for(Emp emp : empList) {
System.out.println(emp);
}
}
}
//2_2. 사번을 입력받아 사원 한 명의 정보를 조회하는 View
private void selectOne() {
System.out.println("[사번으로 사원 정보 조회]");
System.out.print("사번 입력 : ");
int empNo = sc.nextInt();
sc.nextLine();
Emp emp = empService.selectOne(empNo);
if(emp == null) {
System.out.println("조회 결과가 없습니다.");
} else {
System.out.println("사번 : " + emp.getEmpNo());
System.out.println("이름 : " + emp.geteName());
System.out.println("직책 : " + emp.getJob());
System.out.println("직속상사 : " + emp.getMgr());
System.out.println("입사일 : " + emp.getHireDate());
System.out.println("급여 : " + emp.getSal());
System.out.println("커미션 : " + emp.getComm());
System.out.println("부서번호 : " + emp.getDeptNo());
}
}
private void selectOne2() {
System.out.println("[사번, 이름이 모두 일치하는 사원 정보 조회]");
System.out.print("사번 입력 : ");
int inputNo = sc.nextInt();
sc.nextLine();
System.out.print("이름 입력 : ");
String inputName = sc.nextLine();
Emp emp = empService.selectOne2(inputNo, inputName);
if(emp == null) {
System.out.println("조회 결과가 없습니다.");
} else {
System.out.println("사번 : " + emp.getEmpNo());
System.out.println("이름 : " + emp.geteName());
System.out.println("직책 : " + emp.getJob());
System.out.println("직속상사 : " + emp.getMgr());
System.out.println("입사일 : " + emp.getHireDate());
System.out.println("급여 : " + emp.getSal());
System.out.println("커미션 : " + emp.getComm());
System.out.println("부서번호 : " + emp.getDeptNo());
}
}
// 3. 새로운 사원 정보 삽입용 View
private void insertEmp() {
System.out.println("[새로운 사원 정보 추가]");
System.out.print("사번 : ");
int empNo = sc.nextInt();
sc.nextLine();
System.out.print("이름 : ");
String eName = sc.nextLine();
System.out.print("직책 : ");
String job = sc.nextLine();
System.out.print("직속 상사 사번 : ");
int mgr = sc.nextInt();
sc.nextLine();
// HIREDATE는 insert 구문에서 SYSDATE로 작성
System.out.print("급여 : ");
int sal = sc.nextInt();
System.out.print("커미션 : ");
int comm = sc.nextInt();
System.out.print("부서 번호 :");
int deptNo = sc.nextInt();
sc.nextLine();
// 3_1. 입력받은 사원 정보를 하나의 Emp 객체에 저장할 수 있도록
// Emp 클래스에 생성자를 새로 작성한 후 객체 생성
Emp emp = new Emp(empNo, eName, job, mgr, sal, comm, deptNo);
// 3_2. EmpService 객체의 insertEmp(emp) 메소드를 호출하여
// 데이터를 DB에 삽입한 후 결과를 반환 받는다.
int result = empService.insertEmp(emp);
// 3_13. 삽입 결과에 따라 출력하기
if(result > 0) {
System.out.println("사원 정보 삽입 성공!!!!");
} else {
System.out.println("사원 정보 삽입 실패....");
}
}
private void updateEmp() {
System.out.println("[사번으로 사원 정보 수정]");
//1단계 : 사번을 입력받아 해당 사번을 가진 사원이 있는지 확인
System.out.print("정보를 수정할 사원의 사번 입력 : ");
int empNo = sc.nextInt();
sc.nextLine();
// selectOne(empNo) 재활용
//Emp emp = empService.selectOne(empNo);
//existsEmp(empNo) 메소드를 새로 작성
int check = empService.existsEmp(empNo);
//2단계 : 1단계의 결과로 있다고 판별된 경우 수정할 정보를 입력받은 후 DB 내용을 수정함
//if(emp != null) {
// 수정할 정보 입력받기
if(check > 0) {
System.out.print("직책 : ");
String job = sc.nextLine();
System.out.print("급여 : ");
int sal = sc.nextInt();
System.out.println("커미션 : ");
int comm = sc.nextInt();
sc.nextLine();
// 입력받은 값을 한 번에 전달하기 위한 Emp 객체 생성
Emp temp = new Emp(empNo, job, sal, comm);
// 생성한 Emp 객체를 DB에 전달하고 결과를 반환받기
// DML 수행 결과가 행의 개수(int형)로 반환 될 것을 예상해서
// 미리 int result로 수행 결과를 받도록 작성
int result = empService.updateEmp(temp);
// DB 수정 결과에 따른 결과 출력
if(result > 0) {
System.out.println("수정 성공!!!");
} else {
System.out.println("수정 실패...");
}
} else {
System.out.println("해당 사번을 가진 사원이 없습니다.");
}
}
private void deleteEmp() {
// 1단계 : 입력받은 사번을 가진 사원이 존재하는지 확인
// 2단계 : 1단계 결과가 있다고 판별된 경우
// "정말 삭제하시겠습니까? (Y/N) 출력 후"
// 'Y'를 입력한 경우 DB에서 삭제
System.out.println("[사번으로 사원 정보 삭제]");
System.out.print("정보를 삭제할 사원의 사번 입력 : ");
int empNo = sc.nextInt();
sc.nextLine();
int check = empService.existsEmp(empNo);
if (check > 0) {
System.out.print("정말 삭제하시겠습니까?(Y/N) :");
char yn = sc.nextLine().toUpperCase().charAt(0);
if (yn == 'Y') {
int result = empService.deleteEmp(empNo);
if(result > 0) System.out.println("삭제 성공!!!!");
else System.out.println("삭제 실패...");
}else {
System.out.println("삭제를 취소하셨습니다.");
}
} else {
System.out.println("해당 사번을 가진 사원이 없습니다.");
}
}
}
EmpService.java
import java.util.List;
import com.kh.scott.model.dao.EmpDAO;
import com.kh.scott.model.vo.Emp;
// Service (비즈니스 로직 처리)
// 1) 전달받은 데이터 또는 DAO의 수행 결과 데이터를 필요한 형태로 가공 처리
public class EmpService {
private EmpDAO empDAO = new EmpDAO();
public List<Emp> selectAll() {
// 1_4. 전체 사원 정보 조회는 별도의 데이터 가공 처리가 필요 없음
// -- > 바로 EmpDAO.selectAll()을 호출하여 결과를 반환받아야 함.
List<Emp> empList = empDAO.selectAll();
// 1_10. DAO 반환 데이터의 가공처리가 필요 없으므로 그대로 다시 반환
return empList;
}
//2. 사번으로 사원 정보 조회 Service
public Emp selectOne(int empNo) {
//2_4. 전달받은 empNo()의 별도 가공 처리가 필요 없으므로
//EmpDAO.selectOne(empNo)를 호출하여
//조회된 사원 한 명의 정보를 반환받음
Emp emp = empDAO.selectOne(empNo);
return emp;
}
public Emp selectOne2(int inputNo, String inputName) {
// 대소문자 구분없이 모두 검색 가능하게 하는 방법
// -> 입력받은 값, SQL에서 조회된 조건을 모두 대문자 또는 소문자로 통일
return empDAO.selectOne2(inputNo, inputName.toUpperCase());
}
// 3. 새로운 사원 정보 삽입용 Service
public int insertEmp(Emp emp) {
// 3_3. 전달 받은 emp를 EmpDAO 객체의 insertEmp(emp)를 전달하여
// 결과를 반환 받음.
int result = empDAO.insertEmp(emp);
//3_12. DB 수행 결과를 그대로 반환
return result; // 반환형 int로 수정
}
// 사원 정보 수정용 Service
public int updateEmp(Emp temp) {
// View에서 전달받은 emp를 DAO로 전달하고 반환받은 결과를 다시 view로 전달
return empDAO.updateEmp(temp);
}
// 사번이 일치하는 사원 유무 판단용 service
public int existsEmp(int empNo) {
// 별도의 가공 처리 없이 EmpDAO.existsEmp(empNo)를 호출하여
// 결과를 바로 view에 반환
return empDAO.existsEmp(empNo);
}
public int deleteEmp(int empNo) {
return empDAO.deleteEmp(empNo);
}
}
Emp.java
import java.sql.Date;
/* VO(Value Object) === DTO(Data Transfer Object)
* --> DB 테이블의 한 행의 정보가 기록되는 저장용 객체
*
* 1. 반드시 캡슐화 적용
* 2. getter/setter 반드시 작성
* 3. 기본 생성자 필수, 매개변수 있는 생성자 선택
* 4. VO에 로직이 포함된 메소드는 지양
*
* */
public class Emp {
private int empNo; // 사번
private String eName; // 이름
private String job; // 직책
private int mgr; // 직속 상사
// java.sql.Date
private Date hireDate; // 입사일
private int sal; // 급여
private int comm; // 커미션
private int deptNo; // 부서번호
// 기본 생성자
public Emp() {
}
// 사원 정보 수정을 위한 생성자
public Emp(int empNo, String job, int sal, int comm) {
super();
this.empNo = empNo;
this.job = job;
this.sal = sal;
this.comm = comm;
}
// 사원 정보 삽입을 위해서 만든 생성자
public Emp(int empNo, String eName, String job, int mgr, int sal, int comm, int deptNo) {
super();
this.empNo = empNo;
this.eName = eName;
this.job = job;
this.mgr = mgr;
this.sal = sal;
this.comm = comm;
this.deptNo = deptNo;
}
public Emp(int empNo, String eName, String job, int mgr, Date hireDate, int sal, int comm, int deptNo) {
this(empNo, eName, job, mgr, sal, comm, deptNo);
this.hireDate = hireDate;
}
public int getEmpNo() {
return empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public String geteName() {
return eName;
}
public void seteName(String eName) {
this.eName = eName;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
public int getComm() {
return comm;
}
public void setComm(int comm) {
this.comm = comm;
}
public int getDeptNo() {
return deptNo;
}
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
@Override
public String toString() {
return "Emp [empNo=" + empNo + ", eName=" + eName + ", job=" + job + ", mgr=" + mgr + ", hireDate=" + hireDate
+ ", sal=" + sal + ", comm=" + comm + ", deptNo=" + deptNo + "]";
}
}
EmpDAO.java
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
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 com.kh.scott.model.vo.Emp;
public class EmpDAO {
// DB에 있는 EMP 테이블의 모든 사원 정보를 조회 DAO
public List<Emp> selectAll() {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
List<Emp> empList = null;
// DB에서 조회한 결과를 저장할 List
try {
//1_5. JDBC 드라이버 클래스 메모리에 로드
Class.forName("oracle.jdbc.driver.OracleDriver");
//1_6. DB와의 연결 작업 준비
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
// 1_7. DB 접속 성공 시 DB에다가 전달할 SQL 구문을 준비하고
// 이를 전달하여 결과를 얻어올 객체 Statement 객체 생성
String query = "SELECT * FROM EMP ORDER BY EMPNO";
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
// 1_8. ResultSet rset에 있는 SELECT 처리 결과를
// JAVA 단에서 쉽게 사용할 수 있도록
// List 객체에 저장 시키기
empList = new ArrayList<Emp>();
while(rset.next()) {
// ResultSet.next() : 반환받은 조회 결과를 커서를 이용해 순차적으로 한 행씩 접근
// 접근한 행이 존재하면 true, 없으면 false
int empNo = rset.getInt("EMPNO"); // 7369
String eName = rset.getString("ENAME"); // SMITH
String job = rset.getString("JOB");
int mgr = rset.getInt("MGR");
Date hireDate = rset.getDate("HIREDATE");
int sal = rset.getInt("SAL");
int comm = rset.getInt("COMM");
int deptNo = rset.getInt("DEPTNO");
empList.add(new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo));
}
}catch(ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 1_9. JDBC 관련 객체 연결 끊기(자원 반환)
try {
if(rset != null) rset.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
return empList;
}
public Emp selectOne(int empNO) {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
Emp emp = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe",
"scott", "tiger");
String query = "SELECT * FROM EMP WHERE EMPNO = " + empNO;
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if(rset.next()) {
int empNo = rset.getInt("EMPNO");
String eName = rset.getString("ENAME");
String job = rset.getString("JOB");
int mgr = rset.getInt("MGR");
Date hireDate = rset.getDate("HIREDATE");
int sal = rset.getInt("SAL");
int comm = rset.getInt("COMM");
int deptNo = rset.getInt("DEPTNO");
emp = new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo);
}
}catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rset != null) rset.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
return emp;
}
public Emp selectOne2(int inputNo, String inputName) {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
Emp emp = null;
try {
// SQL 작성
String query = "SELECT * FROM EMP WHERE EMPNO = " + inputNo +
"AND UPPER(ENAME) = '" + inputName + "'";
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if(rset.next()) {
int empNo = rset.getInt("EMPNO");
String eName = rset.getString("ENAME");
String job = rset.getString("JOB");
int mgr = rset.getInt("MGR"); Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe",
"scott", "tiger");
Date hireDate = rset.getDate("HIREDATE");
int sal = rset.getInt("SAL");
int comm = rset.getInt("COMM");
int deptNo = rset.getInt("DEPTNO");
emp = new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo);
}
}catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rset != null) rset.close();
if(stmt != null) rset.close();
if(conn != null) rset.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
return emp;
}
// 3. 새로운 사원 정보 삽입용 DAO
public int insertEmp(Emp emp) {
// 3_4. JDBC 드라이버 등록 및 DB 연결 관련 변수 선언
Connection conn = null;
PreparedStatement pstmt = null;
int result = 0;
/* PreparedStatement
* - Statement의 자식으로 좀 더 향상된 기능을 제공함.
* - ? (위치 홀더)를 이용하여 SQL에 작성되는
* 리터럴 값을 동적으로 작성함.
*
* - 코드 안정성과 가독성이 증가함
* - 코드길이가 늘어나는 단점이 존재함
*
*/
try {
//3_5. JDBC 드라이버 로드 및 커넥션 얻어오기.
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe",
"scott", "tiger");
//3_6. 자동 커밋 방지
// JDBD에서 DML 구문 수행 시 별도 조작이 없으면
// 한 행이 수행되자마자 commit이 수행됨
conn.setAutoCommit(false);
// --> 한 행 수행 시 자동 COMMIT이 되지 않게함
// 단, 추후 COMMIT, ROLLBACK 없이
// conn.close();가 수행되면 모든 내용이 commit됨
// 3_7. SQL 작성 후 PreparedStatement 객체 생성
String query =
"INSERT INTO EMP VALUES(?, ?, ?, ?, SYSDATE, ?, ? ,?)";
pstmt = conn.prepareStatement(query);
// 3_8. SQL 구문의 ?(위치 홀더)에 알맞은 값 대입
pstmt.setInt(1, emp.getEmpNo());
pstmt.setString(2, emp.geteName());
pstmt.setString(3, emp.getJob());
pstmt.setInt(4, emp.getMgr());
pstmt.setInt(5, emp.getSal());
pstmt.setInt(6, emp.getComm());
pstmt.setInt(7, emp.getDeptNo());
// 3_9. SQL 구문 수행 결과를 전달받음
// DML 구문 수행시 exectuteUpdate() 호출
// DB에서 DML 구문 수행 시 DML 구문 수행이 성공한 행의 개수를 반환하다.
result = pstmt.executeUpdate();
// executeUpdate() : DML의 성공한 행의 개수를 반환
// executeQuery() : SELECT의 조회 결과인 ResultSet 반환
// 트랜잭션 처리(commit, rollback 처리)
if(result > 0) conn.commit();
else conn.rollback();
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
//3_10. 사용한 JDBC 객체 반환
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
// 3_11. DML 수행 결과(result)를 반환
return result;
}
public int updateEmp(Emp emp) {
Connection conn = null;
PreparedStatement pstmt = null;
int result = 0; // 결과 저장용 변수
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe",
"scott", "tiger");
conn.setAutoCommit(false); //DML 자동 커밋 방지
String query = "UPDATE EMP SET JOB=?, SAL=?, COMM=? WHERE EMPNO = ?";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, emp.getJob());
pstmt.setInt(2, emp.getSal());
pstmt.setInt(3, emp.getComm());
pstmt.setInt(4, emp.getEmpNo());
result = pstmt.executeUpdate();
if(result > 0) conn.commit();
else conn.rollback();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
// 사번이 일치하는 사원 유무 판단용 DAO
public int existsEmp(int empNo) {
// JDBC 관련 변수 선언 및 결과 저장 변수 선언
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
int result = 0;
try {
// JDBC 드라이버 로드 및 커넥션 얻어오기
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe",
"scott", "tiger");
String query = "SELECT COUNT(*) FROM EMP WHERE EMPNO = " + empNo;
stmt = conn.createStatement();
// SQL 수행 및 결과 반환
rset = stmt.executeQuery(query);
// 조회 결과가 있을 경우 해당 결과를 result에 저장
if(rset.next()) {
result = rset.getInt(1); // 조회 결과 컬럼 인덱스
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 사용한 JDBC 객체 반환
try {
if(rset != null) rset.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
public int deleteEmp(int empNo) {
Connection conn = null;
PreparedStatement pstmt = null;
int result = 0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe",
"scott", "tiger");
conn.setAutoCommit(false);
String query = "DELETE FROM EMP WHERE EMPNO = " + empNo;
pstmt = conn.prepareStatement(query);
result = pstmt.executeUpdate();
if(result > 0) conn.commit();
else conn.rollback();
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
}
댓글남기기