Spring DB : 데이터베이스 연결

    이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. 

    데이터베이스 연결하기

    가장 초기에는 어플리케이션과 DB를 연결하기 위해 DriverManager를 사용했다고 한다. DriverManager는 기본적으로 JDBC 인터페이스를 구현한 구현체를 통해 Connection을 받아온다. DriverManager를 사용하기 위해 두 가지 코드를 작성하고자 한다.

    • 전역 상수용 추상 클래스 생성
    • DB Connection 얻는 클래스 생성 with DriverManager 

     

    전역 상수용 추상 클래스

    public abstract class ConnectionConst {
    
        // DB 정보
        public static final String URL = "jdbc:h2:tcp://localhost/~/test";
        public static final String USERNAME = "sa";
        public static final String PASSWORD = "1";
    }
    • 전역 상수용 추상 클래스를 생성한다. 
      • DrvierManager를 이용해 Connection을 얻을 때, URL / USERNAME / PASSWORD 정보를 매번 입력해야한다.
      • 따라서 매번 사용할 수 있도록 전역 상수로 생성해둔다. 

     

    DB 연결용 클래스 생성 with DriverManager

    @Slf4j
    public class DbConnectionUtil {
    
        public static Connection getConnection() {
    
            try {
                Connection conn = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);
                log.info("Connection = {}, class = {}", conn, conn.getClass());
                return conn;
            } catch (SQLException e) {
                throw new IllegalStateException(e);
            }
        }
    }
    • DriverManager를 이용해서 Connection을 얻어오는 클래스를 생성한다
      • DriverManager.getConnection()은 Static Method로 제공된다. 이 때, URL + USERNAME + PASSWORD를 설정해주면 DriverManager는 Connection을 제공해준다. 
      • 이 때, SQL Exception이 발생할 수 있기 때문에 Try / Catch 문으로 감싼다. 

     

    데이터베이스 연결 테스트

    @Test
    void driverManager() {
        Connection con = DBConnectionUtil.getConnection();
        DBConnectionUtil.getConnection();
        assertThat(con).isNotNull();
    }
    • 다음 코드를 작성한다.
      • DriverManager를 통한 코드 생성을 2번 요청한다. 

    실행 결과를 보면 class = org.h2.jdbc.JdbcConnection을 확인할 수 있다. 이 클래스는 JDBC 인터페이스를 H2 DB 드라이버가 구현한 구현체다. 즉, H2 전용 Connection이다.  이 커넥션은 Jdbc 표준 Connection 인터페이스인 java.sql.Connection 인터페이스를 구현하고 있다. 

     

    JDBC DriverManager 연결 이해

    위의 코드에서 H2 Connection을 얻기 위해 URL / Username / Password 정도만으로 Connection을 얻어올 수 있었다. 어떻게 이런 일이 가능한 것일까?

    • JDBC는 java.sql.Connection을 통해 표준 커넥션 인터페이스를 정의한다.
    • H2 DB는 JDBC Connection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection 구현체를 제공한다. 

    구현체는 각 데이터베이스가 제공해주는 것으로 이해할 수 있다. 그런데 어떻게 URL / Username / Password만 쳤는데 필요한 H2 Connection을 찾아와서 넣어준 것일까? DriverManager는 위 정보를 바탕으로 사용가능한 DB 드라이버를 찾아온다.

    Jdbc가 제공하는 DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고 커넥션을 획득하는 기능을 제공한다. DriverManager는 Connection을 얻기 위해 다음과 같이 동작한다.

    1. 어플리케이션에서 Connection이 필요하면 DriverManager.getConnection()을 호출한다.
    2. DriverManager는 호출되면 다음 일을 한다
      1. 라이브러리에 등록된 드라이버 목록을 자동으로 인식한다.
      2. 드라이버 목록에 있는 드라이버에게 URL / Username / Password 정보를 넘겨서 Connection을 획득할 수 있는지 확인한다. 
      3. 각각의 드라이버는 URL 정보를 체크해서 본인이 처리할 수 있는 요청인지 확인한다. 본인이 처리할 수 있는 요청이면, 드라이버는 DB에서 커넥션을 얻어와서 반환해준다. 

     

    정리

    • DriverManager를 통해 각 DB가 제공하는 JDBC 인터페이스 구현체에게서 DB Connection을 불러올 수 있었다.
    • DriverManager는 DB 드라이버를 관리하고 있으며, URL / Username / PassWord가 넘어오면 이 정보를 바탕으로 사용가능한 DB Driver를 찾고, 그 Drvier에게서 Connection을 얻어와서 반환해준다. 
    • DriverManager는 Connection을 불러올 때 마다 설정 정보를 넣어줘야한다. 설정 + 사용이 동시에 일어나기 때문에 책임의 분리가 필요하다. 

    댓글

    Designed by JB FACTORY