해당 글은 김영한 님의 자바 ORM 표준 JPA 프로그래밍을 참고하여 작성한 글입니다.
✅ JPA란?
- JPA(Java Persistence API)는 Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스의 모음이다.
- ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑하는 역할을 수행하는 것을 가리킨다.
- 인터페이스이기 때문에 Hibernate, OpenJPA 등의 구현체가 필요하다.
✅ JPA를 사용해야 하는 이유
- SQL에 의존적인 개발 ➡️ 객체 중심적인 개발
- JPA가 등장하기 전에는 객체를 관계형 데이터베이스에 관리하기 위해 반복적인 SQL을 작성해야 했다.
- 객체가 수정된다면 그에 맞게 SQL도 수정해야 했다.
- 생산성 향상
- CRUD 작업이 간결화된다.
- Create(저장): em.persist(member);
- Read(조회): Member member = em.find(Member.class, memberId);
- Update(수정): member.setName("변경할 이름");
- Delete(삭제): em.remove(member);
- CRUD 작업이 간결화된다.
- 패러다임의 불일치 해결
- 객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르기 때문에 둘의 기능과 표현 방법도 다르다. 따라서 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다. 이러한 문제를 JPA를 통해 해결할 수 있다.
- 상속: 객체는 상속이라는 기능이 있지만 테이블은 없다.
- 연관관계: 객체는 참조를 사용해서 연관된 객체를 조회하지만, 테이블은 외래 키를 가지고 연관된 테이블을 조회한다.
- 객체 그래프 탐색과 엔티티 신뢰 문제: 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 하는데, DB와의 연관관계 차이 때문에 신뢰 문제가 발생한다.
(연관관계에 있는 모든 객체들을 미리 로딩할 수 없기 때문에, SQL을 날린 시점에서 객체의 연관관계 유무에 대한 판단이 어려워 Entity를 신뢰할 수 없다. 즉, 계층형 아키텍처를 설계하더라도 진정한 의미의 계층 분리가 어렵다.) - 객체 비교: 데이터베이스는 기본 키의 값으로 각 row를 구분하지만, 반면에 객체는 동일성(identity) 비교와 동등성(equality) 비교라는 두 가지 방법이 있다.
- 동일성 비교는 == 비교이다. 객체 인스턴스의 주소 값을 비교한다.
- 동등성 비교는 eqauls() 메서드를 사용해서 객체 내부의 값을 비교한다.
- 객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르기 때문에 둘의 기능과 표현 방법도 다르다. 따라서 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다. 이러한 문제를 JPA를 통해 해결할 수 있다.
- 성능
- 1차 캐시와 동일성 보장: 같은 트랜잭션 안에서는 캐싱을 통해 같은 Entity를 반환한다.
- 트랜잭션을 지원하는 쓰기 지연: 트랜잭션을 Commit 할 때까지 SQL을 모으다가 Commit 하는 순간에 DB에 SQL을 보낸다.
- 즉시 로딩과 지연 로딩: 즉시 로딩은 JOIN으로 연관된 객체까지 미리 조회하고, 지연 로딩은 객체가 실제로 사용될 때 로딩된다.
- 데이터 접근 추상화와 벤더 독립성
- JPA는 Interface들의 집합으로 특정 DB에 종속적이지 않다. 각각의 DB가 제공하는 SQL 문법과 함수는 다르기 때문에 사용하는 DB에 맞춰 JPA에 DB Dialect(방언)을 설정해야 한다.
📍 참고
'Programming > JPA' 카테고리의 다른 글
[JPA] 데이터베이스 스키마 자동 생성 (0) | 2024.07.25 |
---|---|
[JPA] 필드와 컬럼 매핑 - 엔티티(Entity) 매핑 (3) (0) | 2024.07.25 |
[JPA] 기본 키 매핑 - 엔티티(Entity) 매핑 (2) (0) | 2024.07.25 |
[JPA] 객체와 테이블 매핑 - 엔티티(Entity) 매핑 (1) (0) | 2024.07.25 |
[JPA] 영속성 컨텍스트(Persistence Context) (0) | 2024.07.25 |