CS log

2. JPA 본문

1. JPA

- Java Persistence API

- 자바 진영의 ORM 기술 표준

 

2. ORM

- Object-relational mapping(객체 관계 매핑)

- 객체는 객체대로 설계, 관계형 데이터베이스는 관계형 데이터베이스대로 설계

- ORM 프레임워크가 중간에서 매핑

- 대중적인 언어에는 대부분 ORM 기술이 존재

 

3. JPA는 애플리케이션과 JDBC 사이에서 동작

 

원래는 JDBC API를 개발자가 다 써야했는데 그것을 JPA가 대신 해준다.

 

1) JPA 동작 - 저장

엔티티 던져주면 jpa가 알아서 생성해서 db에 저장까지!

* 일반적으로 데이터베이스와의 상호작용 중 데이터를 영구적으로 저장(persist)하는 과정을 의미한다. 이는 데이터를 데이터베이스에 삽입하거나 업데이트하는 작업을 포함한다

2) JPA 동작 - 조회

id 만 던져주면 jpa 안에서 많은 문제점을 해결해서 entity object를 만들어서 반환해줌

 

4. jpa 소개

ejb & entity 빈 -> 하이버네이트(오픈 소스) -> jpa(자바 표준)

jpa는 표준 명세 (인터페이스의 모음)

* 하이버네이트란? 하이버네이트(Hibernate)는 자바 환경에서 객체 관계 매핑(ORM: Object-Relational Mapping)을 지원하는 프레임워크. 하이버네이트를 사용하면 자바 객체를 관계형 데이터베이스의 테이블에 자동으로 매핑할 수 있어, 데이터베이스와의 상호작용을 보다 쉽게 처리할 수 있다. 이를 통해 데이터베이스의 데이터와 자바 객체 간의 불일치를 해결하고, 데이터베이스 조작 코드를 간소화할 수 있다.

 

5. 생산성 - jpa & CRUD

저장 :  jpa.persist(member)

조회 : Member member = jpa.find(memberId)

수정 : member.setName("변경할 이름")

삭제 : jpa.remove(member)

 

6. 유지보수 :

기존에는 필드 변경 시 모든 sql 수정해야했는데, 

jpa는 필드만 추가하면 됨. sql은 jpa가 처리

 

7. jpa와 패러다임의 불일치 해결

1) jpa와 상속 

 

2) jpa와 연관관계, 3)객체 그래프 탐색

*객체 그래프(Object Graph)는 객체 지향 프로그래밍에서 객체들 간의 관계를 나타내는 구조. 이는 프로그램 내에서 객체들이 서로 어떻게 연결되어 있고, 어떤 관계를 맺고 있는지를 시각적으로 표현한 것. 객체 그래프는 객체와 객체 간의 참조(레퍼런스)를 통해 구성.

 

4) jpa와 비교하기

class MemberService {
	public void process() {
	Member member = memberDAO.find(memberId);
	member.getTeam(); // 지연로딩이라는 기술로 자유로운 객체 그래프 탐색
	member.getOrder().getDelivery();
	}
}
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; // 같다!

// 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장

*트랜잭션(Transaction)은 데이터베이스 시스템에서 하나의 논리적 작업 단위를 의미. 트랜잭션은 데이터베이스 상태를 변경시키는 일련의 연산들을 하나의 작업 단위로 묶어 관리하며, 데이터베이스의 일관성과 무결성을 보장하기 위해 사용

 

8. jpa의 성능 최적화 기능

1) 1차 캐시와 동일성(identity) 보장

String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL, jpa가 들고 있음
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true

2) 트랜잭션을 지원하는 쓰기 지연

transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 버퍼에 모아서 보낸다. 효율적
transaction.commit(); // [트랜잭션] 커밋

3) 지연 로딩(lazy loading)

멤버랑 팀이 항상 같이 조회됨 - 그럼 조인시키는게 좋음

어쩌다가 팀이랑 같이 쓰면 - 멤버만 조회하는 게 나음