[자바 ORM 표준 JPA 프로그래밍] 1.2 패러다임의 불일치
개발서적/자바 ORM 표준 JPA

[자바 ORM 표준 JPA 프로그래밍] 1.2 패러다임의 불일치

Reference. 자바 ORM 표준 JPA 프로그래밍

책 목차 및 이전 글

더보기

들어가기 전 JPA 특징, Q&A

1. JPA 소개

    1.1 SQL을 직접 다룰 때 발생하는 문제점

    1.2 1.2 패러다임의 불일치

  • 애플리케이션이 발전하면 내부 복잡도가 상승
    → 복잡도가 증가하면 유지보수하기가 어려움
  • 비즈니스 요구사항을 정의한 도메인 모델도 객체로 모델링하면 객체지향 장점을 활용 가능
    → 부모 객체를 상소받거나, 다른 객체를 참조하고 있다면 저장하기 쉽지 않음
    → 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는 패러다임의 불일치 문제를 해결해주고 정교한 객체 모델링을 도와줌