JPA(Java Persistence API)는 Java EE 환경에서 객체 관계 매핑(ORM)을 위한 공식적인 표준이다.
자바 객체와 DB 테이블 간의 매핑을 관리하고, 데이터를 보다 객체 지향적으로 다룰 수 있게 해주는 프레임워크이다.
JPA 이전의 데이터베이스 접근 방식
초기에 자바에서 DB와의 연동은 주로 JDBC(Java Database Connectivity)를 통해 이루어졌다.
public void addMember(int id, String name, String email) {
String sql = "INSERT INTO member (id, name, email) VALUES (?, ?, ?)";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, id);
pstmt.setString(2, name);
pstmt.setString(3, email);
int affectedRows = pstmt.executeUpdate();
if (affectedRows > 0) {
System.out.println("회원 정보가 등록되었습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
JDBC는 DB에 직접 연결하여 SQL 쿼리를 실행하고 결과를 처리하는 저수준 API다.
이 방식은 SQL 쿼리와 자바 코드가 섞여 코드의 가독성과 유지보수성이 낮아지고, 데이터베이스 변경 시 SQL 문법이 바뀌어 코드 수정이 필요하다는 단점이 존재했다.
이러한 문제를 해결하기 위해 Persistence Framework가 개발되었다.
예시 - SQL Mapper(MyBatis)
<!-- 실제 SQL 쿼리를 정의하는 Mapper XML 파일 -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MemberMapper">
<!-- 회원 정보 등록 -->
<insert id="insertMember" parameterType="Member">
INSERT INTO member (id, name, email)
VALUES (#{id}, #{name}, #{email})
</insert>
<!-- 회원 정보 조회 -->
<select id="selectMember" parameterType="int" resultType="Member">
SELECT * FROM member WHERE id = #{id}
</select>
</mapper>
// Mapper XML 파일에 정의된 SQL 작업을 메서드로 정의하는 Mapper 인터페이스
public interface MemberMapper {
void insertMember(Member member); // Member 클래스는 구현했다고 가정
Member selectMember(int id);
}
MyBatis는 SQL 쿼리를 XML 파일로 분리하여 관리할 수 있게 하며, 객체와 SQL 쿼리의 매핑을 용이하게 해 준다.
그러나 여전히 SQL을 직접 작성해야 하는 번거로움이 있었다.
JPA의 등장 배경
JPA는 "객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수는 없을까?"라는 생각에서 출발했다.
- 패러다임 불일치* 해결 : 기존 방식으로는, 패러다임 불일치 해결에 필요 이상의 노력과 시간이 필요했고, 이 문제를 효율적으로 해결할 방법이 요구됐다.
- 개발의 복잡성 및 시간 소모 감소 필요성 : 객체를 데이터베이스 테이블에 매핑하기 위한 반복적이고 시간 소모적인 작업을 단순화할 필요가 있었다.
※ 패러다임 불일치란?
OOP(객체 지향 프로그래밍)과 RDB(관계형 데이터베이스) 간의 기본적인 차이점에서 발생하는 문제를 말하는데, 주요 문제는 아래와 같다.
1. 상속 : OOP에서는 상속을 통해 계층을 만들 수 있지만, RDB에서는 이러한 계층 구조를 표현하기 어렵다.
2. 연관성 관리 : 객체는 참조로 다른 객체와 연관되지만, RDB는 외래키를 통한 관계로 이를 표현한다.
3. 데이터 네비게이션 : 객체는 연관된 객체를 직접 참조할 수 있지만, RDB는 조인을 통해 접근해야 한다.
4. 엔티티 식별 : OOP는 객체의 인스턴스로 동일 여부를 식별하지만, RDB는 주로 키(PK)를 통해 식별한다.
JPA의 특징
- 표준화된 ORM(Object-Relational Mapping) : JPA는 자바 플랫폼에서 표준화된 ORM 기술로, 객체와 관계형 데이터베이스 테이블 간의 매핑을 쉽게 하여 객체 지향적인 데이터 접근을 가능하게 한다.
- 데이터베이스 독립적 : JPA 사용 시 특정 데이터베이스 SQL에 종속되지 않는다. 이는 다양한 데이터베이스 제품을 같은 방식으로 다룰 수 있으며, 필요에 따라 데이터베이스 교체가 용이하다는 것을 의미한다.
- CRUD 작업 간소화 : JPA를 통해 복잡한 CRUD(Create, Read, Update, Delete) 작업이 간단한 메소드 호출로 처리될 수 있다. 이는 개발자가 비즈니스 로직에 더 집중할 수 있게 해준다.
- 객체 중심의 쿼리 언어를 제공: JPA는 JPQL(Java Persistence Query Language)이라는 객체 지향 쿼리 언어를 제공한다. 이를 통해 객체를 중심으로 데이터를 조회하고 처리할 수 있다.
- 풍부한 캐싱 메커니즘 : JPA는 1차 캐시와 2차 캐시를 지원하여 성능 향상에 기여한다. 이러한 캐싱 메커니즘은 데이터베이스와의 불필요한 상호 작용을 줄여 성능 개선에 도움을 준다.
- 유지보수 및 생산성 : 객체 모델을 중심으로 개발함으로써 애플리케이션의 유지보수와 확장성이 향상된다. 또한, 반복적인 작업 감소로 개발 생산성이 증가한다.
'Framework > JPA' 카테고리의 다른 글
[JPA] @Converter 암호화를 사용해 데이터베이스 보안 강화하기 (0) | 2024.08.24 |
---|---|
[JPA] 패러다임 불일치 (0) | 2024.01.04 |