일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- java
- 추상클래스
- 김영한
- 백준
- 싱글톤
- 티스토리챌린지
- JSON
- HttpServletResponse
- 프록시
- 의존관계
- 코드트리
- ocp
- 코딩테스트
- 다형성
- 오버라이딩
- 인터페이스
- http 메시지 컨버터
- 테스트코드
- equals()
- 스프링컨테이너
- @configuration
- 스프링
- objecterror
- html form
- 참조변수
- DI
- 서블릿
- 코드트리조별과제
- fielderror
- 오블완
- Today
- Total
minOS
데이터 베이스 연결 본문
데이터 베이스 연결
애플리케이션과 데이터베이스를 연결해보자.
주의
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. 이렇게 찾은 커넥션 구현체가 클라이언트에 반환된다.
'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 |