728x90
반응형
728x90
JPA (Java Persistence API)
- Java 애플리케이션에서 객체-관계 매핑(ORM) 기술을 사용하여 데이터베이스와 상호 작용하는 표준 API
- Java EE (Enterprise Edition) 스펙의 일부로, 객체지향 프로그래밍과 관계형 데이터베이스 사이의 간극을 줄여줌
- JPA는 인터페이스의 모음이며, 실제 구현은 여러 ORM 프레임워크에서 제공
- 주요 구현체
- Hibernate: 가장 널리 사용되는 JPA 구현체로, 풍부한 기능과 높은 성능을 제공
- EclipseLink: Eclipse Foundation에서 제공하는 구현체로, Java EE의 참조 구현
- OpenJPA: Apache Software Foundation에서 제공하는 오픈 소스 구현체
SQL 중심 개발의 문제점
- 상속 표현의 차이
- 객체: 인터페이스 상속을 통해 사용
- SQL: 외래키를 사용한 슈퍼타입-서브관계 표현
- 상속이 표현된 객체 DB에 저장 시 객체를 분해하여 각자 insert 쿼리 필요
- 상속이 표현된 객체 조회 시 각각 테이블에 대한 조인과 각각 객체를 생성하는 등 복잡한 과정 필요
- 연관 관계 표현의 차이
- 객체: 참조를 통한 연관 관계 표현
- SQL: 외래키를 통한 연관 관계 표현
- 객체는 참조를 통해 객체 그래프를 표현하여 객체 참조 그래프를 자유롭게 탐색하기 위해선 조회 시 연관된 모든 참조 객체를 같이 조회해야 함
- 엔티티 신뢰 문제
- 자유로운 탐색을 위해선 모든 연관된 객체를 미리 로딩해야 하나 성능상 불가능함
- 상황에 따라 동일한 조회를 여러 번 생성할 가능성이 있고 재조회로 생성된 인스턴스는 다른 인스턴스이기 때문에 데이터의 신뢰성이 떨어짐
ORM(Object-relational mapping)
- 객체는 객체의 형태로 설계
- 관계형 데이터베이스는 관계형 데이터베이스 형태로 설계
- ORM 프레임워크가 중간에서 매핑 작업을 실행
사용 목적
- 객체 중심적 개발 가능
- 생산성 향상 및 유지보수 편리
- 개발자는 SQL 쿼리를 직접 구현할 필요 없음
- 변경된 필드를 감지해 JPA가 직접 처리
- 패러다임 불일치 해결
- 상속관계, 연관 관계 문제를 JPA가 직접 처리
- 동일한 트랜잭션 내에 조회한 엔티티는 같음을 보장
- 성능 최적화
- 1차 캐시와 동일성 보장:
- 격리 수준이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
- 트랜잭션을 지원하는 쓰기 지원:
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모아 JDBC BATCH SQL 기능을 사용해서 한 번에 전송
- 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
- 지연 로딩과 즉시 로딩
- 지연 로딩: 객체가 실제 사용될 때 로딩
- 즉시 로딩: JOIN SQL로 한 번에 연관된 객체까지 미리 조회
- 1차 캐시와 동일성 보장:
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런 (inflearn.com) 강의 내용 참고
728x90
'백엔드 > Spring' 카테고리의 다른 글
[Spring] JPA 엔티티 매핑 (0) | 2024.09.09 |
---|---|
[Spring] 영속성 컨텍스트 (Persistence Context) (0) | 2024.09.08 |
[Spring] 변경 감지 & 병합 (0) | 2024.09.06 |
[Spring] 스프링 트랜잭션 전파 Propagation (0) | 2024.09.05 |
[Spring] 스프링 트랜잭션 (0) | 2024.09.04 |