본문 바로가기

📚Study Note/JDBC

[ JDBC ] getConnection() │ Connection.close()

광산에서 

광산밖에서 요청하는  사람 : 프로그램

광산 안밖을 연결하는 선 : 커넥션 Connection

선으로 왔다갔다하며 전달해주는 수레 : Statement

광산 안의 광부들 : 데이터베이스 

 

 

인서트 시켰으면 statement 에 1을 담아서 작업객체에게 보내줌 

쿼리문 dml 하고 select 

dml은 광부만 일하면 끝이 나는 작업이다. 그런데 그 일을 처리했는지 확인할 수 없어서 위에서 지금 검정색 돌들을 깨뜨려달라고 했다. 아래서는 까만 돌들을 다 없애버렸다. statement 에 몇개가 제거되었는지 보내주기로 약속을 함.

 

그래서 int result = stmt.executeUpdate(sql);

 

석탄이 몇개있냐고 물어봤을 때 그 개수를 적어서 보내줘야 한다. 이때는 『ResultSet』 에다가 집어넣어서 데이터를 넘겨줘야 한다.  크게 이런 과정들을 거친다고 보면 된다.

 

커넥션은  노력/시간/비용 많이 드는 작업이다. 광부들이 들어갈 때마다 레일을 다시 깔아주는 것은 매우 비효율적. 그런데 한 번 깔아놓은 레일을 활용하게 되면 편하게 왔다갔다가 가능하다. (싱글톤 패턴을 활용)

 

 

 

익스큐트업데이트 메소드 executeUpdate() 는 적용된 행의 개수를 반환하고 익스큐트쿼리executeQuery()는 select 한 결과와 연결짓고 그 결과를 가져오는 것. 그래서 DB와 연결이 끊기면 가져온 결과(객체 리저트셋 ResultSet)를 처리할 수 없게 된다. 

dbconn.close() 해버리면 얻어낼 수 없다. 그래서 끊기 전에 가져와야 한다.  

   하....티스토리 아직 어떻ㄱ ㅔ하는건지 참 어렵다^^ 표랑 병렬로 문자 넣고 싶은데 넣을 수가 없죠?

1 191    
2 273    
3 545    

□ 만약에 이게 ResultSet , 즉 위에 있는 표라고 치면 

 

 

   ▼

▶□

 

이렇게 가져오는 것이다. 레코드의 몇 번째 컬럼...~~~

 

/*
 * 
 * 
 * JDBC01의 DBconn*/


package com.util;
import java.sql.Connection;
import java.sql.DriverManager;

public class DBconn
{
	// 변수 선언         (커넥션은 연결객체)
   private static Connection dbConn;
   // -- 자동 null 초기화
     
   // 메소드 정의 → 연결
   public static Connection getConnection()
   {
	   // 한 번 연결된 객체를 계속 사용
	   // 즉, 연결되지 않은 경우에만 연결을 시도하겠다는 의미
	   // → 싱글톤(디자인 패턴)
	   
      if(dbConn == null) 
      {
         try
         {
            String url ="jdbc:oracle:thin:@ip주소:1521:xe";
            //--『@ip주소』 는 오라클 서버 ip 주소를 기재하는 부분 원격지의 
            // 오라클이 아니라 로컬의 오라클 서버일 경우는 『localhost』 이나 
            // 『127.0.0.1 과 같이 loop back address 로 기재 가능
            // 『1521 은 오라클 리스터 기본 Port Number
            // 『xe 는 오라클 SID(Express Edition 은 xe)
            
            
            String user = "scott";		// -- 오라클 사용자 계정 이름
            
            String pwd = "tiger";		// -- 오라클 사용자 계정 암호
            
            Class.forName("oracle.jdbc.driver.OracleDriver"); // class 라는 이름의 클래스에서 forName 메소드를 호출 
            // --OracleDriver 클래스에 대한 객체 생성
            
            dbConn = DriverManager.getConnection(url, user,pwd);
            //클래스명.메소드이름 이니까 static 메소드이다
            // 오라클 서버 실제 연결
            // 갖고 있는 인자값(매개변수)은 오라클 주소, 계정명, 패스워드
            
            
         } catch(Exception e) // ClassNotFoundException, SQLException
         {
            System.out.println(e.toString());
            //-- 오라클 서버 연결 실패 시 오류 메세지 출력 부분
         }         
      }
      
      return dbConn; // 연결된 게 있으면 그대로 쓰겠다. -- 구성된 연결 객체 반환
   }
   
   // getConnection() 메소드의 오버로딩 → 연결
   public static Connection getConnection(String url, String user, String pwd)
   {
      if(dbConn == null)
      {
         try
         {
            Class.forName("oracle.jdbc.driver.OracleDriver"); // 오라클 드라이버라는 thin 드라이버를 활용하겠다!
            dbConn = DriverManager.getConnection(url, user, pwd);
      
         } catch(Exception e)
         {
            System.out.println(e.toString());
         }
      }
   
   
      return dbConn;
   }
   
   // 메소드 정의 → 연결 종료하는 메소드 리턴자료형 void
   
   public static void close()
   {	
	   
	   // dbConn 변수(멤버 변수)는 Database 가 연결된 상태일 경우 Connection을 갖는다
	   // 연결되지 않은 상태라면 null을 갖는다.
	   
      if (dbConn != null)
      {
         try
         {
        	 // 연결 객체의 isClosed() 메소드를 통해 연결 상태 확인
            if(!dbConn.isClosed()) //연결객체가 닫혀있는 상황이 아니라면 이라는 뚯
               dbConn.close();
            
         } catch(Exception e)// ClassNotFoundException, SQLException
         {
            System.out.println(e.toString());
         }
         
      }
      
      dbConn = null;
      // -- 연결 객체 초기화
   }
   
}
	

 

우선 private static 으로 Connection 타입의 전역변수 dbConn 선언해준다. 

자동 null 초기화. 싱글톤 디자인이란 것이 한 번 연결된 connection 객체를 계속 쓴다는 말인가

 

만약 dbConn 이 null 이라면  

Class.forName("oracle.jdbc.driver.OrableDriver");

로 오라클드라이버 클래스 객체 생성하고 .. 이 부분이 헷갈림

일반적으로 클래스 객체 생성할 때처럼 생성하는 게 아니라서 어색

 

어쨋든 DriverManager 객체를 생성했으니까 이걸로

Driver Manager.getConnection(url,user,pwd); 로 connection 을 얻고 그것을 dbconn 에 대입한다.

 

여기서 url은 jdbc:oracle:thin:@ip주소:1521:xe

user 는 scott pwd 는tiger

 

 

 

이제 dbConn 은 null이 아니다 

return dbconn 해주고 마무리

아래 public static Connection getConnection(String url, String user, String pwd) 는

getConnection 오버로딩한 메소드

 

만약 dbconn 이 null 인 상태라면 dbconn 에 Driver Manager.getConnection(url,user,pwd)

한 결과를 대입한다. 

 

연결을 종료하는 메소드는 

public static void close() 메소드.

 

만약 dbconn 이 null 이 아닌 상태라면 즉 connection 을 가지고 있다면

 

if(!dbconn.isClosed()) 으로 dbconn 이 닫혀있지 않은 상태라는 것을 다시 한 번 확인한 후에

dbconn.close() 로 커넥션을 종료한다. 

그런 후 connection 을 갖기 이전의 상태인 dbconn = null; 로 다시 초기화시켜준다. 

 

 

아래는 위와 같은 기능의 클래스와 메소드이지만

위에서는 예외처리방법이 try ~ catch 였다면

아래 코드는 throws 로 처리했다. 

 

throws SQLException 또는 throws ClassNotFoundException

 

/*==============
 * DBConn.java
 * - 예외 처리 방법을 try ~ catch → throws
 * ============*/

package com.util;

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

public class DBconn
{
	private static Connection dbConn;

	public static Connection getConnection() throws ClassNotFoundException, SQLException
	{
		if (dbConn == null)
		{
			String url = "jdbc:oracle:thin:@000.000.000.000:1521:xe";
			String user = "scott";
			String pwd = "tiger";

			Class.forName("oracle.jdbc.driver.OracleDriver");
			dbConn = DriverManager.getConnection(url, user, pwd);

		}
		return dbConn;

	}

	public static Connection getConnection(String url, String user, String pwd)	throws ClassNotFoundException, SQLException
	{
		if (dbConn == null)
		{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			dbConn = DriverManager.getConnection(url, user, pwd);

		}
		return dbConn;

	}


	public static void close() throws SQLException
	{
		if (dbConn != null)
		{
			if (!dbConn.isClosed()) // sqlexception
			{
				dbConn.close();
			}
		}
		dbConn = null;
		
		
		
	}
	
	
	
	

}
// end dbConn

 

 

 

 

'📚Study Note > JDBC' 카테고리의 다른 글

[ JDBC ] MemberDTO │ MemberDAO │ MemberMain  (0) 2021.04.22