Study/수업 내용 정리

JDBC2 < 2021-10-11 >

뱅코더 2021. 10. 11. 23:52

게시판 만들기 연습

 

 

Oracle

 

Java


 

  • BoardView - 메뉴 화면 작성
  • BoardService - 비즈니스로직 처리 (데이터 가공/트랜잭션 제어)
  • BoardDAO - 실질적으로 DB에 접근
  • JDBCTemplate - 반복 사용되는 요소 저장

 


JDBCTemplate

- DB 연결, JDBC 자원 반환 등 JDBC 관련 공통 내용들을 모아놓은 클래스

- 여기에 만들 메서드 

  1. Connection 객체 생성 및 반환

  2. 전달 받은 JDBC 객체 자원 반환 ( Close() 메서드 )

  3. 트랜잭션 제어 구문 ( commit , rollback )

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCTemplate {

	// 객체 생성을 하지 않아도 되는 변수
	// 단, 외부로 부터 직접 접근은 차단
	private static Connection conn = null;
	
	// DB 연결 정보를 담고 있는 Connection 객체 반환용 메서드
	public static Connection getConnection() {
		
		// 이전에 생성된 Connection이 close()되지 않은 경우
		// 이전 Connection을 재활용하고	
		// 이전에 생성된 Connection이 없거나, close() 되었을 경우
		// 새로운 Connection을 반환	
        // --> 접속한 사람당 Connection 1개만 가짐
        
		try {			
			if(conn == null || conn.isClosed()) {
			// conn.isClosed() : Connection 객체가 close() 된적 있으면 true;
				
				Class.forName("oracle.jdbc.driver.OracleDriver");
				String url = "jdbc:oracle:thin:@localhost:1521:xe";
				String userName = "board";
				String password = "board1234";
				
				conn = DriverManager.getConnection(url, userName, password);
			
				conn.setAutoCommit(false);  // 자동 커밋 기능 off
				
			// 만약 true인 경우 SQL이 수행 되자마자 자동으로 Commit
			// (주의사항) conn.close()가 수행되는 경우 자동으로 commit()이 같이 수행된다.
			// -> conn.close() 호출 전에 트랜잭션 제어 구문을 작성해야함. 
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		return conn;
	}
    
    // Statement 객체 반환
    public static void close(Statement stmt) {
	// -> 매개변수에 다형성을 적용하여
	// -> Statement,PreparedStatement 두 객체의 close() 동작을 하나의 메서드로 처리 가능
		try {
			if(stmt != null && !stmt.isClosed()) stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}
 
	// ResultSet 반환 메서드
	public static void close(ResultSet rs) {
		
		try {
			if(rs != null && !rs.isClosed()) rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	} 
 
	// Connection 반환 메서드
	public static void close(Connection conn) {
		
		try {
			if(conn != null && !conn.isClosed()) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}	 
 
 	// commit용 메서드
	public static void commit(Connection conn) {
		
		try {
			if(conn != null && !conn.isClosed()) 
				conn.commit();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}
	
	// rollback용 메서드
	public static void rollback(Connection conn) {
		
		try {
			if(conn != null && !conn.isClosed()) 
				conn.rollback();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}		
	}
		
}

 


지난번 방식과 다른점

 

* BoardDAO 클래스 메서드를 작성할때

try-catch-finally 구문에서 catch를 없애고 try-finally 사용

--> BoardView 클래스로 예외를 모두 throws 했기 때문 

 

* 저번에는 BoardDAO 클래스에서 객체 자원을 모두 반환했다면,

이번에는 Connection 객체 자원을 BoardService 클래스에서 반환한다.

--> 트랜잭션제어(commit , rollback)가 끝난 뒤 반환해야하므로

 

* BoardDAO 클래스에서 Connection을 생성하고 사용했지만,

이번에는 BoardService 클래스에서 생성하고 매개변수로 BoardDAO에 넘겼음

--> 트랜잭션제어에 Connection 객체가 필요하므로 먼저 사용하고 BoardDAO로 보냄

 

* static 메서드와 필드를 이용해서 JDBCTemplate 클래스의 메서드와 필드를 쉽게 호출

+ JDBCTemplate 클래스 이용하는 다른 클래스에 " import .... .JDBCTemplate.* "를 추가하고

   클래스명 없이 메서드만 입력해서 호출하도록 했음.

 

* JavaDocs 주석 ( 클래스와 메서드 설명용 주석 )을 사용해 메서드나 클래스의 정보 기록

/**

 * @param 

 * @return

 * @throws 

 */

 

 

'Study > 수업 내용 정리' 카테고리의 다른 글

2021-10-15  (0) 2021.10.15
JDBC3 < 2021-10-14 >  (0) 2021.10.14
JDBC1 < 2021-10-06 >  (0) 2021.10.06
Collection - Set / Map < 2021-10-05 >  (0) 2021.10.05
Array / Collection - List < 2021-10-04 >  (0) 2021.10.04