- JPA의 내부 동작 방식
- 객체와 관계형 데이터베이스 테이블을 올바르게 매핑하는 방법
에 대해서 배우는 강의😃
두 번째 로드맵의 첫 번째 강의, 자바 ORM 표준 JPA 프로그래밍 - 기본편을 시작하였다.
1. 지루한 코드의 무한반복
자바 객체 ↔ SQL
과정의 반복→ 너무 비효율적이며, SQL에 의존적인 개발을 할 수 밖에 없다!
2. 패러다임의 불일치 - 객체 vs 관계형 데이터베이스
→ 패러다임이 다른 두 가지를 억지로 매핑하기 때문에 여러 가지 문제가 생긴다.
member.getTeam()
JOIN ON M.TEAM_ID = T.TEAM_ID
💡 JPA
- Java Persistence API
- 자바 진영의 ORM 기술 표준
Object-relational mapping (객체 관계 매핑)
JPA
는 애플리케이션과 JDBC
사이에서 동작한다.JPA
를 사용하면 JPA
내부에서 JDBC API
를 사용해서 SQL
을 호출해서 DB와 통신한다.JDBC API
를 사용하는 것은 ❌ 📌 JDBC API
자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 데이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준
→JDBC API
를 사용하면, 특정 데이터베이스의 정확한 사용법에 대해 몰라도 된다!
MemberDAO
에서 객체를 저장하기 위해서 Member
객체를 JPA
에 넘긴다.JPA
는 Member
객체를 분석 후 적절한 INSERT
query를 생성한다.JPA
가 내부적으로 JDBC API
를 사용하여 INSERT
query를 DB에 보낸다.→ 패러다임 불일치 해결!
JPA
에 조회 요청하면 JPA
가 내부적으로 JDBC API
를 사용해서 ResultSet
을 가져온다.JPA
가 ResultSet
을 객체에 매핑해준다.하이버네이트
, EclipseLink
, DataNucleus
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
이미 기본적인 CRUD 코드가 구현되어 있다!
jpa.persist(member)
Member member = jpa.find(memberId)
member.setName(“변경할 이름”)
jpa.remove(member)
개발자는 이런 코드들을 그냥 가져다가 쓰기만 하면 된다. 🤸🏻♀️
JPA와 상속
jpa.persist(album);
INSERT INTO ITEM ...
INSERT INTO ALBUM ...
JPA와 연관관계
member.setTeam(team);
jpa.persist(member);
JPA와 객체 그래프 탐색
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
JPA와 비교하기
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다!
1차 캐시와 동일성(
identity
) 보장
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); //SQL
Member member2 = jpa.find(Member.class, memberId); //캐시
println(member1 == member2); //true
=> SQL 1번만 실행된다.
트랜잭션을 지원하는 쓰기 지연(
transactional write-behind
)
INSERT SQL
을 모은 뒤,JDBC BATCH SQL
기능을 사용해서 한번에 SQL 전송한다.지연 로딩(
Lazy Loading
)
SELECT * FROM MEMBER
SELECT * FROM TEAM
JOIN SQL
로 한번에 연관된 객체까지 미리 조회SELECT M.*, T.*
FROM MEMBER
JOIN TEAM ...