-
[JPA] JPA 소개강의노트/JPA - 기본편 2021. 3. 31. 10:25
SQL 중심적인 개발의 문제점
지금 시대는 객체를 관계형 DB에 관리
객체를 관계형 데이터베이스에 저장
객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까? JPA의 탄생 배경
SQL 중심적인 개발의 문제점
- 무한 반복, 지루한 코드 (CRUD)
- SQL 의존적인 개발을 피하기 어렵다
- 패러다임의 불일치
- 객체 vs 관계형 데이터베이스
객체와 관계형 데이터베이스의 차이
- 상속
- 연관관계
- 참조 vs FK를 이용한 조인
- 객체는 한 방향으로 관계를 맺음 vs 테이블은 양방향으로 관계를 맺음
- 데이터 타입
- 데이터 식별 방법
객체 그래프 탐색
- 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다.
- '.'을 찍어서 연관된 객체를 탐색하는 것을 객체 그래프 탐색이라 한다.
- 객체 그래프 탐색은 처음 실행하는 SQL에 따라 탐색 범위 결정
객체 vs 관계형 데이터베이스 패러다임 불일치
- 엔티티 신뢰 문제
- 모든 객체를 미리 로딩할 수는 없다.
- 상황에 따라 동일한 회원 조회 메서드를 여러벌 생성해야한다.
- 계층형 아키텍처에서 진정한 의미의 계층 분할이 어렵다.
- 비교하기
JPA 소개
JPA란?
- Java Persistence API
- JPA는 인터페이스의 모음
- 자바 진영의 ORM 기술 표준
- 애플리케이션과 JDBC 사이에서 동작
ORM (Object-relational mapping)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
JPA를 왜 사용해야 하는가?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 기존 : 필드 변경시 모든 SQL 수정
- JPA : 필드만 추가하면 됨, SQL은 JPA가 처리
- 패러다임의 불일치 해결
- JPA와 상속 : Table 슈퍼타입 서브타입 관계로 생성 후 패러다임이 안맞는 부분을 JPA가 해결
- JPA와 연관관계, 객체 그래프 탐색
- 신뢰할 수 있는 엔티티, 계층 : 지연 로딩
- JPA와 비교하기 : 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장
- 성능 최적화 기능
- 1차 캐시와 동일성(identity) 보장
- 트랜잭션을 지원하는 쓰기 지연 - INSERT (버퍼링)
- JPA 옵션을 통해서 지정 가능
- 지연 로딩과 즉시 로딩
- 지연 로딩 : 객체가 실제 사용될 때 로딩
- 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
- 데이터 접근 추상화와 벤더 독립성
- 표준
용어 설명
객체 지향 프로그래밍
추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공
처음 실행하는 SQL에 따라 탐색 범위 결정
SELECT M.*, T.* FROM MEMBER M JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID member.getTeam(); // OK member.getOrder(); // null
엔티티 신뢰 문제
class MemberService { ... public void process() { Member member = memberDAO.find(memberId); member.getTeam(); // ??? member.getOrder().getDelivery(); // ??? } }
비교하기
// DAO를 통한 조회 String memberId = "100"; Member member1 = memberDAO.getMember(memberId); Member member2 = memberDAO.getMember(memberId); member1 == member2; // 다르다. // 자바 컬렉션에서 조회 String memberId = "100"; Member member1 = list.get(memberId); Member member2 = list.get(memberId); member1 == member2; // 같다.
JPA 동작
JPA와 연관관계, 객체 그래프 탐색
// 연관관계 저장 member.setTeam(team); jpa.persist(member); // 객체 그래프 탐색 Member member = jpa.find(Member.class, memberId); Team team = member.getTeam();
지연 로딩과 즉시 로딩
// 지연 로딩 Member member = memberDAO.find(memberId); // SELECT * FROM MEMBER Team team = member.getTeam(); String teamName = team.getName(); // SELECT * FROM TEAM // 실제 해당 객체의 값을 조회 시 쿼리가 나간다. // 즉시 로딩 Member member = memberDAO.find(memberId); // SELECT M.*, T.* FROM MEMBER M JOIN TEAM T.. Team team = member.getTeam(); String teamName = team.getName();
참고 자료
'강의노트 > JPA - 기본편' 카테고리의 다른 글
[JPA] 플러시 (flush) (0) 2021.05.27