728x90
JDBC란?
JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다.
SQL Command를 보내면 Result Set 응답을 받는 식으로 동작하고 있다.
그러나 JDBC를 통해 데이터베이스에 접속할 수는 있지만, MySQL, Oracle 등 많은 종류의 DB가 존재하고 각 사용법이 달라 DB를 바꾸게 되면 쿼리를 새로 작성해야 하는 번거로움이 있다.
따라서 SQL쿼리를 작성하면, 각 DB 성질에 맞게 변환해주는 SQL Mapper가 등장했다. Mybatis, Jdbc Template이 그 예시다. 그 후로 SQL쿼리마저 작성해주는 JPA의 등장, 동적 쿼리도 만들어주는 Querydsl까지 발전해온 내용을 기록하려고 한다.
데이터베이스를 변경하게 된다면?
각 DB는 어플리케이션과 Connection을 통해 연결된 후에 SQL과 결과를 주고 받으며 통신한다.
만약 데이터베이스를 변경하는 경우에는 코드를 모두 리팩토링해야 하는 일이 생기게 된다. 이를 해결하기 위해 등장한 것이 JDBC 표준 인터페이스다.
DB 연결 환경 설정
package hello.jdbc.connection;
public abstract class ConnectionConst {
public static final String DB_URL = "jdbc:h2:tcp://localhost/~/test";
public static final String DB_USER = "sa";
public static final String DB_PASSWORD = "";
}
@Log4j2
public class DBConnectionUtil {
public static Connection getConnection() {
try {
Connection connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
log.info("connection = {}, class = {}", connection, connection.getClass());
return connection;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
별도의 클래스를 생성해 어플리케이션이 DB에 접근할 수 있도록 Connection을 연결한다.
DriverManager는 각 DB에 맞게 커넥션 연결을 도와주는 역할을 한다.
기입된 url, user, password 등의 정보를 전달하고 커넥션을 반환한다.
테스트 코드 작성
@Slf4j
class DBConnectionUtilTest {
@Test
void connection() {
Connection connection = DBConnectionUtil.getConnection();
assertThat(connection).isNotNull();
}
}
위에서 작성한 DBConnectionUtil을 통해 Connection이 제대로 동작하는지 테스트해 볼 수 있다.
Connection 이후에 Statement와 ResultSet
Connection으로 연결이 되면, Statement 객체를 생성해서 SQL 쿼리를 전달하게 된다.
전달 받은 SQL 쿼리문은 ResultSet 객체에서 결과 반환을 위해 동작하게 되는데, ResultSet은 Cursor를 이용하는 동작하는 방식을 따른다.
// DriverManager를 통해 Connection 연결 Connection connection = DriverManager.getConnection(url, username, password); // Connection 객체를 통해 Statement 객체 생성 Statement statement = connection.createStatement(); //executeQuery메서드를 통해 SQL쿼리를 전달하고 ResultSet 생성 String sqlQuery = "SELECT * FROM your_table"; ResultSet resultSet = statement.executeQuery(sqlQuery); // 반복문을 통해 ResultSet 결과 처리 while (resultSet.next()) { // 결과 처리 String columnValue = resultSet.getString("column_name"); // 추가로 처리할 작업 수행 } // 연결 종료 : 마지막에 동작한 순서대로 연결을 종료 resultSet.close(); statement.close(); connection.close();
Cursor를 통해 row를 돌며 동작하는 ResultSet
TODO: 예외 처리 및 트랜잭션 관리 등을 고려해야 한다.
'DB(MySQL, MongoDB, Redis, Kafka) > JDBC,JPA, Querydsl' 카테고리의 다른 글
예외 Exception의 이해, 종류, 체크 예외와 언체크 예외 (0) | 2024.01.18 |
---|---|
SQL Mapper : Jdbc Template의 이해 (0) | 2024.01.14 |
Connection Pool과 Data Source의 이해 (0) | 2024.01.13 |