ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (jdbc) DaoImpl 코드 패턴
    Database/컨셉 , 예제 2018. 8. 29. 13:18

    보통 기업에서 데이터베이스로 오라클을 많이 사용하기 때문에 오라클과 자바를 연동시키는 패턴에 대해 익숙한 것이 중요하다. 실무 Dao 패턴 정리.


    package com.naver.blog.book.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.naver.blog.book.vo.BookVO;
    
    public class BookDaoImpl implements BookDao{
    
    	@Override
    	public List selectAllBooks() {
    		
    		// 1. Oracle Driver Loading
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    		} catch (ClassNotFoundException e) {
    			// 웹에서 예외 처리 방법. 웹페이지와 콘솔에 에러를 보다 정확하게 파악 가능
    			throw new RuntimeException(e.getMessage(), e);
    		}
    		
    		// 2. OJDBC 객체 생성
    		Connection conn = null;
    		PreparedStatement stmt = null;
    		ResultSet rs = null;
    		
    		// 3. 토드에 생성해둔 Oracle 스키마 접속
    		// mac의 경우 localhost 대신 콘솔에서 ifconfig 로 찾아 직접 입력해야 함.
    	
    		String url = "jdbc:oracle:thin:@localhost:1521:XE";
    	
    		try {
    			
    			conn = DriverManager.getConnection(url, "BOOK", "1234");
    			
    			// 4. 쿼리 작성
    			StringBuffer query = new StringBuffer();
    			
    			query.append(" SELECT  BOOK_ID "      );
    			query.append("         , BOOK_NM "    );
    			query.append("         , BOOK_SUB_NM ");
    			query.append("         , IDX "        );
    			query.append(" FROM    BOOK "         );
    			
    			// 5. 결과 담기.
    			stmt = conn.prepareStatement(query.toString());
    			
    			rs = stmt.executeQuery();
    			
    			List bookList = new ArrayList();
    			BookVO book = null;
    			
    			while(rs.next()){
    				book = new BookVO();
    				
    				book.setBookId(rs.getInt("BOOK_ID"));
    				book.setBookName(rs.getString("BOOK_NM"));
    				book.setBookSubName(rs.getString("BOOK_SUB_NM"));
    				book.setIndex(rs.getString("IDX"));
    				
    				bookList.add(book);
    			}
    			// 6. 결과 리턴
    			return bookList;
    			
    		} catch (SQLException e) {
    			throw new RuntimeException(e.getMessage(), e);
    		} finally{ 
                // 7. 사용한 객체들 닫기
    			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) {	}
    			}
    		}
    		
    	}
    
    }
    

    1단계 오라클 드라이버 로딩은 jdbc 연동 포스팅에 올려놓은 패키지 경로의 클래스를 사용해 오라클 드라이버를 로딩시킨다. 이 절차를 거쳐야 오라클에서 쿼리문의 결과를 실제 메모리에 적재시키거나 가져올 수 있는것으로 이해했다.

    2단계 객체들 역할
    Connection : 데이터베이스 연결 돕는 객체
    PreparedStatement : 쿼리문의 실행을 위해 준비된 객체. 해당 객체에 적당한 쿼리문 값을 입력한 후 executeQuery 메소드를 통해 쿼리문을 실행시킨다. 지금 예제의 경우 query문의 값을 모르는 것이 없어 못느끼겠지만 다른 페이지에서 값을 얻어오는 경우에는 쿼리 중 ?로 오는 것들이 많고, 이것을 setParameter 메소드를 사용해 쿼리문을 편하게 완성시키도록 돕는 강력한 기능을 제공하는 객체.
    ResultSet : PreparedStatement 객체의 executeQuery문 결과를 담는 객체. Select문의 결과를 row 형태로 담는다. 결과는 여러가지가 나올 수 있기 때문에 list 형태로 값에 접근할 수 있다. 

    3단계 url 중 thin과 1521, xe가 무엇인지 모르고 작성하는 경우가 많을 것이다. 이에 대한 궁금증을 어느정도 해소해 이해를 기반으로 외우는 것이 효과적이다.
     THIN : DB 접속 방식. 순수하게 자바 패키지(클래스들)만으로 바로 DB와 연결, 
     XE는 Oracle 클라이언트의  서버명. 디폴트로 XE를 사용한다.

    7단계 객체들 닫기. 객체가 null인지 확인하는 이유는 재사용시 널포인터 예외 발생을 예방하기 위함이다.


    'Database > 컨셉 , 예제' 카테고리의 다른 글

    자바 & 오라클(Oracle) 쿼리 가져오기  (0) 2018.08.29
Designed by Tistory.