JPA | MyBatis | JDBC
JPA (Java Persistence API)
자바에서 객체와 관계형 데이터베이스를 매핑하는 표준 API
엔티티 클래스를 통해 데이터를 객체로 관리하고, 객체 상태에 따라 자동으로 DB와 연동됨
주로 Hibernate와 함께 사용됨
- JPA는 규격(specification)이고, Hibernate는 그 구현체(implementation)
- Hibernate는 JPA를 구현하면서, JPA가 정의한 기능을 지원하고, 그 외에도 Hibernate만의 고유 기능을 추가로 제공함
@Entity
public class User {
@Id
private Long id;
private String name;
// getter, setter
}
JPQL (Java Persistence Query Language)
JPA에서 제공하는 객체 지향 쿼리 언어
SQL과 유사하지만, 테이블 대신 엔티티를 대상으로 쿼리를 작성함
데이터베이스 종속성을 줄이는 데 유리
String jpql = "SELECT u FROM User u WHERE u.name = :name";
List<User> users = entityManager.createQuery(jpql, User.class)
.setParameter("name", "John")
.getResultList();
Querydsl
타입 안전한 쿼리 생성을 위한 라이브러리
JPQL, SQL 등을 타입 안전하게 작성할 수 있도록 도와주며, 코드 작성 시 컴파일 타임에 오류를 잡을 수 있음
QUser user = QUser.user;
JPAQuery<User> query = new JPAQuery<>(entityManager);
List<User> users = query.select(user)
.from(user)
.where(user.name.eq("John"))
.fetch();
Native Query
데이터베이스에 의존적인 SQL 쿼리
JPA에서 SQL을 그대로 작성하여 실행할 수 있도록 해주며, 복잡한 쿼리나 최적화가 필요한 경우 사용됨
String sql = "SELECT * FROM user WHERE name = ?";
List<User> users = entityManager.createNativeQuery(sql, User.class)
.setParameter(1, "John")
.getResultList();
JdbcTemplate
Spring에서 제공하는 JDBC 템플릿 클래스
JDBC 코드 작성 시 필요한 반복적인 작업을 처리해 주며, 예외 처리와 자원 관리를 자동으로 해줌
SQL 쿼리를 실행하고 결과를 처리하는 데 유용
String sql = "SELECT * FROM user WHERE name = ?";
List<User> users = jdbcTemplate.query(sql, new Object[]{"John"}, new BeanPropertyRowMapper<>(User.class));
MyBatis
SQL 매퍼 프레임워크
SQL 쿼리와 자바 객체 간의 매핑을 XML 파일을 통해 설정하며, 복잡한 쿼리를 명확하게 관리할 수 있음
JPA보다 더 세밀한 제어가 가능
<select id="getUserByName" resultType="User">
SELECT * FROM user WHERE name = #{name}
</select>
User user = sqlSession.selectOne("getUserByName", "John");
ORM (Object-Relational Mapping) 기반 (JPA vs MyBatis)
특징 | JPA | MyBatis |
장점 | - 객체 지향적, DB와의 자연스러운 연동 - 데이터베이스 독립적 - 자동 CRUD 처리 |
- 세밀한 SQL 제어 가능 - 복잡한 쿼리나 성능 최적화 유리 |
단점 | - 복잡한 쿼리나 성능 최적화 불편 - 학습 곡선이 있음 |
- SQL을 명시적으로 작성해야 해서 객체 지향적이지 않음 - 데이터베이스 종속적 |
사용 예 | - CRUD 중심의 애플리케이션 - 데이터베이스 독립적인 환경 |
- 복잡한 SQL 로직이나 성능 최적화가 중요한 환경 |
쿼리 작성 방식 (JPQL vs Querydsl)
특징 | JPQL | Querydsl |
장점 | - 객체 지향적 쿼리 작성 - 데이터베이스 독립적 |
- 타입 안전한 쿼리 작성 - 컴파일 타임에 오류 잡힘 |
단점 | - 복잡한 쿼리 작성 시 불편 - 성능 최적화 어려움 |
- 학습이 필요하고 설정이 복잡함 |
사용 예 | - 간단한 쿼리 및 데이터베이스 독립적인 애플리케이션 | - 복잡한 쿼리나 동적 쿼리 작성이 필요한 환경 |
SQL 실행 방식 (Native Query vs JdbcTemplate)
특징 | Native Query | JdbcTemplate |
장점 | - SQL 직접 작성 가능 - 성능 최적화 유리 |
- JDBC 반복 작업 처리 - 예외 처리 및 자원 관리 자동화 |
단점 | - 데이터베이스에 종속적 - 유지보수 어려움 |
- SQL을 여전히 직접 작성해야 함 - 복잡한 쿼리 시 가독성 저하 |
사용 예 | - 복잡한 쿼리나 성능 최적화가 필요한 경우 | - 간단한 SQL 처리 및 반복 작업이 필요한 경우 |
영속성
영속성은 애플리케이션의 객체와 데이터베이스 간의 상태 동기화를 의미
객체가 생성되거나 수정될 때, 이 변화가 데이터베이스에 반영되어야 하는데, 이를 관리하는 과정을 의미
영속성 관리는 객체의 상태를 추적하고, 데이터베이스와의 동기화를 자동으로 처리하거나 개발자가 수동으로 처리할 수 있게 도와줌
필요성
- 객체와 데이터베이스의 동기화: 객체의 상태 변경이 데이터베이스에 반영되어야 데이터 일관성 유지
- 효율적인 데이터 처리: 객체 상태를 자동으로 관리함으로써 개발자가 일일이 데이터베이스와 상호작용하는 코드 작성을 줄여줌
- 트랜잭션 관리: 영속성 관리는 트랜잭션 범위 내에서 객체 상태를 관리하며, 데이터베이스와의 일관된 상태 보장
JPA, Hibernate
- 영속성 관리: 영속성 컨텍스트 사용, 객체 상태 자동 관리, DB와 동기화
- 영속성 상태:
- Transient: 객체가 영속성 컨텍스트에 없는 상태
- Managed: 객체가 영속성 컨텍스트에 있어 DB와 동기화되는 상태
- Detached: 객체가 영속성 컨텍스트에서 분리된 상태
- Removed: 삭제된 객체 상태
QueryDSL
- 영속성 관리: JPA와 함께 사용, 영속성 관리 JPA가 담당, 쿼리 작성만 담당
Native Query
- 영속성 관리: SQL 직접 작성, 영속성 컨텍스트와 동기화 안 됨, 수동으로 상태 관리 필요
JDBC, JdbcTemplate
- 영속성 관리: 객체 상태 자동 관리 안 됨, SQL 직접 작성, 수동으로 상태 관리
MyBatis
- 영속성 관리: 객체 상태 자동 관리 안 됨, SQL 매핑, 명시적 쿼리로 상태 동기화
JDBC (Java Database Connectivity)
Java와 데이터베이스 연결을 위한 표준 API
SQL 쿼리 실행, 데이터베이스 상호작용을 직접 처리
특징
- SQL 직접 사용
- 연결 관리 (Connection, Statement 등)
- 트랜잭션 처리
- 표준화된 인터페이스
다른 기술들과 차이점
- JPA: 객체-관계 매핑(ORM) 기술, 데이터베이스 테이블을 객체로 매핑해 SQL을 직접 작성하지 않고 객체를 통해 데이터 처리
- JPQL: JPA에서 사용하는 객체 지향 쿼리 언어, SQL 대신 엔티티 객체에 대해 쿼리 작성
- QueryDSL: JPA와 함께 사용, 타입 안전한 동적 쿼리 생성, 코드에서 쿼리 조건을 동적으로 구성
- Native Query: JPA에서 SQL을 그대로 실행, 데이터베이스에 특화된 쿼리 사용
- JDBC: 데이터베이스와 직접 연결하여 SQL 쿼리 실행, 데이터베이스와의 상호작용을 직접 처리
- JdbcTemplate: Spring에서 제공하는 클래스, JDBC를 쉽게 사용할 수 있도록 도와주며 예외 처리와 리소스 관리를 간소화
- MyBatis: SQL 매핑 프레임워크, SQL을 XML에 작성하고 Java 메서드와 매핑하여 사용, SQL을 세밀하게 제어 가능
Spring과 데이터베이스 연결
JPA
연결
- Spring Data JPA를 사용해 연결
- 영속성 컨텍스트를 사용하여 객체 상태 자동 관리
- EntityManagerFactory, JpaTransactionManager 설정
- 쿼리 처리는 JpaRepository 및 JPQL을 통해 자동으로 처리
연결 순서:
- DataSource 설정: 데이터베이스 연결 정보 설정
- EntityManagerFactory 빈 등록: JPA가 DB와 연결하는 데 필요한 설정
- JpaTransactionManager 설정: 트랜잭션 관리 설정
- Spring Data JPA 사용: @Repository와 JpaRepository로 쿼리 실행
MyBatis
연결
- MyBatis-Spring을 사용해 연결
- XML이나 애너테이션으로 SQL 매핑
- SqlSessionFactory와 SqlSessionTemplate을 사용
연결 순서:
- DataSource 설정: 데이터베이스 연결 정보 설정
- SqlSessionFactory 빈 등록: MyBatis 설정
- SqlSessionTemplate 설정: SQL 실행 템플릿 설정
- @Mapper 인터페이스 사용: SQL 매핑 및 데이터 처리
JDBC
연결
- JdbcTemplate을 사용해 연결
- SQL 쿼리를 수동으로 작성하고 실행
- JDBC API와 DataSource를 사용해 DB와 상호작용
연결 순서:
- DataSource 설정: 데이터베이스 연결 정보 설정
- JdbcTemplate 빈 등록: JDBC 템플릿을 통해 SQL 실행
- SQL 쿼리 실행: JdbcTemplate을 통해 SQL 쿼리 실행 및 데이터 처리
JDBC 관련 용어
- JDBC Driver: 데이터베이스와 연결을 위한 드라이버
- DriverManager: JDBC 드라이버를 관리하고, 연결을 생성
- JDBC API: SQL 쿼리 실행을 위한 인터페이스 (예: Connection, Statement, ResultSet)
JPA와 JDBC의 차이
- JPA는 JDBC Driver, DriverManager, JDBC API를 사용 X
- JPA는 자체적으로 영속성 컨텍스트를 관리하여 객체 상태와 데이터베이스 동기화를 처리
- JDBC는 JDBC Driver, DriverManager, JDBC API를 사용해 직접 DB와 상호작용하고 SQL 쿼리를 실행
- JPA는 객체 지향적인 방식으로 데이터베이스와 상호작용
- JDBC는 데이터베이스와 직접적으로 상호작용
- MyBatis는 SQL 매핑 방식으로, JDBC를 활용하여 SQL을 실행하되 SQL을 XML 또는 애너테이션으로 관리