반응형
*본 글은 JPA 에 대해 공부(책, 강의) 하고 쓴 글입니다.
내용 요약
JPA 란, 객체와 관계형 데이터 베이스 간을 연결해주는 인터페이스로, 객체의 필드에 대해 관계형 데이터베이스에 저장, 삭제, 수정, 조회를 SQL 작성없이 용이하게 할 수 있도록 하는 JAVA API 이다. (Java Persistence API)
- JPA는 entityManager를 통해 객체를 관리한다.
- JPA는 JPQL 을 사용하여 객체를 기반으로한 쿼리를 작성할 수 있다.
- JPA 는 내부적으로 database 와 통신하기 위해 JDBC 를 사용한다.
JPA 를 사용함으로써 직접 SQL을 작성해 객체를 저장해야하는 시절의 어려움 (객체들마다 다르게 작성, 상속관계, 연관관계의 객체들은 별도의 맵핑, 객체간의 비교 불가)을 해결하고 코드의 퀄리티, 설계에 더욱 힘을 쓸 수 있게 되어 개발자들이 효율적으로 코드를 작성할 수 있도록 도울 수 있다.
이런 ORM 기술 외에도 SQL 만을 따로 맵핑해주는 SQL mapper 도 존재한다.
1. SQL 기반 개발의 문제점
- 데이터베이스 세계에서는 관계형 DB가 많이 사용되는 중
- 현재는 관계형 DB에 저장하고 관리하는 시대
- SQL기반 개발은 지루한 작업이었다. (객체를 SQL로, SQL을 객체로…)
- 모든 것이 SQL에 의존적임. (필드 하나만 바뀌어도 SQL 모두 변경)
- Album 을 저장하려면
- 객체 분해
- INSERT -> ITEM , ALBUM
- 조회하려면
- JOIN
- 객체 만들어서 다 집어넣음…
- 결국 DB에 저장하는 객체는 상속관계를 사용하지 않는다.
만약 객체를 자바 컬렉션에 저장, 조회한다면?
그냥 다형성으로 조회하면 됨.
객체와 데이터베이스의 다른 점?
- 객체는 참조를 사용 (member.getTeam())
- 테이블은 외래 키를 사용. (JOIN ON M.TEAM_ID = T.TEAM_ID)
객체는 관련된 다른 객체를 참조할 수 있어야 한다.
- 객체 그래프를 탐색할 수 있어야.
- 하지만 문제점
- 이런 코드의 결과를 장담할 수 없다는 게 문제.
객체 비교
새로운 인스턴스를 반환하기 떄문에 실제 인스턴스 두개는 다르다.
- 하지만 만약 컬렉션에서 조회한다면?
- 같겠지.
- 컬렉션에 저장하는 객체라면 비교든, 상속이든, 다른 내부 클래스 조회든 문제가 없을텐데, 데이터베이스에 저장하는 객체는 이런 저런 문제들이 많이 생기는 것을 확인했다.
객체 답게 모델링할 수록, 매핑 작업만 늘어나버리는 문제가 존재하는 것이다.
- 상속을 해도
- 연관관계를 설정해둔 다른 클래스를 조회하려고 해도
- 객체 그래프 탐색을 하려고 할 때
- 비교를 할 때
- 모두 별도의 작업이 필요…
결론 : 객체를 컬렉션에 저장하듯이 데이터베이스에 저장할 수는 없을까? 에 대한 고민을 하게되고, 그 결과로 JPA 가 등장하게 되었다.
2. JPA 란?
ORM
- Object-relational mapping (객체 관계 매핑)
- 객체는 객체대로 설계하고, 관계형데이터베이스는 그대로 설계하면
- ORM 프레임워크가 중간에서 매핑을 해준다.
- 패러다임의 불일치?
- JPA는 어떻게 등장했나
- EJB 라는 엔티티 빈 (자바 표준)이 사용하기가 너무 어려움.
- 이 문제를 해결하기 위한 오픈소스로 하이버네이트가 등장함.
- 이것을 인터페이스화 한 것이 JPA
- 오픈소스에서 등장한 인터페이스이기 때문에 명확할 뿐만 아니라 실용적이다.
- JPA는 표준 명세이다.
- JPA는 인터페이스의 모음
- JPA 2.1 표준 명세를 구현한 3가지 구현체
- 하이버네이트, EclipseLink, DataNucleus
- 버전
JPA를 사용해야하는 이유
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 상속, 연관관계, 객체 그래프 탐색, 비교하기
- 상속 : 부모타입에 대해서도 저장하는 쿼리를 따로 알아서 만들어줌.
- 연관관계 : 필드로 객체를 저장하고 조회 가능. (JOIN 및 최적화를 알아서 - 지연로딩)
- 객체 그래프 탐색 : -> 신뢰할 수 있는 객체!
- 비교하기 : 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
- 성능
- 성능 최적화 기능
- -> 중간자가 존재함으로써 캐싱과 버퍼링이 가능해짐.
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서 같은 엔티티를 반환 (이것도 성능 향상)
- DB Isolation level이 Read Commit 이어도 애플리케이션에서 Repeatable Read 를 보장한다.
- 트랜잭션을 지원 하는 쓰기 지연 - INSERT
- 트랜잭션을 커밋할 떄까지 INSERT SQL 을 모아두었다가 한번에 전송 (JDBC BATCH SQL 기능)
- UPDATE 에서도…
- 지연 로딩과 즉시 로딩
- 지연 로딩 : 객체가 실제 사용될 때 로딩, 즉시 로딩 : JOIN 으로 한번에 연관된 객체까지 미리 조회
- 1차 캐시와 동일성 보장
- 데이터 접근 추상화와 벤더 독립성
- 표준
생산성 - CRUD 하는 방법
- 필드가 이후에 추가될 시 JPA가 알아서 해결해준다.
JPA 는 객체와 RDB 를 이어주는 기술로써, 객체 지향 프로그래밍과 관계형 데이터베이스에 대한 이해를 바탕으로 제대로 이해할 수 있다.
반응형
'개발 > java' 카테고리의 다른 글
[Spring - JPA] 3. 영속성관리 (1) | 2024.02.18 |
---|---|
[Spring - JPA] 2. JPA 개요 (1) | 2024.02.18 |
[Spring - DB] 1. JDBC 이해 (2) | 2024.01.07 |
[Spring 기본] 6. 의존관계 자동 주입 (1) | 2024.01.06 |
[Spring 기본] 5. 컴포넌트 스캔 (0) | 2024.01.06 |