- 인프런 강의
- JPA의 내부 동작 방식
- 객체와 관계형 데이터베이스 테이블을 올바르게 매핑하는 방법
SQL 중심적 개발의 문제점
무한 반복, 지루한 코드
- 테이블이 생성될 때마다 CRUD SQL을 다 만들어줘야 합니다
- 자바 객체 ↔️ SQL 과정을 반복
➡️ 너무 비효율적이며, SQL에 의존적인 개발을 피하기 어렵다!
패러다임의 불일치 - 객체 vs 관계형 데이터베이스
- 객체지향 프로그래밍 : 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공합니다
관계형 데이터베이스 : 키와 값들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스입니다
객체를 영구 보관하기 위해 다양한 저장소가 있습니다
- 파일에 저장할 시 검색할 수가 없습니다
- 관계 DB에 저장해야 하는데, 양이 광범위하게 많습니다
객체와 관계형 데이터베이스의 차이
1. 상속
- 연관관계
-
객체는 참조를 사용: member,getTeam()
-
테이블은 외래 키를 사용: JOIN ON M.TEAM_ID = T.TEAM_ID
-
객체를 테이블에 맞추어 모델링 해야합니다
-
테이블에 맞춘 객체 저장, 객체 모델링 저장까지는 아무 문제가 없습니다
다만, 객체 모델링 조회할 때 상당히 복잡합니다
기존 객체 조회할 시
Member member = lists.get(memberId);
Team team = member.getTeam();
자바 컬렉션 사용
java list.add(member);
- 객체 모델링 조회를 자바 컬렉션에서 관리할 시 간단합니다
참고
- 데이터 타입, 데이터 식별 방법에서도 문제가 있습니다
그래서
- 객체지향 설계, 객체답계 모델링할수록 매핑 작업이 늘어나 더욱 힘들어집니다
- 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수는 없나요?
➡️ 해결책 : JPA(Java Persistence API)
JPA - Java Persistence API
자바 진영의 ORM 기술 표준
ORM
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
🐢 JPA는 애플리케이션과 JDBC 사이에서 동작
- 개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 사용해서 SQL을 호출해서 DB와 통신합니다
- 개발자가 직접 JDBC API를 사용하는 것은 아닙니다
JDBC API : 자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 테이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준 → JDBC API를 사용하면, 특정 데이터베이스의 정확한 사용법에 대해 몰라도 됩니다
JPA 동작 - 저장
- MemberDAO에서 객체를 저장하기 위해서 Member 객체를 JPA에 넘깁니다
- JPA는 Member 객체를 분석 후 적절한 INSERT query를 생성합니다
- JPA가 내부적으로 JDBC API를 사용하여 INSERT query를 DB에 보냅니다
JPA 동작 - 조회
- JPA에 조회 요청하면 JPA가 내부적으로 JDBC API를 사용해서 ResultSet을 가져옵니다
- JPA가 ResultSet을 객체에 매핑해줍니다
JPA는 표준 명세
- JPA는 인터페이스의 모음
- JPA 2.1 표준 명세를 구현한 3가지 구현체
- 하이버네이트, EclipseLink, DataNucleus
JPA를 왜 사용해야 하는가?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
생산성
JPA에서는 이미 CRUD 코드가 구현되어 있습니다
- 저장 : jpa.persist(member)
- 조회 : Member member = jpa.find(memberId)
- 수정 : member.setName(“변경할 이름”)
- 삭제 : jpa.remove(member)
유지보수
기존에는 필드 변경시 모든 SQL 수정 (수고로움)
JPA를 사용시 필드만 추가하면 됩니다. SQL은 JPA가 처리합니다
JPA와 패러다임의 불일치 해결
1. JPA와 상속
2. JPA와 연관관계
3. JPA와 객체 그래프 탐색
4. JPA와 비교하기
상속-저장
상속-조회
연관관계, 객체 그래프 탐색
신뢰할 수 있는 엔티티, 계층
JPA와 비교하기
JPA의 성능 최적화 기능
1. 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능
- 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
- 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
- JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
- 지연 로딩과 즉시 로딩
- 지연로딩: 객체가 실제 사용될때 로딩
- 즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
ORM
JPA 소개