minOS

데이터 베이스 연결 본문

TIL/김영한의 스프링 DB 1편

데이터 베이스 연결

minOE 2024. 11. 3. 18:46
728x90

데이터 베이스 연결

애플리케이션과 데이터베이스를 연결해보자.
주의 

H2 데이터베이스 서버를 먼저 실행해두자.

package hello.jdbc.connection;
public abstract class ConnectionConst {
	public static final String URL = "jdbc:h2:tcp://localhost/~/test";
	public static final String USERNAME = "sa";
	public static final String PASSWORD ="";
}

위 코드는 데이터베이스 연결에 필요한 상수 값을 모아둔 클래스이다. 주요 특징을 간략히 설명하자면:

1. `abstract` 키워드 사용: `ConnectionConst` 클래스는 `abstract`로 선언되어, 인스턴스화(객체 생성)가 불가능하다. 이는 이 클래스가 오로지 **상수를 제공하는 역할**만 하도록 설계된 것이다.

2. 상수 선언
   - `URL`, `USERNAME`, `PASSWORD`는 모두 정적(static) 상수로 선언되어 있다.
   - `static final` 키워드로 선언된 필드들은 변경할 수 없는 고정된 값을 가지며, 모든 인스턴스에서 공유된다.
   
3. 데이터베이스 연결 정보 제공: 각 상수는 데이터베이스에 연결하기 위해 필요한 정보를 담고 있다.
   - `URL`: H2 데이터베이스의 주소이다.
   - `USERNAME`: 데이터베이스 사용자 이름이다.
   - `PASSWORD`: 데이터베이스 비밀번호(빈 값)이다.

따라서, 이 클래스는 애플리케이션에서 데이터베이스 연결 정보를 일관성 있게 제공하기 위한 설정 파일 역할을 한다.



JDBC 사용해서 실제 데이터베이스에 연결하는 코드를 작성하기

package hello.jdbc.connection;

import lombok.extern.slf4j.Slf4j;

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

import static hello.jdbc.connection.ConnectionConst.*;

@Slf4j
public class DBConnectionUtil {
    public static Connection getConnection(){
        try {
            Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); // JDBC에서 제공된 메서드, URL과 자격 증명을 기반으로 적절한 DB 드라이버의 구현체를 찾아 연결 생성
            log.info("get connection={}, class ={}",connection,connection.getClass());
            return connection;
        } catch (SQLException e){
            throw new IllegalStateException(e);
        }
    }
 }

 

데이터베이스에 연결하려면 JDBC 제공하는 `DriverManager.getConnection(..)` 사용하면 된다.
이렇게 하면 라이브러리에 있는 데이터베이스 드라이버를 찾아서 해당 드라이버가 제공하는 커넥션을 반환해준다.
여기서는 H2 데이터베이스 드라이버가 작동해서 실제 데이터베이스와 커넥션을 맺고 결과를 반환해준다.



학습용 테스트 코드를 만들어서 실행

package hello.jdbc.connection;


import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import java.sql.Connection;

import static org.assertj.core.api.Assertions.*;

@Slf4j
public class DBConnectionUtilTest {

    @Test
    void connection(){
        Connection connection = DBConnectionUtil.getConnection();
        assertThat(connection).isNotNull();  // 로그 : url=jdbc:h2:tcp://localhost/~/test user=SA, class =class org.h2.jdbc.JdbcConnection
    }
}

 

실행결과

hello.jdbc.connection.DBConnectionUtil -- get connection=conn0: url=jdbc:h2:tcp://localhost/~/test user=SA, class =class org.h2.jdbc.JdbcConnection

 

실행 결과를 보면 `class=class org.h2.jdbc.JdbcConnection` 부분을 확인할 있다. 이것이 바로 H2 데이터베이스 드라이버가 제공하는 H2 전용 커넥션이다. 물론 커넥션은 JDBC 표준 커넥션 인터페이스인 `java.sql.Connection` 인터페이스를 구현하고 있다.


 

 

JDBC DriverManager 연결 이해


JDBC 커넥션 인터페이스와 구현

 

1. JDBC `java.sql.Connection` 표준 커넥션 인터페이스를 정의한다.

2. H2 데이터베이스 드라이버는 JDBC Connection 인터페이스를 구현한 `org.h2.jdbc.JdbcConnection` 구현체를 제공한다.

 

 

JDBC 제공하는 `DriverManager` 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을

제공한다.

1. 애플리케이션 로직에서 커넥션이 필요하면 `DriverManager.getConnection()` 호출한다.

2. `DriverManager` 라이브러리에 등록된 드라이버 목록을 자동으로 인식한다. 드라이버들에게 순서대로 다음 정보를 넘겨서 커넥션을 획득할 있는지 확인한다.

        URL: ) `jdbc:h2:tcp://localhost/~/test`

        이름, 비밀번호 접속에 필요한 추가 정보

        여기서 각각의 드라이버는 URL 정보를 체크해서 본인이 처리할 있는 요청인지 확인한다. 예를 들어서

        URL `jdbc:h2` 시작하면 이것은 h2 데이터베이스에 접근하기 위한 규칙이다. 따라서 H2 드라이버는

        본인이 처리할 있으므로 실제 데이터베이스에 연결해서 커넥션을 획득하고 커넥션을 클라이언트에 반환한다. 반면에              URL `jdbc:h2` 시작했는데 MySQL 드라이버가 먼저 실행되면 경우 본인이 처리할 없다는 결과를 반환하게 되            고, 다음 드라이버에게 순서가 넘어간다.

3. 이렇게 찾은 커넥션 구현체가 클라이언트에 반환된다.

 

728x90

'TIL > 김영한의 스프링 DB 1편' 카테고리의 다른 글

트랜잭션 - 개념 이해  (0) 2024.11.20
DataSource 이해  (1) 2024.11.20
커넥션 풀 이해  (0) 2024.11.20
JDBC 이해와 JDBC와 최신 데이터 접근 기술  (2) 2024.11.02
H2 데이터 베이스 설정  (1) 2024.11.01