Spring/JPA
JPA - JPA(Java Persistence API)
jddng
2022. 3. 7. 11:54
728x90
반응형

JPA(Java Persistence API)
- 자바 진영의 ORM 기술 표준
- 애플리케이션과 JDBC 사이에서 동작한다.
ORM(Object-Relational Mapping
- 객체 관계 매핑
- 객체는 객체지향 관점으로 설계, RDB는 RDB관점으로 설계
- ORM 프레임워크가 중간에서 매핑
JPA 동작
저장
- 저장할 Entity 객체를 JPA에 전달
- JPA는 Entity를 분석하여 INSERT SQL 생성
- JDBC API을 사용하여 쿼리 전달

조회
- 조회할 테이블의 PK인 id를 JPA에 전달
- SELECT SQL 생성
- JDBC API 사용하여 해당 쿼리 전달
- 결과 값 Entity에 매핑하여 전달

JPA의 장점
생산성
- 저장 : jpa.persist(member)
- 조회 : jpa.find(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : jpa.remove(member)
- 위 메서드를 이용해 간단한 CRUD를 할 수 있다.
유지보수
- JPA를 이용하면 필드만 추가하면 된다. 즉, SQL은 신경 안 써도 된다.

패러다임 불일치 해결
- JPA와 상속 : 상속관계를 JPA가 처리해준다.


- JPA와 연관관계, 객체 그래프 탐색
- 연관관계 : member와 연관 관계있는 team
- 객체 그래프 탐색 : member를 통해 team에 접근, 즉 참조 가능

- 신뢰할 수 있는 엔티티, 계층
- 지연 로딩을 통해 자유롭게 객체 그래프 탐색이 가능
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //자유로운 객체 그래프 탐색
member.getOrder().getDelivery();
}
}
- 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
성능 최적화 기능
- 1차 캐시와 동일성(identity) 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모아서 한 번에 전송
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋
- 지연 로딩(Lazy Loading)
- 객체가 실제 사용될 때 로딩

728x90
반응형