seong

JDBC AppService 만들기(SCOTT) 본문

데이터베이스/JDBC

JDBC AppService 만들기(SCOTT)

hyeonseong 2022. 8. 17. 17:53

service 패키지 내부 클래스 만들기

직원(emp)과 부서(dept)들의 DB의 기본 파일(엔티티,메서드,Connection)들을 가져온다

추가로 실행 파일 main은 이후 작성


MyService 작성

MyService의 역할

메서드를 통해 실행 서비스를 가능하게 해주는 클래스 이기 때문에 empDao,deptDao가 모두 갖는다.

Myservice는 empDao, deptDao가 없다면 실행을 할 수 없는 서비스이다, 즉 의존성을 갖게 된다.

하지만 여기서 MyService는 empDao인가? ->불가능 하다,즉  상속을 받을수 없다.

그래서 컴포지션을 하게된다.(has , 가진다 라고 생각하면 이해가 더 잘된다.) 

=> MyService는 empDao,deptDao를 가진다(has) 

컴포지션 작성 

1. 필요한 클래스를 변수화 시켜준다.

private를 사용해 컴포지션할 클래스를 변수화 시켜줌.

2. 실행할때 초기화가 되어야하므로 생성자를 만들어준다. 

오른쪽 마우스 -> Source -> using Fields

3. MyService의 생성자를 만들어 매개변수로 넣어준다. 

생성자의 매개변수로 EmpDao클래스 DeptDao가 들어가있다.

4. 앱의 실행 클래스 작성 MyApp(main) 

main에서 EmpDao,DeptDao의 객체 생성.

MyService의 객체를 생성할때는 컴포지션한 empDao, deptDao인자 값으로 전달해준다. 

MyService에서 객체를 만들수도 있지만 main에서 객체를 생성하는 이유는 MyServices는 단순 서비스(기능)들의 집합이기 때문이다.객체를 만들고 실행 하는 부분은 main이 담당 해야한다.

MyService클래스에서 변수,생성자 만들고 main에서는 객체 생성 및 인자 값으로 전달 해주었다.


MyService 에 TF팀을 창설하는 메서드 작성

부서를 창설하고,직원을 넣어 주어야한다.

직원을 관리하는 Dao(EmpDao), 부서를 관리하는 Dao(DeptDao)의 기능들이 합쳐지기 때문에 처음 만들어봐서 어려웠다..

만드는 순서

1.TF팀 창설에 필요한 매개변수 1. 추가할 부서 Dept값, 2.직원의 empno를 담을 ArrayList(직원은 몇명인지 알 수 없기 때문에 동적 으로 할당해줄 배열인 ArrayList, empno가 Int이기 때문에 <Integer>)

2. TF부서 추가(INSERT)

3. 직원의 프라이 머리 키로 부서에 직원을 추가한다. (UPDATE)

Emp 테이블의 empno(프라이머리키)값 7369,7499를  TF부서에 추가하는 코드

empDao.직원수정(empnos.get(i),dept.getDeptno());&nbsp; 해석 : 직원 수정 메서드의 인자 값은 empno,deptno이다. 현재 TF창설 메서드에서 empno&nbsp; = ArrayList의 값, deptno = 추가된 dept이다.

실행순서

1. INSERT는 부서를 1개 추가 성공하면 r1값으로 1을 반환해준다.

2. if 만약 성공해서 r1이 1이 되면 직원을 추가를 실행 해준다.

3. for 직원의 수정UPDATE가 성공적으로 이루어지면 r2에 1이 반환된다. 

4. 만약 r2 직원 수정이 올바르게 수행 되지 않으면 반복문을 종료한다. 

이 코드에는 문제점이 있다. 

트랜젝션이 다 될 수도있고, 하나도 안될 수도있고, 하나만 될 수도 있다.

이런것은 DB원자성의 원칙에 위배한다, 즉 다 되거나, 다 실패하거나 둘중 하나만 해야 한다. 

ex) 부서는 추가되었지만 직원은 추가되지 않았다, 부서가 추가되고, 직원1은 추가됬지만 직원2는 추가되지 않았다.

수정 과정

1. 각 Dao에 있는 Connection을 모두 지워준다 (트랜젝션을 관리하기 위함)

2. Connection을 컴포지션화 시켜준다

3. DBConnection에서 conn이 자동으로 Commit가 되지 않게 한다.

setAutoCommit(fasle) 

4. main 에서 컴포지션된 conn을 생성해 Dao에 넣어 연결 시켜준다. 


소스코드 부분

DBConnection.java

package service;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnection {
	// public이 붙어야 다른 패키지에서 import 가능
	public static Connection connection() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:xe", 
					"SCOTT", 
					"TIGER"
			);
			conn.setAutoCommit(false);
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

Dept.java

package service;

public class Dept {
	private int deptno;
	private String dname;
	private String loc;
	
	public Dept() {
	
	}

	public Dept(int deptno, String dname, String loc) {
		this.deptno = deptno;
		this.dname = dname;
		this.loc = loc;
	}

	public int getDeptno() {
		return deptno;
	}

	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}

	public String getDname() {
		return dname;
	}

	public void setDname(String dname) {
		this.dname = dname;
	}

	public String getLoc() {
		return loc;
	}

	public void setLoc(String loc) {
		this.loc = loc;
	}
	
	
}

DeptDao.java

package service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class DeptDao {
	
	private Connection conn;
	
	public DeptDao(Connection conn) {
		this.conn = conn;
	}
	
	
	public int 부서수정(String dname, String loc, int deptno) {
		int result = -1;
		try {
			// 1. SQL 작성
			StringBuilder sql = new StringBuilder();
			sql.append("UPDATE dept SET dname = ?, loc = ? WHERE deptno = ?");
			
			// 3. 문장 완성
			PreparedStatement pstmt = conn.prepareStatement(sql.toString());
			// 물음표 번호는 1부터 시작!!
			pstmt.setString(1, dname);
			pstmt.setString(2, loc);
			pstmt.setInt(3, deptno);
			
			// 4. 문장 전송
			result = pstmt.executeUpdate(); // 문장전송, commit
			
			// result = 1 행 하나 변경, 0 변경 안됨, -1 오류
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public int 부서삭제(int deptno) {
		int result = -1;
		try {
			// 1. SQL 작성
			StringBuilder sql = new StringBuilder();
			sql.append("DELETE FROM dept WHERE deptno = ?");
			
			// 3. 문장 완성
			PreparedStatement pstmt = conn.prepareStatement(sql.toString());
			// 물음표 번호는 1부터 시작!!
			pstmt.setInt(1, deptno);
			
			// 4. 문장 전송
			result = pstmt.executeUpdate(); // 문장전송, commit
			
			// result = 1 행 하나 변경, 0 변경 안됨, -1 오류
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public int 부서추가(Dept dept) {
		int result = -1;
		try {
			// 1. SQL 작성
			StringBuilder sql = new StringBuilder();
			sql.append("INSERT INTO dept ");
			sql.append("VALUES(?, ?, ?)");
			
			// 3. 문장 완성
			PreparedStatement pstmt = conn.prepareStatement(sql.toString());
			// 물음표 번호는 1부터 시작!!
			pstmt.setInt(1, dept.getDeptno());
			pstmt.setString(2, dept.getDname());
			pstmt.setString(3, dept.getLoc());

			
			// 4. 문장 전송
			result = pstmt.executeUpdate(); // 문장전송, commit
			
			// result = 1 행 하나 변경, 0 변경 안됨, -1 오류
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	public ArrayList<Dept> 부서목록보기() {
		ArrayList<Dept> depts = new ArrayList<>();
		try {
			PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM dept");
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				Dept dept = new Dept();
				dept.setDeptno(rs.getInt("deptno"));
				dept.setDname(rs.getString("dname"));
				dept.setLoc(rs.getString("loc"));

				depts.add(dept);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return depts;
	} // end of 부서목록보기
	
	public Dept 부서한건보기(int deptno) {
		Dept dept = new Dept();
		try {
			PreparedStatement pstmt = 
					conn.prepareStatement("SELECT * FROM dept WHERE deptno = ?");
			pstmt.setInt(1, deptno);
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {
				dept.setDeptno(rs.getInt("deptno"));
				dept.setDname(rs.getString("dname"));
				dept.setLoc(rs.getString("loc"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dept;
	} // end of 부서한건보기
}

Emp.java

package service;

import java.sql.Timestamp;

// 엔티티
public class Emp {
	private int empno;
	private String ename;
	private String job;
	private int mgr;
	private Timestamp hiredate;
	private int sal;
	private int comm;
	private int deptno;
	

	
	public Emp() {
		// TODO Auto-generated constructor stub
	}
	
	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 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 Timestamp getHiredate() {
		return hiredate;
	}
	public void setHiredate(Timestamp 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;
	}
	
	
}

EmpDao.java

package service;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;

// Data, Access, Object
public class EmpDao {
	
	private Connection conn;
	
	public EmpDao(Connection conn) {
		this.conn = conn;
	}
	
	public  int 직원수정(int empno, String ename) {
		int result = -1;
		try {
			// 1. SQL 작성
			StringBuilder sql = new StringBuilder();
			sql.append("UPDAT emp SET ename = ? WHERE empno = ?");
			
			// 3. 문장 완성
			PreparedStatement pstmt = conn.prepareStatement(sql.toString());
			// 물음표 번호는 1부터 시작!!
			pstmt.setString(1, ename);
			pstmt.setInt(2, empno);
			
			// 4. 문장 전송
			result = pstmt.executeUpdate(); // 문장전송, commit
			
			// result = 1 행 하나 변경, 0 변경 안됨, -1 오류
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public  int 직원수정(int empno, int deptno) {
		int result = -1;
		try {
			// 1. SQL 작성
			StringBuilder sql = new StringBuilder();
			sql.append("UPDAT emp SET deptno = ? WHERE empno = ?");
			
			// 3. 문장 완성
			PreparedStatement pstmt = conn.prepareStatement(sql.toString());
			// 물음표 번호는 1부터 시작!!
			pstmt.setInt(1, deptno);
			pstmt.setInt(2, empno);
			
			// 4. 문장 전송
			result = pstmt.executeUpdate(); // 문장전송, commit
			
			// result = 1 행 하나 변경, 0 변경 안됨, -1 오류
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public int 직원삭제(int empno) {
		int result = -1;
		try {
			// 1. SQL 작성
			StringBuilder sql = new StringBuilder();
			sql.append("DELETE FROM emp WHERE empno = ?");
			
			// 3. 문장 완성
			PreparedStatement pstmt = conn.prepareStatement(sql.toString());
			// 물음표 번호는 1부터 시작!!
			pstmt.setInt(1, empno);
			
			// 4. 문장 전송
			result = pstmt.executeUpdate(); // 문장전송, commit
			
			// result = 1 행 하나 변경, 0 변경 안됨, -1 오류
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public int 직원추가(Emp emp) {
		int result = -1;
		try {
			// 1. SQL 작성
			StringBuilder sql = new StringBuilder();
			sql.append("INSERT INTO emp ");
			sql.append("VALUES(?, ?, ?, ?, sysdate, ?, ?, ?)");
			
			// 3. 문장 완성
			PreparedStatement pstmt = conn.prepareStatement(sql.toString());
			// 물음표 번호는 1부터 시작!!
			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());
			
			// 4. 문장 전송
			result = pstmt.executeUpdate(); // 문장전송, commit
			
			// result = 1 행 하나 변경, 0 변경 안됨, -1 오류
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	public ArrayList<Emp> 직원목록보기() {
		ArrayList<Emp> emps = new ArrayList<>();
		try {

			PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM emp");
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				Emp emp = new Emp();
				emp.setEmpno(rs.getInt("empno"));
				emp.setEname(rs.getString("ename"));
				emp.setJob(rs.getString("job"));
				emp.setMgr(rs.getInt("mgr"));
				emp.setHiredate(rs.getTimestamp("hiredate"));
				emp.setSal(rs.getInt("sal"));
				emp.setComm(rs.getInt("comm"));
				emp.setDeptno(rs.getInt("deptno"));
				emps.add(emp);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return emps;
	} // end of 직원목록보기
	
	public Emp 직원한건보기(int empno) {
		Emp emp = new Emp();
		try {
			PreparedStatement pstmt = 
					conn.prepareStatement("SELECT * FROM emp WHERE empno = "+empno);
			ResultSet rs = pstmt.executeQuery();
			if(rs.next()) {
				emp.setEmpno(rs.getInt("empno"));
				emp.setEname(rs.getString("ename"));
				emp.setJob(rs.getString("job"));
				emp.setMgr(rs.getInt("mgr"));
				emp.setHiredate(rs.getTimestamp("hiredate"));
				emp.setSal(rs.getInt("sal"));
				emp.setComm(rs.getInt("comm"));
				emp.setDeptno(rs.getInt("deptno"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return emp;
	} // end of 직원한건보기
	
	
}

MyApp.java

package service;

import java.sql.Connection;
import java.util.ArrayList;

public class MyApp {

	public static void main(String[] args) {
		Connection conn = DBConnection.connection();
		EmpDao empDao = new EmpDao(conn);
		DeptDao deptDao = new DeptDao(conn);
		
		MyService myService = new MyService(empDao,deptDao, conn);
		
		// given
		Dept dept = new Dept(80, "TF팀", "부산");
		ArrayList<Integer> empnos = new ArrayList<>();
		empnos.add(7521);
		empnos.add(7566);

		myService.TF팀창설(dept, empnos);
		
		
		
		
	}
}

MyService.java

package service;

import java.sql.Connection;
import java.util.ArrayList;

public class MyService {
	
	private EmpDao empDao;
	private DeptDao deptDao;
	private Connection conn;
	
	public MyService(EmpDao empDao, DeptDao deptDao, Connection conn) {
		this.empDao = empDao;
		this.deptDao = deptDao;
		this.conn = conn;
	}

	// 1. 직원 목록
	public ArrayList<Emp> 직원목록() {
		return empDao.직원목록보기();
	}
	
	// 2. 직원 상세보기
	public Emp 직원목록(int empno) {
		return empDao.직원한건보기(empno);
	}
	
	// 3. 직원 추가
	public void 직원추가(Emp emp) {
		int result = empDao.직원추가(emp);
		try {
			if(result == 1) {
				conn.commit();
			}else {
				conn.rollback();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	// 4. 부서 추가
	public void 부서추가(Dept dept) {
		int result = deptDao.부서추가(dept);
		try {
			if(result == 1) {
				conn.commit();
			}else {
				conn.rollback();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	
	// 5. TF팀 창설 Dept(*), ArrayList<Integer>
	public void TF팀창설(Dept dept, ArrayList<Integer> empnos) {
		int count = 0;
		count = count + deptDao.부서추가(dept);
		for(int i=0; i<empnos.size(); i++) {
			count = count + empDao.직원수정(empnos.get(i), dept.getDeptno());
		}
		
		try {
			if(count == empnos.size() + 1) {
				conn.commit();
				System.out.println("커밋됨");

			}else {
				conn.rollback();
				System.out.println("롤백됨");
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

'데이터베이스 > JDBC' 카테고리의 다른 글

JDBC 설계 및 만드는 순서  (0) 2022.08.18
JDBC INSERT (SCOTT)  (0) 2022.08.16
JDBC 데이터 SELECT(reading) 실습  (0) 2022.08.16
자바를 오라클 DB에 연동하기  (0) 2022.08.12