JPA, JDBC
JDBC (Java Database Connectivity)
자바에서 데이터베이스와 직접 상호작용하기 위한 저수준 API입니다.
여러 종류의 데이터베이스가 존재하는 상황에서, 데이터베이스가 교체되더라도 코드를 바꾸지 않고 계속 사용할 수는 없을까? 하는 생각에서 나오게 되었습니다.
이런 생각에서 각각의 DBMS 회사들에서는 JDBC 드라이버라는 JDBC 인터페이스를 구현하여 제공하게 됩니다.
이 JDBC 드라이버는 DBMS 회사들이 자신들의 데이터베이스 시스템에 접근할 수 있도록 표준 JDBC 인터페이스에 명시된 메서드들을 구현한 것입니다.
JDBC는 아래와 같은 특징들이 있는데요.
- SQL문을 개발자가 작성하고 실행해야 합니다.
- 데이터베이스와의 직접적인 연결과 작업을 개발자가 세세하게 관리해야 합니다.
- 결과에 대해서 직접 객체로 변환해주어야 합니다.
- 데이터베이스 연결(`connection`), 명령(`Statement`), 결과(`ResultSet`)를 명시적으로 닫아야 합니다.
- 데이터베이스에 독립적으로 설계되어 있어서 코드의 많은 부분을 수정하지 않아도 다른 DBMS로 전환할 수 있지만, 데이터베이스 간의 차이점을 고려해서 일부분 변경이 필요할 수 있습니다.
JDBC는 가볍고 간단한 작업에 효율적이고 데이터베이스에 대한 완전한 제어가 가능합니다.
대신에 코드가 장황하고 유지보수가 어려우며 객체와 관계형 데이터 간의 변환(ORM)을 직접 구현해야 합니다.
이러한 JDBC의 단점을 보완하기 위해 JDBC를 기반으로 조금 더 보완하여 나온 프레임워크가 SQLMapper (Mybatis 등)입니다.
SQLMapper
SQLMapper는 JDBC의 단점을 보완하기 위해 개발된 프레임워크로, SQL 쿼리 작성과 객체 매핑을 쉽게 만들어줍니다.
JDBC와 JAP의 중간에 해당한다고 볼 수 있습니다.
SQLMapper는 내부적으로 JDBC를 사용하여 데이터베이스와 연결하고 쿼리를 실행하는데요.
개발자가 직접 JDBC 코드를 작성할 필요 없이, SQL 쿼리를 XML이나 애너테이션으로 정의할 수 있게 해 줍니다.
그리고 SQL 쿼리의 실행 결과를 객체에 자동으로 매핑해 주는 기능을 제공합니다.
- SQL 중심 개발
- JPA처럼 SQL을 자동 생성하지 않고, 개발자가 직접 SQL을 작성합니다.
- 데이터베이스와의 상호작용이 SQLMapper에서 제공하는 XML 파일이나 애너테이션을 통해 이루어집니다.
- 객체 매핑 지원
- SQL 쿼리의 결과를 Java 객체로 매핑할 수 있는 기능을 제공합니다.
- 복잡한 SQL 작성이 필요한 경우 유연하게 대응 가능합니다.
- JDBC 코드 간소화
- JDBC를 직접 사용할 때 필요했던 코드(커넥션 관리, `ResultSet` 처리 등)를 프레임워크가 처리해 줍니다.
- 트랜잭션 관리
- SQLMapper는 자체적으로 트랜잭션 관리를 하지 않고, Spring Framework 같은 외부 라이브러리와 함께 사용하는 경우가 많습니다.
JPA (Java Persistence API)
자바 프로그램에서 데이터베이스를 사용하는 방식을 정의한 인터페이스입니다.
자바 ORM 기술 표준으로, 객체와 관계형 데이터베이스 간의 매핑을 처리합니다.
기존에는 자바 프로그램과 데이터베이스를 연결하기 위해 JDBC API를 직접 이용했었는데, 현재는 JPA가 제공해 주는 인터페이스를 통해 편리하게 데이터베이스와 연결이 가능합니다.
JPA는 표준 인터페이스이기 때문에 특정 기능을 하지는 않습니다.
그리고 이 인터페이스를 구현한 구현체가 여러 종류가 있는데 그중 대표적인 것이 하이버네이트(Hibernate)입니다.
JPA는 아래와 같은 특징을 가지고 있습니다.
- SQL을 직접 작성하지 않아도 데이터베이스 작업이 가능합니다.
- 데이터를 객체 모델로 매핑하여 객체 중심으로 데이터 작업을 수행할 수 있습니다.
- 기본적인 기능을 자동으로 처리해 줍니다.
- 데이터베이스 연결 및 트랜잭션 관리
- 엔티티 클래스와 데이터베이스 테이블 간의 매핑 처리
- CRUD 메서드를 자동으로 생성
- 데이터베이스 독립성을 제공합니다.
- 애플리케이션 코드는 데이터베이스에 종속되지 않으며, 다른 데이터베이스로 쉽게 마이그레이션 할 수 있습니다.
이러한 특징 덕분에 개발 생산성이 향상되고, 유지보수가 쉽다는 장점이 있지만,
초기 러닝커브가 존재하고 성능 최적화가 어렵다는 단점이 있습니다.
정리하자면 JDBC, SQLMapper(MyBatis 등), JPA, Hibernate 등은 데이터베이스와의 상호작용을 효율적으로 하기 위해 발전해 온 기술들로, 이를 단계별로 정리하면 아래와 같습니다.
1. JDBC (Java Databse Connectivity)
- JDBC는 Java와 데이터베이스를 연결하는 가장 기본적인 API입니다.
- JDBC는 단순히 표준 API를 제공하며, 모든 Java 애플리케이션은 JDBC를 통해 데이터베이스와 통신합니다.
- 하지만 JDBC는 저수준의 작업(SQL 작성, 커넥션 관리 등)을 직접 처리해야 하므로 코드가 장황하고 유지보수가 어려울 수 있습니다.
2. SQLMapper (MyBatis 등)
- SQLMapper는 JDBC의 직접적인 코드 작성 부담을 줄이기 위해 등장한 프레임워크입니다.
- SQL 쿼리를 직접 작성하되, XML 파일이나 애너테이션으로 관리하여 JDBC의 번거로운 작업(매핑, 커넥션 관리 등)을 간소화합니다.
- 결과 데이터를 Java 객체로 매핑해 주는 기능을 제공합니다.
- 여전히 SQL 중심의 개발을 하므로, SQL 작성의 자유도가 높습니다.
- 복잡한 쿼리를 작성해야 할 때 JPA보다 유리합니다.
- SQLMapper는 내부적으로 JDBC를 사용하여 데이터베이스와 통신합니다.
3. JPA (Java Persistence API)
- JPA는 Java의 표준 ORM(Object-Relational Mapping) 인터페이스로, 객체와 데이터베이스 간의 매핑을 자동화합니다.
- SQL을 직접 작성하지 않고, 객체(Entity)를 통해 데이터베이스 작업을 수행합니다.
- 데이터를 객체와 매핑하므로 개발자는 객체 중심으로 작업이 가능합니다.
- 데이터베이스 독립성을 제공하며, 코드의 생산성과 유지보수성이 높아집니다.
- JPA도 내부적으로 JDBC를 사용합니다. JDBC 위에 추상화 계층을 추가하여 객체 지향적인 데이터베이스 접근 방식을 제공합니다.
4. Hibernate (JPA 구현체)
- Hibernate는 JPA 표준 인터페이스를 구현한 구현체 중 하나로, 가장 널리 사용되는 ORM 프레임워크입니다.
- JPA 인터페이스를 따르지만, JPA 표준 이상으로 다양한 고유 기능(HQL, 캐싱 등)을 제공합니다.
HQL은 Hibernate Query Language의 약자로, SQL과 유사하지만, 데이터베이스의 테이블 대신 JPA 엔티티를 대상으로 쿼리를 수행하는 언어
- JPA가 제공하지 않는 세부적인 성능 최적화 및 데이터베이스 기능을 지원합니다.
- Hibernate 외에도 EclipseLink, OpenJPA 등이 JPA를 구현한 다른 프레임워크입니다.
- JPA는 인터페이스(표준)이고, Hibernate는 그것을 구현한 구현체입니다.
- JPA를 사용한다는 것은 특정 구현체(Hibernate, EclipseLink 등)를 사용한다는 것을 의미합니다.
[DB] 하이버네이트(Hibernate)란?
ORM 기술에 대한 명세인 JPA(Java Persistence API)의 구현체의 한 종류 JPA의 구현체이므로 JPA의 특징을 함께 정리했어요. Hibernate란? 하이버네이트는 자바 언어를 위한 ORM 프레임워크에요. JPA의 구현체
livenow14.tistory.com
JDBC, JPA, Hibernate, Spring Data JPA 차이
필자는 JDBC, Spring Data JPA를 사용해본 경험이 있다. 정확히 말하자면 사용해본 경험'만' 있다. 다른 개발자분과 Spring Data JPA에 대해 의견을 나누던 중 JDBC, Hibernate 등의 키워드가 나왔었지만 정확히
velog.io