본문 바로가기

JDBC/기본 개념

XML 기본

▶ XML(eXtensive Markup Language) : 단순화된 데이터 기술 형식

  • XML을 사용하려는 이유
    - DB 연결 정보, SQL문 등 수정이 빈번한 내용을 코드에 직접 작성하면 효율성 떨어짐
    - 이유) Java에서는 코드가 조금 수정되어도 전체 코드를 다시 컴파일하여 시간이 상대적으로 오래 소요됨

    - XML 외부 파일을 이용하면 XML 파일의 내용을 바꿔도 XML 파일을 읽어오는 코드는 변하지 않음
    - → 컴파일 미실행하여 시간 효율 상승함
  • XML은 Key,Value 형식의 Map으로, 문자열만 저장
  • Map <String, String> == Properties 클래스
  • Properties 컬랙션 객체
    1) Key, Value가 <String, String>으로 타입이 제한된 Map
    2) XML 파일을 생성하고 읽어오는데 특화

▶ CreateXML Class

public class CreateXML{
   public static void main(String[]args){
      properties prop = new Properties();
        
      try{
         // 출력할 내용을 저장할 XML 파일 생성
         FileOutputStream fos = new FileOutputStream("member-sql.xml");
            
         // storeToXML 메소드 사용해서 XML 파일 저장
         prop.storeToXML(fos, "DB Connection Data");
            
      } catch (IOException e) {
          e.printStackTrace;
      }
   }
}

▶ LoadXML Class

public class LoadXML{
   public static void main(String[] args){
      
      Properties prop = new Properties();
        
      try{
          // 외부 XML 파일 읽어오기(Properties 객체 사용)
          prop.loadFromXML(new FileInputStream("driver.xml"));
            
          System.out.println("driver: " + prop.getProperty("driver"));
          // Property : 속성(데이터)
          // prop.getProperty : XML에서 얻어온 값 중 Key가 "driver"인 entry의 Value를 얻어옴
          
      } catch (Exception e) {
            e.printStackTrace();
      }
   }
}

▶ JDBCTemplate Class

public class JDBCTemplate{
	/*
    * DB 연결, 트랜잭션 제어, JDBC 자원 반환과 같은
    * 반복적으로 사용되는 JDBC 관련 코드를 모은 클래스
    *
    * getConnection() 메소드
    *
    * commit(Connection)
    * rollback(Connection)
    *
    * close(Connection | Statement | ResultSet) 메소드
    * */
    
    // 필드
    private static Connection conn = null;
    
    
    // 메소드
    
    // 1) getConnection() : DB 연결 정보를 담고 있는 Connection 객체 반환 메소드
    public static Connection getConnection(){
      // 계속 공용으로 사용되는 conn 변수에 커넥션이 없거나(null), 이전 커넥션이 있었으나 닫힌 경우(close())
      // -> 새로운 커넥션 필요
        
      try{ // 하나의 프로그램엔 한 개의 커넥션만 사용
         if(conn == null || conn.isClosed()){
            	
         // [Connection 객체 생성 준비]
         // Properties 객체 생성
         Properties prop = new Properties();
         // Key,Value가 모두 String 타입으로 제한된 Map / XML 파일 입출력에 특화

         // driver.xml 파일 읽어오기
         prop.loadFromXML(new FileInputStream("driver.xml"));
                
         String driver = prop.getProperty("driver");
         String url = prop.getProperty("url");
         String user = prop.getProperty("user");
         String password = prop.getProperty("password");
                
         // [Connection 객체 생성]
         // 1) JDBC 드라이버 메모리 로드
         Class.forName(driver);
                
         // 2) DriverManager 사용해 Connection 객체 생성
         conn = DriverManager.getConnection(url,user,password);
                
         // 3) 트랜잭션 제어를 위한 자동 커밋 비활성화
         conn.setAutoCommit(false);
                
      } catch (Exception e) {
          e.printStackTrace();
      }
      return conn;
   }
    
    // 2) close() 메소드
    // 2-1) Connection 자원 반환 메소드
    public static void close(Connection conn){
      try{
         // 참조하는 conn 변수가 존재하면서 닫혀있지 않은 경우
         if(conn != null && !conn.isClosed()) conn.close();
      } catch (SQLException e) {
          e.printStackTrace();
      }
   }
    
    // 2-2) Statement(부모), PreparedStatement(자식) 반환 메소드(다형성 적용)
    public static void close(Statement stmt){
      try{
         // 참조하는 stmt 변수가 존재하면서 닫혀있지 않은 경우
         if(stmt != null && !stmt.isClosed()) stmt.close();
      } catch (SQLException e) {
          e.printStackTrace();
      }
   }
    
    // 2-3) ResultSet 반환 메소드
    public static void close(ResultSet rs){
      try{
         // 참조하는 rs 변수가 존재하면서 닫혀있지 않은 경우
         if(rs != null && !rs.isClosed()) rs.close();
      } catch (SQLException e) {
          e.printStackTrace();
      }
   }
    
    // 3) 트랜잭션 제어
    // 3-1) COMMIT
    public static void commit(Connection conn){
      try{
         if(conn != null && !conn.isClosed()) conn.commit();
      } catch (SQLException e){
          e.printStackTrace();
      }
   }
    
    // 3-2) ROLLBACK
    public static void rollback(Connection conn){
      try{
         if(conn != null && !conn.isClosed()) conn.rollback();
      } catch (SQLExceptin e) {
          e.printStackTrace();
      }
   }