JPA & ORM의 개념과 동작과정 및 장점

wondi·2025년 1월 5일

☕️ JPA?

  • Java persistence api
  • 자바의 ORM 기술 표준

🍪 ORM?

  • Object-relational mapping : 객체 관계 매핑
  • 객체는 객체대로 설계됨
  • 관계형 데이터베이스는 관계형 데이터베이스대로 설계됨
  • ORM 프레임워크가 중간에서 매핑함

☕️JPA 동작

  • JPA는 애플리케이션과 JDBC사이에서 동작함
    • JPA가 데이터베이스와 상호작용을 직접 처리하지 않고 JDBC를 사용해 간접적으로 데이터베이스와 통신한다는 의미

JDBC란

  • JDBC는 자바프로그램에서 RDB(관계형 데이터베이스)에 접근할 수 있도록 하는 표준 API
  • JDBC는 자바애플리케이션과 DB의 다리 역할을 함
  • SQL쿼리를 실행하고 데이터베이스와 상호작용할 수 있도록 함

JDBC의 구성요소
1. JDBC Driver

  • 데이터베이스 벤더가 제공하는 JDBC 드라이버를 통해 DB와 연결함
  • 드라이버는 특정 DBMS의 프로토콜을 처리하는 라이브러리
  1. JDBC API
  • 개발자가 db와 상호작용할 수 있도록 제공되는 표준 인터페이스
    - DriverManager: 데이터베이스 연결을 관리.
    • Connection: 데이터베이스와의 연결을 나타냄.
    • Statement / PreparedStatement: SQL 실행을 위한 객체.
    • ResultSet: SQL 쿼리 결과를 저장하는 객체.

동작과정: 애플리케이션 -> JPA -> JDBC -> DB


1. 엔티티 저장(insert)

@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private String email;
}

public void saveUser(EntityManager em) {
    em.getTransaction().begin(); // 트랜잭션 시작
    User user = new User();
    user.setName("wondi");
    user.setEmail("wondi@velog.com");
    em.persist(user); // 엔티티 저장 요청
    em.getTransaction().commit(); // 트랜잭션 커밋
}

내부동작

  1. 애플리케이션이 EntityManager.persist() 호출
  2. JPA는 User 객체 상태를 감지, SQL insert문으로 변환함
  3. JPA는 JDBC API를 사용해 SQL을 실행
  4. JDBC가 SQL을 실행, 데이터베이스에 저장
  1. 엔티티조회(select)
User user = em.find(User.class, 1L); // ID 1인 User 조회

내부동작

  1. 애플리케이션이 EntityManager.find()를 호출
  2. JPA는 1차 캐시에서 ID가 1L인 user를 찾음 (없으면 데이터베이스로 요청)
  3. JPA가 select문을 생성하고 JDBC를 사용해 실행함
  4. JDBC결과 반환, JPA는 데이터를 User 객체로 매핑하고 반환

JPA와 JDBC의 관계

  1. JPA

    • 객체 지향적인 API 제공 후, SQL작성과 DB처리 추상하
    • 개발자는 엔티티 객체만 조작하면 됨
  2. JDBC

    • JPA가 생성한 SQL문을 데이터베이스로 전달하고 결과를 반환
    • DB와 통신을 수행하는 역할

JPA 동작 - 저장

출처: 자바 ORM표준 JPA(김영한)

JPA 동작 - 조회

  • JPA는 표준 명세를 구현한 하이버네이트, EclipseLink, DataNucleus 구현체.

JPA의 장점

  1. 객체와 관계형 데이터베이스의 매핑
    • SQL 중심 개발에서 객체 중심으로 개발 가능 -> 생산성, 유지보수 증가
    • JPA가 SQL변환 및 실행을 처리
  2. 변경감지_dirty check
    • JPA가 엔티티 상태를 자동으로 감지, SQL생성(insert, update, delete등)
  3. 간단한 코드
    • JPA 사용 시 JDBC 반복 코드 필요없어짐
  4. 데이터베이스 독립성
    • 애플리케이션이 데이터베이스에 의존하지 않음
    • 데이터접근 추상화와 벤더 독립성
  5. 패러다임의 불일치 해결

생산성 증가(JPA & CRUD)

  • 저장 : jpa.persist(mem)
  • 조회 : Member mem = jpa.find(memberid)
  • 수정 : member.setName("변경이름")
  • 삭제 : jpa.remove(mem)

유지보수

  • JPA 필드만 추가하면 되며, SQL은 JPA가 처리해줌

성능 최적화

  1. 1차 캐시와 동일성 보장
  2. 트랜잭션을 지원하는 쓰기 지연
  3. 지연 로딩
profile
Developer Wondi

0개의 댓글