이끌든지 따르든지 비키든지

Framework/JPA

[JPA] JPA(Java Persistence API)란?

SeongHo5 2024. 1. 2. 20:00

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차 캐시를 지원하여 성능 향상에 기여한다. 이러한 캐싱 메커니즘은 데이터베이스와의 불필요한 상호 작용을 줄여 성능 개선에 도움을 준다.

 

  • 유지보수 및 생산성 : 객체 모델을 중심으로 개발함으로써 애플리케이션의 유지보수와 확장성이 향상된다. 또한, 반복적인 작업 감소로 개발 생산성이 증가한다.