-
01-2. JPA 소개JPA 2020. 12. 29. 23:15
1. 지연 로딩
Member와 Order가 서로 연관 되어있다고 했을 때
Member member = jpa.find(Member.class, memberId); //처음 조회 시점에서 SELECT MEMBER SQL 수행 Order order = member.getOrder(); order.getOrderDate(); //Order를 사용하는 시점에서 SELECT ORDER SQL 수행
위의 코드는 지연 로딩을 사용하는 코드이다.
여기서 마지막 줄의 order.getOrderDate() 같이 실제 Order 객체를 사용하는 시점에 JPA는 데이터베이스에 ORDER 테이블을 조회한다.
Member를 사용할 때마다 Order를 함께 사용하면, 이렇게 한 테이블씩 조회하는 것보다는 Member를 조회하는 시점에
SQL 조인을 사용해서 Member와 Order를 함께 조회하는 것이 효과적이다.
JPA는 연관된 객체를 즉시 함께 조회할지 아니면 실제 사용되는 시점에 지연해서 조회한지 간단한 설정으로 정의할 수 있다.
2. 비교
데이터베이스는 기본 키의 값으로 각 로우row를 구분한다.
반면에 객체는 동일성 비교(==)와 동등성 비교(equals)라는 두 가지 비교 방법이 있다.
따라서 테이블의 로우를 구분하는 방법과 객체를 구분하는 방법에는 차이가 있다.
String memberId = 100; Member member1 = memberDAO.getMember(memberId); Member member2 = memberDAO.getMember(memberId); member1 == member2; //다르다
위 코드를 보면 기본 키 값이 같은 회원 객체를 두 번 조회했다. 그런데 둘을 동일성(==) 비교하면 false가 반환된다.
왜냐면 member1과 member2는 같은 데이터베이스 로우에서 조회했지만, 객체 측면에서 볼 때 둘은 다른 인스턴스기 때문이다.
따라서 데이터베이스의 같은 로우를 조회했지만 객체의 동일성 비교에는 실패한다.
JPA와 비교
JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다. 그러므로 다음 코드에서 member1과 member2는 동일성 비교에 성공한다.
String memberId = 100; Member member1 = jap.find(memberId); Member member2 = jap.find(memberId); member1 == member2; //같다.
객체 비교하기는 분산 환경이나 트랜잭션이 다른 상황까지 고려하면 더 복잡해 진다.
3. 정리
객체 모델과 관계형 데이터 베이스 모델은 지향하는 패러다임이 서로 더르다.
문제는 이 패러다임의 차이를 극복하려고 개발자가 너무 많은 시간과 코드를 소비한다는 점이다.
더 어려운 문제는 객체지향 어플리케이션답게 정교한 객체 모델링을 할수록 패러다임의 불일치 문제가 더 커진다는 점이다.
그리고 이 틈을 메우기 위해 개발자가 소모해야 하는 비용도 점점 더 많아진다.
JPA를 이러한 패러다임의 불일치 문제를 해결해주고 정교한 객체 모델링을 유지하게 도와준다.
'JPA' 카테고리의 다른 글
02. JPA 시작 (0) 2021.01.17 01-3. JPA란 무엇인가? (0) 2021.01.14 01-1. JPA 소개 (0) 2020.12.01 Pageable 사용하기 (0) 2020.02.08 JPA란 무엇인가? (0) 2019.12.22