DB/개념 정리

[DB] JDBC 정리

꾸준함. 2023. 3. 17. 13:30

JDBC란?

JDBC(Java Database Connectivity)는 Java에서 DB에 접속할 수 있도록 하는 자바 API입니다.

시중에 다양한 DB가 존재하는데 각각의 데이터베이스마다 연결하는 방법, SQL을 전달하는 방법, 그리고 응답을 받는 방법이 모두 상이하므로 기존에는 개발자들이 새로운 DB를 사용할 때마다 위 과정을 새로 학습하며 코드를 수정해야 했습니다.

이러한 애로사항 때문에 JDBC라는 자바 표준이 생겼고 이를 통해 개발자들은 아래의 장점을 얻을 수 있었습니다.

  • DB 변경할 때마다 DB 접근하는 코드를 수정하는 대신 추상화된 JDBC 인터페이스 의존하여 개발
  • JDBC 표준 인터페이스만 학습하면 학습한 내용을 수십 개의 데이터베이스에 동일하게 적용 가능

 

JDBC는 대표적으로 아래와 같이 세 가지 기능을 표준 인터페이스로 제공하며 개발자들은 해당 인터페이스를 사용해서 개발을 진행하면 됩니다.

  • java.sql.Connection - DB 연결
  • java.sql.Statement - SQL을 담은 내용
  • java.sql.ResultSet - SQL 요청에 대한 응답

 

다만, JDBC 표준 인터페이스만으로는 기능이 정상적으로 동작하지 않고 각각의 DB 벤더에 맞는 JDBC 드라이버라는 구현체를 사용해야 합니다.

여기서 JDBC 드라이버는 각 DB 벤더에서 자신의 DB에 맞게 표준 인터페이스를 구현해서 제공하는 라이브러리입니다.

 

여기까지의 내용을 요약하면 아래와 같습니다.

 

 

JDBC 표준화의 한계

앞서 JDBC 표준 인터페이스 사용법만 학습하면 다양한 DB에 모두 동일하게 적용할 수 있다고 했지만 아쉽게도 각 데이터베이스마다 SQL 문법 및 데이터 타입 등의 일부 사용법이 다른 케이스가 존재합니다.

ANSI SQL이라는 표준이 존재하지만 일반적인 부분만 공통화했기 때문에 분명한 한계가 적용하며 대표적인 예시로는 페이징 쿼리가 있습니다.

  • MySQL 문법에서는 페이징을 OFFSET과 LIMIT을 통해 진행
  • 하지만 Oracle 문법에서는 OFFSET, ROWS FETCH NEXT, 그리고 ROWS ONLY를 통해 진행

 

요약하자면 DB를 변경했다고 해서 JDBC 코드를 변경하지 않아도 되지만 SQL 문법은 각 데이터베이스에 맞도록 수정해야 하기 때문에 JDBC 표준화에 어느 정도 한계가 존재합니다.

JPA의 경우 Dialect를 통해 위의 한계를 어느 정도 해결했지만 MyBatis를 사용하는 경우 DB 변경 시 쿼리 수정이 불가피합니다.

(이번에 경험한 바 비슷한 계열인 MariaDB에서 MySQL로 변경할 때도 DDL, DML 수정이 필요했습니다.)

 

JDBC를 편리하게 사용하는 기술

JDBC는 굉장히 오래된 기술이기 때문에 요즘에는 대부분 JDBC를 직접 사용하기보다는 JDBC를 편리하게 사용하는 SQL Mapper 혹은 ORM을 통해 개발을 진행합니다.

 

SQL Mapper의 대표 기술로는 Spring JdbcTemplate과 MyBatis가 있으며 아래의 장단점을 가집니다.

  • 장점: SQL 응답을 객체로 편리하게 변환해 주고 JDBC의 반복되는 코드를 제거함에 따라 JDBC를 편리하게 사용
  • 단점: 개발자가 SQL을 직접 작성해야하기 때문에 DB 변경할 때마다 수정 필요

 

ORM은 객체를 관계형 데이터베이스 테이블과 매핑해 주는 기술이며 대표 기술로는 JPA, Hibernate, 그리고 이클립스링크가 있습니다.

ORM은 아래의 장단점을 가집니다.

  • 장점: 개발자 대신에 SQL을 동적으로 만들어 실행해 주기 때문에 반복적인 CRUD 쿼리 작성할 필요가 없고 Dialect를 통해 각각의 데이터베이스마다 다른 SQL을 사용하는 문제도 해결
  • 단점: 러닝 커브가 높지만 상대적으로 어려운 기술이므로 깊이 있는 학습이 필요하며 깊은 이해도 없이 사용할 경우 결국 native query를 직접 작성하는 문제 존재

 

위에서 언급한 기술들은 모두 내부적으로 JDBC를 사용합니다.

따라서 개발자들은 JDBC를 직접 사용하지 않더라도 JDBC의 기본 동작 원리를 숙지하고 있어야 합니다!

 

참고

스프링 DB 1편 - 데이터 접근 핵심 원리 (김영한 강사님)

반응형

'DB > 개념 정리' 카테고리의 다른 글

[용어 정리] DAO, DTO, VO, Mapper, Repository, Entity  (0) 2023.11.06
[DB] 트랜잭션과 DB Lock 정리  (0) 2023.03.20
[DB] Connection Pool 정리  (0) 2023.03.20