JPA란 무엇인가?
JPA(Java Persistence API)는 자바 진영의 ORM(Object-Relational Mapping) 기술 표준이다. JPA는 애플리케이션과 데이터베이스를 연결하는 중간 계층 역할을 하며, JDBC를 직접 사용하지 않고도 데이터베이스 작업을 수행할 수 있도록 돕는다.
ORM이란 무엇인가?
ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스의 데이터를 매핑하여 객체지향 프로그래밍 언어와 관계형 데이터베이스 간의 패러다임 불일치 문제를 해결하는 기술이다. ORM을 사용하면 개발자가 객체를 데이터베이스에 저장하거나 조회할 때 SQL을 직접 작성할 필요 없이, ORM 프레임워크가 이를 대신 처리해 준다.
- 객체를 DB에 저장할 때: 개발자는 객체를 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 된다. ORM이 자동으로 Entity 분석, INSERT SQL 생성, JDBC API 사용, 패러다임 불일치 해결을 수행한다.
- 객체를 DB에서 조회할 때: JPA를 통해 객체를 직접 조회할 수 있다. ORM이 SELECT SQL 생성, JDBC API 생성, ResultSet 매핑을 수행하여 개발자는 객체 형태로 데이터에 접근할 수 있다.
JPA의 역사와 발전
ORM 프레임워크는 객체와 관계형 데이터베이스의 패러다임 불일치 문제를 해결하기 위해 발전해 왔다. Java 진영에서는 과거에 엔터프라이즈 자바 빈즈(EJB)라는 기술 표준을 통해 ORM 기능을 제공했으나, 복잡하고 제약이 많아 널리 사용되지 못했다.
이때 등장한 Hibernate는 가볍고 실용적인 오픈 소스 ORM 프레임워크로, ORM 기능을 개선하면서 패러다임 불일치 문제를 대부분 해결했다. 이후 Hibernate를 바탕으로 새로운 Java ORM 표준인 JPA가 등장했으며, 현재는 Hibernate가 가장 많이 사용되는 JPA 구현체 중 하나로 자리 잡았다.
JPA를 사용하는 이유
JPA는 개발 생산성 향상과 유지보수성 증대, 패러다임 불일치 해결, 성능 최적화 등의 이유로 널리 사용된다.
- 생산성: SQL을 직접 작성하거나 JDBC API를 사용할 필요가 없으므로 코드가 간결해지고, 개발 생산성이 높아진다.
- 유지보수성: 엔티티에 필드를 추가하거나 수정할 때 관련 SQL과 JDBC 코드를 직접 수정할 필요 없이, JPA가 자동으로 처리해 준다.
- 패러다임 불일치 해결: 객체와 관계형 데이터베이스의 구조적 차이를 해결하여, 개발자가 객체지향 패러다임에 맞게 코드를 작성할 수 있다.
- 성능: JPA는 1차 캐시와 같은 성능 최적화 기능을 제공하여, 성능을 효율적으로 관리할 수 있다.
- 데이터 접근 추상화 및 벤더 독립성: JPA는 Dialect 인터페이스를 통해 다양한 DBMS와 호환될 수 있는 추상화 계층을 제공한다. 이를 통해 특정 DBMS에 종속되지 않으며, 데이터베이스를 쉽게 교체할 수 있다.
JPA 기본: 엔티티와 테이블 매핑
JPA에서 엔티티를 정의하고 테이블과 매핑하는 방식은 아래와 같다.
@Entity
@Table(name = "MEMBER")
public class Member {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String username;
private Integer age;
// Getter, Setter 생략
}
- @Entity: 해당 클래스가 데이터베이스 테이블에 매핑될 엔티티임을 JPA에게 알린다.
- @Table: 엔티티 클래스가 매핑될 테이블 정보를 설정한다. name 속성을 통해 Member 엔티티를 MEMBER 테이블과 매핑했다.
- @Id: 엔티티 클래스의 필드를 테이블의 기본 키에 매핑하며, 이를 식별자 필드라 한다.
- @Column: 특정 필드를 테이블의 컬럼과 매핑할 때 사용하며, name 속성을 통해 컬럼명을 지정할 수 있다.
- 매핑 정보가 없는 필드: 매핑 어노테이션을 생략하면 필드명을 컬럼명으로 사용하여 매핑한다.
JPA 설정 예시
JPA 설정에는 JDBC 드라이버, 데이터베이스 접속 정보, Hibernate 방언(Dialect) 등의 설정이 필요하다.
## JPA 표준 속성
# JDBC 드라이버
spring.datasource.driverClassName=org.h2.Driver
# DB 접속 아이디 (비밀번호 없음)
spring.datasource.username=sa
# DB 접속 URL
spring.datasource.url=jdbc:h2:tcp://localhost/~/h2db
## Hibernate 속성
# Hibernate 방언(Dialect) 설정
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
데이터베이스 방언(Dialect)
JPA는 특정 데이터베이스에 종속되지 않는 기술이기 때문에, 데이터베이스 교체가 용이하다. 하지만 각 데이터베이스의 SQL 문법과 함수가 다를 수 있는데, JPA는 이를 해결하기 위해 방언(Dialect)이라는 개념을 사용한다. 방언은 특정 DBMS에 맞는 SQL을 생성하기 위한 설정으로, 예를 들어 H2 데이터베이스에는 org.hibernate.dialect.H2Dialect
방언을 설정하여 JPA가 SQL을 해당 DBMS에 맞춰 실행할 수 있도록 돕는다.
이 글에서는 JPA의 개념과 필요성, 엔티티 매핑과 설정 방법을 설명하였다. JPA는 Java 애플리케이션과 데이터베이스 간의 효율적인 연동을 가능하게 하여 개발 생산성과 유지보수성을 높여주는 중요한 기술로 자리 잡고 있다.
Reference
[도서] 자바 ORM 표준 JPA 프로그래밍 (김영한 저)
'DB > JPA' 카테고리의 다른 글
[📗자바 ORM 표준 JPA 프로그래밍] 양방향 연관관계 매핑 및 주인 정하기 (0) | 2024.11.13 |
---|---|
[📗자바 ORM 표준 JPA 프로그래밍] 단방향 연관관계 매핑하기 (0) | 2024.11.12 |
[📗자바 ORM 표준 JPA 프로그래밍] JPA의 기본 어노테이션과 테이블 매핑 (0) | 2024.11.11 |
[📗자바 ORM 표준 JPA 프로그래밍] 엔티티 매니저와 영속성 컨텍스트, 엔티티의 생명 주기 (0) | 2024.11.10 |
[📗자바 ORM 표준 JPA 프로그래밍] JPA와 패러다임 불일치 (0) | 2024.11.04 |
댓글