저번 강의에서 왜 JPA를 공부해야 하는지 배웠다. 이번 강의에서는 JPA가 무엇인지 배웠다.
JPA란?
Java Persistence API로 자바 진영의 ORM 기술 표준이다.
- ORM이란?
Object-relational mapping(객체 관계 매핑)이라는 뜻으로
객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다는 뜻이다.
ORM프레임워크가 중간에서 매핑을 해준다. 대중적인 언어에는 대부분 ORM 기술이 존재한다.
JPA 동작
- 저장
위 그림은 강의 시간에 배운 JPA를 사용하여 저장할 때 JPA가 처리하는 과정을 보여준다. JPA가 SQL로 구현해야 할 부분을 모두 처리해주는 것을 알 수 있다.
- 조회
위 그림은 조회를 하는 부분인데 저번 시간에 배운 SQL구문을 사용하지 않고 find라는 명령어로 모든 것을 처리해 준다.
JPA를 왜 사용해야 하는가?
저번 시간에 SQL을 사용할 시 생기는 문제점을 대부분 처리해 준다.
SQL 중심적인 개발에서 객체 중심으로 개발 가능해진다.
- 생산성
코드 짜는 게 훨씬 간편해진다.
저장 : jpa.persist(member), 조회 : Member member = jpa.find(memberId), 수정 : member.setName("변경할 이름"), 삭제 : jpa.remove(member)
- 유지보수
기존에는 필드를 변경할 시 모든 SQL을 수정해야 한다. 예를 들어 객체에 전화번호를 추가할 시에 Insert, select, update 등등 모든 부분에 tel을 추가해 줘야 한다. 하지만 JPA는 JPA가 처리해 준다.
- JPA와 패러다임의 불일치를 모두 해결해 준다.
1. JPA와 상속저번 강의 시간에 ITEM이라는 테이블이 슈퍼 테이블이고 그 아래 ALBUM이라는 테이블이 있을 경우 ALBUM테이블에 주키와 외래키로 ITEM테이블의 주키를 추가해줘야 한다고 했다. 이럴 경우 조회나 입력 같은 경우 매우 불편해진다고 배웠다. 하지만 JPA는 jpa.persist(album); 을 할 경우 inset into Item, insert into album 등을 모두 처리해 준다. 조회일 경우도 연관해서 계속 SQL구문에 from 부분에 추가해야 조회를 할 수 있어지만 JPA는 JPA가 모두 처리해준다.
2. JPA와 연관관계, 객체 그래프 탐색
//연관관계 저장
member.setTeam(team);
jpa.persist(member);
//객체 그래프 탐색
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
원래는 null값이 나올 수 도 있고 find가 모든 table을 join 할 수 도 있는 어려움이 생길 수 있지만 JPA가 모든 것을 처리해 자유로운 객체 그래프 탐색이 가능해진다. 즉, 엔티티를 신뢰할 수 있다.
3.JPA와 비교하기
자바에서 get으로 값을 가져오면 엔티티가 달라져 == 구문 할 경우 false를 리턴한다. 하지만 JPA는 ==구문을 할 경우 jpa.find를 하면 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
- JPA의 성능 최적화 기능
1. 1차 캐시와 동일성 보장
같은 트랜잭션 안에서는 같은 엔티티를 반환한다. 약간의 조회 성능을 향상한다.
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
위에 코드일 경우 제일 m1을 찾을 때는 SQL을 실행하지만 m2 일 때는 캐시에 저장된 데이터를 반환해준다. 결국 m1 == m2할 경우 true가 반환된다.
2. 트랜잭션을 지원하는 쓰기 지연
- INSERT
트랜잭션을 커밋할 때까지 INSERT SQL을 모음 그 후 JDBC BATCH SQL 기능을 사용해서 한 번에 SQL을 전송한다.
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋
- UPDATE
UPDATE, DELETE 인한 로우락 신간 최소화, 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋
3. 지연 로딩과 즉시 로딩
지연 로딩 : 객체가 실제 사용될 때 로딩
즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();
아래와 같은 코드르 실행한다고 할 때, 지연 로딩으로 설정한 경우 member를 조회하고 team을 조회할 때 까지 team을 select하는 구문은 사용하지 않고 기다린다. 하지만 team과 member를 계속 같이 조회해야 한다면 즉시 로딩으로 둘을 계속 같이 조회 할 수가 있다.
강의 출처 : https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'BackEnd > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
JPA 엔티티 매핑(필드와 컬럼 매핑, 기본 키 매핑) (1) | 2022.12.22 |
---|---|
JPA 엔티티 매핑(객체와 테이블 매핑) (0) | 2022.12.22 |
JPA 영속성 관리 - 내부 동작 방식 (0) | 2022.12.22 |
JPA 시작 (1) | 2022.12.22 |
JPA 소개(자바 ORM 표준 JPA 프로그래밍 - 기본편) (0) | 2022.12.20 |