Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
- 애플리케이션이 발전하면 내부 복잡도가 상승
→ 복잡도가 증가하면 유지보수하기가 어려움
- 비즈니스 요구사항을 정의한 도메인 모델도 객체로 모델링하면 객체지향 장점을 활용 가능
→ 부모 객체를 상소받거나, 다른 객체를 참조하고 있다면 저장하기 쉽지 않음
→ Ex)1. 회원 객체 저장이 필요
2. 회원 객체가 팀 객체를 참조
3. 회원 + 팀을 저장해야 함 (단순 회원 객체만 저장하면 팀 객체를 잃어버리는 문제 발생)
- 객체와 관계형 데이터베이스는 지향하는 목적이 다름, 둘의 기능과 표현 방법도 다름
→ 객체와 관계형 데이터베이스의 패러다임 불일치 문제
→ 개발자가 중간에서 해결이 필요, 많은 시간과 코드를 소비하게 됌
1.2.1 상속
- 객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이 없음
- 데이터베이스 모델링에는 슈퍼, 서브타입 관계를 사용하면 객체상속과 가장 유사하게 표현
- 아래와 같이 패러다임의 불일치를 해결하기 위해 소모하는 비용이다.
<JDBC API>
INSERT INTO ITEM ...
INSERT INTO ALBUM ...
INSERT INTO ITEM ...
INSERT INTO MOVIE ...
SELECT * FROM ITEM I
JOIN ALBUM A ON ...
SELECT * FROM ITEM I
JOIN MOVIE M ON ...
<자바 컬렉션을 사용했을 때 표현>
list.add(album);
list.add(movie);
Album album = list.get(album);
<JPA>
jpa.persist(album);
INSERT INTO ITEM ...
INSERT INTO ALBUM ...
String albumId = "id100";
Album album = jpa.find(Album.class, albumId);
SELECT I.*, A.*
FROM ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
1.2.2 연관관계
- 객체는 참조를 사용해 연관된 객체를 조회
- 테이블은 외래 키를 통해 조인을 사용해서 연관된 테이블을 조회
→ 객체와 관계형 데이터베이스 사이의 패러다임 불일치는 극복하기 어려운 문제
- 객체는 참조가 있는 방향으로만 조회, 테이블은 모두 가능
→ ex) member.getTeam()은 가능하지만, team.getMember()는 참조가 없어 불가능
→ ex) 테이블은 MEMBER JOIN TEAM 가능, TEAM JOIN MEMBER도 가능
- 객체는 참조를 통해서 관계를 맺어야한다. 외래 키 값을 보관하는 것이 아닌 객체의 참조를 보관
→ ex) Long teamId → Team team
→ 객체 모델은 외래 키가 필요 없고, 테이블은 참조가 필요 없고 외래 키만 있으면 된다.
1.2.3 객체 그래프 탐색
- SQL을 직접 다루면 실행 SQL에 따라 어디까지 탐색할지 정해진다.
→ ex) memberDAO.find(memberId); 가 Order, OrderItem, Item, 등이 모두 조회 가능한가?
→ SQL을 열어보지 않으면 확인이 어렵고 상황에 맞는 메소드를 여러벌 만들어서 사용한다.
memberDAO.getMember(); //Member만
memberDAO.getMemberWithTeam(); //Member와 Team
memberDAO.getMemberWithOrderWithDelivery(); //Member와 Order와 Delivery
- JPA를 사용하면 객체 그래프 탐색을 할 수 있다.
→ 객체를 사용하는 시점에 적절한 SELECT SQL을 실행가능 (지연 로딩)
- 한 테이블씩 조회하는 것보다 Member를 조회할 때, 조인해서 가져오는게 효과적
→ JPA는 연관 객체를 함께 조회(JOIN)할지, 사용되는 시점에 지연해서 조회할지 설정 가능
Member memer = jpa.find(Member.class, memberId); //SELECT MEMBER SQL 실행
Order order = member.getOrder();
order.getOrderDate(); //Order를 사용하는 시점에 SELECT ORDER SQL
1.2.4 비교
- 데이터베이스는 기본 키의 값으로 각 로우를 구분
- 객체는 동일성(identity) 비교와 동등성(enquality) 비교라는 두가지 비교 방법
→ 동일성 비교는 == 비교다. 인스턴스의 주소값을 비교
→ 동등성 비교 equlas() 메소드를 사용하여 내부값을 비교
<JPA를 사용하지 않는 경우>
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; //다르다.
Member member1 = list.get(0);
Member member2 = list.get(0);
member1 == member2 //같다.
<JPA를 사용하는 경우>
- JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2; //같다
1.2.5 정리
- 패러다임의 차이를 극복하기 위해 많은 시간과 코드를 소비
- JPA는 패러다임의 불일치 문제를 해결해주고 정교한 객체 모델링을 도와줌
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 3.1 엔티티 매니저 팩토리와 엔티티 매니저 (0) | 2021.07.28 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 2. JPA 시작 (0) | 2021.07.23 |
[자바 ORM 표준 JPA 프로그래밍] 1.3 JPA란 무엇인가? (0) | 2021.07.23 |
[자바 ORM 표준 JPA 프로그래밍] 1.1 SQL을 직접 다룰 때 발생하는 문제점 (0) | 2021.07.23 |
[자바 ORM 표준 JPA 프로그래밍] JPA 특징, Q&A (0) | 2021.07.23 |