스프링/개념

JPA 에 관하여 [자바 ORM 표준 JPA 프로그래밍]

문상휘파람 2024. 9. 10. 14:06

JPA란 무엇인가?

  • JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준입니다. 애플리케이션과 JDBC 사이에서 동작합니다.

ORM이란 무엇인가?

  • Object-Relational Mapping 이름 그대로 객체와 관계형 데이터 베이스 매핑한다는 뜻.
  • ORM 프레임워크는 객체와 테이들블 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결합니다.
    • ex) 개발자가 insert SQL문을 직접 작성하는 것이 아니라, 객체르 자바 컬렉션에 저장하듯 ORM 프레임워크에 저장하면 됨. -> ORM 프레임워크가 자동 매핑.
  • 자바 진영의 대표적인 ORM 프레임 워크 : Hibernate

JPA를 사용하는 하는 이유

  1. 생산성
    • 지루하고 반복적인 CRUD용 SQL을 개발자가 직접 작성하지 않아도 됩니다.
    • Create Table 같은 DDL 문을 자동으로 생성해주는 기능 있습니다.
  2. 유지보수
    • SQL 직접 다루면 엔티티에 필드 하나 추가만 해도 관련된 JDBC API 수정해야 합니다. But JPA 사용하면 JPA가 대신 처리 가능합니다. => 유지보수 해야하는 코드 줄어듭니다.
    • 패러다임 불일치 문제를 해결해주므로 객체지향 언어가 가진 장점을 활용해서 유지보수하기 좋은 도메인 모델을 편리하게 설계 가능합니다
  3. 패러다임의 불일치 해결
    • 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결합니다.
      • 상속 :
        • JDBC API 사용하면 부모 객체 데이터 꺼내오는 코드, 자식 객체 데이터 꺼내오는 SQL 코드 다 만들어야함. => JPA 사용하면 해결
        • 자바 컬렉션에 저장하듯 JPA에 객체를 저장하면 됌. ex) jpa.persist()
      • 연관관계 : 참조로 연관관계 맺을 수 있음 -> 저장, 조회 등 기능 할때 참조로 해결 가능. ex) entity에 Team team 선언. 외래 키 선언 필요 X.
      • 객체 그래프 탐색(참조를 사용해 연관된 팀 찾는 것):
        • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해짐. => 개발자에게 너무 큰 제약(SQL에 의존적인 개발)
        • JPA 사용하면 객체 그래프 마음껏 탐색 가능. 지연로딩(필요한 시점에 데이터를 꺼내오는 것)을 투명하게 처리.
      • 비교 :
        • 테이블은 기본 키의 값으로 row 구분 - 객체는 동일성(==)과 동등성(equals)을 구분
        • JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장함.
  4. 성능
    • JPA는 애플리케이션과 데이터베이스 사이에서 작동 -> 최적화 관점에서 시도해 볼 수 있는 것이 많습니다.
  5. 데이터 접근 추상화와 벤더 독립성
    • 관계형 데이터 베이스는 같은 기능도 벤더마다 사용법이 다른 경우 많이 있습니다.(ex) 페이징, 데이터베이스 마다 페이징 처리 기법이 달라서 따로 따로 익혀야 함) -> JPA 사용하면 데이터 베이스 변경할 때 다른 데이터베이스를 사용한다고 알려주기만 하면 문제 해결 가능합니다.

JPA 원리

  • 자바 객체와 데이터베이스 테이블 간의 매핑을 통해 객체지향 프로그래밍의 장점을 유지하면서 데이터베이스와 상호작용합니다. 엔티티, 엔티티 매니저, 영속성 컨텍스트, JPQL을 통해 데이터의 생성, 조회, 업데이트, 삭제 작업을 수행합니다.

JPA 자세한 원리

  1. 엔티티 매니저 팩토리에서 엔티티 매니저 생성 -> 엔티티 매니저 내부에 영속성 컨텍스트 같이 만들어짐.(영속성 컨텍스트는 엔티티 매니저를 통해 접근 가능)
  2. 영속성 컨텍스트가 가상의 데이터베이스 같은 역할을 수행 -> 영속성 컨텍스트 덕분에 1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경감지, 지연 로딩 사용 가능합니다.
  3. 영속성 컨텍스트에 저장한 엔티티 플러시 통해 데베 반영 (일반적으로 트랜잭션을 커밋할 때 영속성 컨텍스트 플러시)

JPA 특징

  1. 객체-관계 매핑(ORM)
    • 엔티티는 데이터베이스 테이블에 매핑되며, 필드는 테이블의 열에 매핑합니다.
  2. 투명한 데이터 접근
    • 엔티티 매니저를 통해 데이터베이스 접근이 이루어지므로, 데이터베이스 종속성을 줄일 수 있습니다.
  3. 캐싱
    • JPA는 1차 캐시를 통해, 동일한 트랜잭션 내에서 동일한 엔티티에 대한 중복 조회를 방지합니다.
    • 2차 캐시를 통해 애플리케이션 전반에 걸쳐 엔티티를 캐싱할 수 있습니다.
  4. 자동화된 DDL 생성
    • 엔티티 클래스의 매핑 정보를 기반으로 데이터베이스 테이블을 자동으로 생성 및 변경할 수 있습니다.
    • 개발 초기 단계에서 데이터베이스 스키마를 쉽게 설정 가능합니다.
  5. 트랜잭션 관리
    • JPA는 트랜잭션 관리를 제공하여, 데이터베이스 작업의 원자성, 일관성, 고립성, 지속성을 보장할 수 있습니다.
    • 엔티티 매니저의 트랜잭션을 통해 데이터 무결성을 유지합니다.
  6. 지연로딩과 즉시로딩