ORM( Object Relational Mapping )이란
- 객체 관계 매핑
- 객체 ↔ RDB 간 패러다임의 불일치를 해결할 수 있다.
- 객체는 객체대로, RDB는 RDB대로 설계 한다.
- 그 과정을 프레임워크가 중간에서 매핑한다.
JPA는 자바 진영의 ORM 표준이다.
- 저장 프로세스
- Entity 객체 저장을 요청한다.
- JPA가 Entity 에 대해서 분석하고 INSERT SQL문까지 생성해준다.
- JDBC API를 사용해 INSERT 쿼리를 날려 DB에 저장
- 패러다임 불일치 해결
- 조회 프로세스
- id를 통해 Entity 객체를 찾아달라고 요청한다
- JPA가 SELECT SQL문을 생성해준다.
- JDBC API를 사용한다.
- ResultSet을 매핑해준다.
- Entity 객체를 반환한다.
- 패러다임 불일치 해결
JPA 자바 표준 탄생
- EJB(엔티티 빈 - 자바 표준) 의 불편함, 비효율성으로 인해
- Hibernate (오픈 소스) 가 생겨남
- 이후 Hibernate 를 기반으로 자바 표준 JPA 탄생
- JPA의 표준 명세를 구현한 구현체 종류
- Hibernate
- EclipseLink
- DataNucleus
JPA를 사용해야 하는 이유
생산성 - JPA와 CRUD
- Create → jpa.persist(member);
- Read → jpa,find(memberId);
- Update → member.setName(”새 이름”);
- Delete → jpa.remove(member);
트랜잭션 끝나고 나면 해당되는 쿼리가 DB로 전달된다.
유지보수
- 기존 방법 : 필드에 변경이 생기면 모든 SQL을 수정해 주어야 한다.
- JPA 방법 : 필드만 추가하면 SQL 수정은 JPA가 처리한다.
JPA와 패러다임의 불일치 해결
상속
- 추가를 하는 경우, 개발자가 할 일은 jpa.persist(album); 뿐이다.
- 번거로웠던 매핑 과정을 JPA가 다 처리해준다. (부모 테이블과 자식 테이블 각각에 INSERT를 해준다.)
- 조회를 하는 경우, Album album = jpa.find(Album.class, albumId);
- 나머지 JOIN 등의 매핑 과정은 JPA가 처리해준다
연관관계, 객체 그래프 탐색
- 기존 방법 : 외래키 값을 사용한다.
- JPA 방법 : 연관관계 설정에 참조를 사용할 수 있다.
신뢰할 수 있는 엔티티, 계층
- 자유로운 객체 그래프 탐색이 가능하다.
- 지연 로딩 방법을 사용해 가능하다.
비교하기
- 동일한 트랜잭션에서 조회한 Entity는 같음을 보장한다.
JPA의 성능 최적화 기능
- 1차 캐시와 동일성 보장같은 트랜잭션 안에서는 같은 엔티티를 반환한다. → 조회 성능이 향상된다.
- 처음 탐색에서는 SQL 쿼리가 실행되지만 두 번째는 같은 엔티티이므로 JPA 메모리 상에서 찾아와 반환한다. 즉, 검색은 두 번 했지만 SQL 구문은 1번만 실행된다.
- Long memberId = 100; Member member1 = jpa.find(Member.class, memberId); //SQL 실행 Member member2 = jpa.find(Member.class, memberId); // 캐시 메모리 활용 System.out.println( member1 == member2 ); //true
- 트랜잭션을 지원하는 쓰기 지연 (Transactional write-behind)
- 트랜잭션을 COMMIT 할 때까지 INSERT SQL을 계속 모은다.
- JDBC BATCH SQL 기능을 사용해서 한 번에 SQL을 전송한다.
transaction.begin(); //트랜잭션 시작 em.persist(memberA); em.persist(memberB); em.persist(memberC); //여기까지 DB에 SQL을 보내지 않는다. transaction.commit(); //COMMIT하는 순간 SQL을 보낸다.
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();
- 지연 로딩 (Lazy Loading)
- 지연 로딩 : 객체가 실제 사용될 때 로딩한다.
- 즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회한다.
- 지연 로딩
첫 번째 줄에서 SELECT * FROM MEMBER
세 번째 줄에서 SELECT * FROM TEAM - 즉시 로딩
첫 번째 줄에서 바로 SELECT M.*, T.* FROM MEMBER JOIN TEAM …
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'[Spring] > JPA 프로그래밍 - 기본편' 카테고리의 다른 글
영속성 컨텍스트 1 (0) | 2023.04.07 |
---|---|
Hello JPA - 애플리케이션 개발 (0) | 2023.03.28 |
Hello JPA - 프로젝트 생성 (0) | 2023.03.27 |
SQL 중심적인 개발의 문제점 (0) | 2023.03.27 |
강좌 소개 (0) | 2023.03.27 |