JPA 소개
JPA소개
지금은 객체를 관계형 DB에 저장해야 한다.
데이터베이스는 SQL만 알아들을 수 있기 때문에 SQL중심적인 개발만 한다는 것이 문제가 된다.
- 무한 반복, 지루한 코드
테이블을 만들고 객체를 만들고 sql문장을 작성한다.
나중에 수정요청이 오면 하나하나 쿼리를 수정해야한다.
그러다 보면 중간중간 놓쳐서 오류가 발생할 수 있음.
- 패러다임의 불일치
객체 vs 관계형 디비
객체: 캡슐화
관계형: 자료를 정교화해서 보관하는게 목표
객체를 관계형 DB에 넣어려고 하니까 여러가지 문제가 생긴다.
그러려면 객체를 sql로 변환해서 저장해야한다.
sql로 변환은 누가해? 개발자가 함!
객체와 관계형 디비의 차이
- 상속 (객체는 상속관계가 있지만 관계형 디비는 없다)
- 연관관계 (객체는 참조를 가지고 한다, 디비는 pk와 fk로 join을 해서 필요한 데이터를 찾는다)테이블은 양 방향으로 왔다갔다 할 수 있다.
- 객체는 한 방향으로 밖에 왔다갔다 할 수 없는데
ORM?
- Object- relational mapping(객체 관계 매핑)
- 객체는 객체대로 관계형디비는 환계형 디비대로 설계후 orm 프레임워크가 중간에서 매핑을 해준다.
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설개
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
JPA는 애플리케이션과 JDBC 사이에서 동작한다.

JPA 동작 - 저장

-> dao에서 객체를 저장하고 싶으면 jpa에게 멤버 객체를 넘긴다.
jpa가 멤버 객체를 분석한다
jpa가 적절한 sql문을 생성하고 api를 사용해서 디비에 보내고 결과를 받는다.
JPA 동작 - 조회

-> jpa는 db에 pk값만 넘긴다.
jpa가 멤버개체를 보고 적절한 select 쿼리를 만들어내고 api를 사용해서 db에 결과를 보내고 받는다.
받는 결과를 객체에 모두 맵핑해준다.
이 모든걸 jpa가 해결해준다.
★ JPA가 패러다임의 불일치를 해결해준다.
> JPA는 표준 명세
- JPA는 인터페이스의 모음이다.
> JPA를 왜 사용해야 하는가?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성 - JPA와 CRUD
- 저장 : jpa.persist(member)
- 조회 : Member member = jpa.find(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : jpa.remove(member)
- 유지보수
- 기존: 필드 변경시 모든 SQL을 수정해야한다.
- JPA : 필드만 추가하면 된다. SQL은 JPA가 처리한다.
- 패러다임 불일치 해결
- JPA와 상속예를 들어 album객체를 *****저장 ***** 하고 싶을 때 jpa가 sql문장을 두개로 나눠서
- 개발자가 할 일 : jpa.persist(album);
- 나머지는 JPA가 처리 : insert into team.. / insert into album ..
- item테이블과 album테이블에 모두 쿼리를 날린다.
- 
- JPA와 연관관계
- 연관관계 저장 member.setTeam(team) jpa.persist(member);
- JPA와 객체 그래프 탐색
- Member member = jpa.find(Member.class, memberId); Team team = member.getTeam();
- JPA와 비교하기
- JPA와 상속예를 들어 album객체를 *****저장 ***** 하고 싶을 때 jpa가 sql문장을 두개로 나눠서
- 성능
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환함 - 약간의 조회 성능 향상
- DB Isloation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장String memberId = "100";Member m1 = jpa.find(Member.class, memberId); //캐시'''
- SQL 한번만 실행
- println(m1 == m2) //true
- Member m1 = jpa.find(Member.class, memberId); //SQL
- '''
- 트랜잭션ㅇㄹ 지원하는 쓰기 지연 -Insert
- 트랜잭션을 커밋할 때까지 insert SQL을 모음
- JDBC BATCH SQL 기증을 사용해서 한번에 SQL전송
- 지연로딩과 즉시로딩
- 지연로딩: 객체가 실제로 사용될 때 로딩
- 즉시로딩: join sql로 한번에 연관된 객체까지 미리 조회
- 1차 캐시와 동일성 보장
- 데이터 접근 추상화