JDBC
JDBC(Java Database Connectivity)는 Java Application이 데이터베이스와 상호작용할 수 있도록 도와주는 자바 표준 인터페이스(API)입니다. 자바 코드에서 데이터베이스에 연결하고 SQL 쿼리를 실행, ResultSet을 처리하며 트랜잭션 관리까지 할 수 있습니다.
특징
- 표준화된 API
다양한 DBMS(MySQL, Oracle 등)에서 일관된 방식으로 사용할 수 있는 표준 인터페이스를 제공합니다.
- 주요 구성 요소
- JDBC 드라이버: 실제 DB와 통신하는 자바 클래스 집합입니다.
- Connection: 데이터베이스와의 연결을 관리합니다.
- Statement/PreparedStatement: SQL 쿼리 실행을 담당합니다.
- ResultSet: 쿼리 실행 결과를 담는 객체입니다.
- DriverManager: JDBC 드라이버를 관리, 적절한 드라이버를 선택해 DB 연결을 생성합니다.
- 트랜잭션 관리: Connection을 통해 트랜잭션 시작, 커밋, 롤백과 같은 트랜잭션 관리가 가능합니다.
동작방식
- JDBC 드라이버 로드
- Connection 생성
- SQL 실행
- ResultSet 처리
- 트랜잭션 처리
- 리소스 해제
한계
- 반복코드: 객체 생성과 자원 해제 코드가 반복적으로 필요합니다.
- 예외처리: SQLException 등 체크 예외를 직접 처리해야 함, DB마다 예외 메세지 같은 것들이 달라 일관성이 떨어집니다.
- SQL 직접 작성: 모든 CRUD 작업에 대해 SQL을 직접 작성해야 합니다.
- 자원 관리: Connection 등 자원을 제대로 반환하지 않으면 서버 다운 등과 같은 문제가 발생할 수 있습니다.
Persistence Framework
Persistence Framework는 크게 SQL Mapper와 ORM(Object-Relational Mapping)으로 나눌 수 있습니다.
특징
- 영속성(Persistence): 프로그램이 종료되어도 데이터가 사라지지 않습니다.
- JDBC 기반: 모든 Persistence Framework는 내부적으로 JDBC API와 PreparedStatement를 사용합니다.
- 자원 관리의 자동화: Connection 등 리소스 관리와 예외 처리를 자동화 해줍니다.
SQL Mapper
개발자가 직접 SQL을 작성하고, 그 결과를 객체에 매핑해주는 방식입니다.
Spring JDBC Template
- JDBC의 반복적인 자원 관리, 예외 처리, ResultSet 매핑 등을 자동화합니다.
- SQL은 여전히 직접 작성하지만 코드가 훨씬 간결해진다는 장점이 있습니다.
- DB의 연결 정보는 설정파일(yml, properties)로 관리합니다.
- PreparedStatement를 내부적으로 사용합니다.
MyBatis
- SQL을 XML 파일이나 어노테이션에 분리해 관리할 수 있습니다.
- SQL과 자바 객체 간 매핑을 자동화하며, 복잡한 쿼리도 자유롭게 작성할 수 있습니다.
- JDBC 코드 대부분을 추상화하고, 파라미터 바인딩과 결과 매핑을 자동 처리 합니다.
한계
- 여전히 SQL 문을 직접 작성하여 쿼리문이 달라질 때마다 수정을 해야합니다.
- CRUD 코드 반복이 여전히 남아있습니다.
ORM
객체와 데이터베이스 테이블을 자동으로 매핑해주는 방식입니다. 개발자는 자바 객체를 중심으로 코드를 작성하고 SQL은 프레임워크가 자동 생성 및 실행합니다.
장점
- 객체지향 설계와 데이터베이스 설계 간의 패러다임 불일치 문제를 해결합니다.
- 반복적인 SQL 작성이 줄어들며 유지보수가 수월해집니다.
단점
- 러닝 커브가 높고, 복잡한 쿼리는 SQL Mapper와 혼용하는 경우도 있습니다.
- 성능적으로 이슈가 발생할 수 있어 튜닝이 필요할 수 있습니다.
JPA/Hibernate
- 자바 객체와 데이터베이스 테이블을 1:1 매핑합니다.
- SQL을 직접 작성하지 않아도 되고, CRUD와 같은 반복 작업을 자동화합니다.
- 객체지향의 상속, 연관관계, 캡슐화 등도 데이터베이스에 맞게 변환하여 저장할 수 있습니다.
- JPQL이라는 객체지향 쿼리 언어로 복잡한 검색 또한 지원합니다.
자료 및 코드 출처: 스파르타 코딩클럽