on
[JPA] JPA란? - 패러다임의 불일치
[JPA] JPA란? - 패러다임의 불일치
자바 ORM표준을 읽고 정리한 글입니다.
자세한 내용은 자바 ORM표준 JPA를 읽어주세요
JPA
JPA는 자바 진영의 ORM기술 표준이다.
JPA또한 내부적으로 JDBC API를 사용하며, 애플리케이션과 JDBC사이에서 동작한다.
JPA를 사용함으로써, 아래에서 설명할 패러다임의 불일치 문제를 거의 대부분 해결할수있으며, 생산성 또한 향상시킬수있다.
SQL - 관계지향 패러다임과 객체지향 패러다임의 불일치로 발생하는 문제점
1. 객체 그래프탐색에서의 불편함
SQL은 처음 작성한 SQL문에 따라서, 탐색범위가 결정된다.
하지만, 객체는 한 객체를 한번 참조함으로써, 그 객체가 참조하는 다른 객체를 전부 참조할수있다.
외래키만 저장한 가상의 테이블 A, B, C, D, E, F 가 있고, 각각 외래키를 통해 다음과 같이 연결되어있다.
A - B - C - D - E - F
이를 객체로 표현하면 다음과 같을것이다.
class A{ B b; } class B{ A a; C c; } class C{ B b; D d; } class D{ C c; E e; } class E{ D d; F f; } class F{ E e; }
이때, 우리는 객체지향 패러다임을 생각하며, A만 탐색하는 SQL을 작성하였고, A,B,C,D,E,F클래스가 전부 매핑될것을 기대했다. 하지만 결과는 그렇지 않다.
객체 그래프 탐색을 했을때, 기댓값은 아래와 같을것이다.
A.b -> B
B.c -> C
C.d -> E
.
.
.
우리는 첫 SQL에서 A만 탐색했기때문에, A를 제외한 참조에 대해서는 null값을 리턴받게된다.
참조하는 객체가 적을경우, join문을 적절히 사용하여 이 문제를 해결할수있겠지만, 참조 객체가 조금이라도 많아지만, join쿼리를 일일이 작성하기는 불가능에 가깝다.
2. 연관관계 매핑
TABLE A
NAME (FK) ID (PK) Devxb 1 dlwnsdud 2
TABLE B
NAME(FK) ID(PK) FAMILY Devxb 1 A Devxb 2 B Devxb 3 C Devxb 4 D Devxb 5 E Devxb 6 F
테이블 A와 테이블 B는 하나의 Name(외래키)값을 이용하여 서로를 참조한다.
위 테이블을 자바 코드로 변경해보자.
class A{ String NAME; Long ID; } class B{ String NAME; Long ID; String FAMILY; }
NAME값을 통해 A가 B를 참조하는 위 코드는 객체지향과는 거리가 멀어보인다.
위 코드를 객체지향 코드로 변경하기 위해선 프로그래머가 중간에 적절한 변환을 해줘야한다.
3. 비교
데이터베이스는 ID값을 통해 각 ROW를 구분하지만, 객체는 동일성(주소 값)비교, 동등성(객체 필드값) 비교를 통해 서로를 비교한다.
이 차이때문에, DB상에서는 같은 값이더라도, 객체는 다른값으로 인식할 수 있다. 다음 예시를 보자.
- FAMILY테이블에서 row값을 가져와 Family객체에 매핑하는 코드다
public boolean test(){ Family f1 = FAMILY.getFamily(0); Family f2 = FAMILY.getFamily(0); return f1 == f2; }
(true를 반환할것이라 생각하고 코드를 작성했지만, false를 반환할것이다.)
JPA는 이러한 문제점을 해결하기위해, SQL을 직접작성해주고, 패러다임 불일치 문제들도 해결해줌으로써 프로그래머가 객체지향적으로 코드를 설계할수있게끔 해준다.
from http://dlwnsdud205.tistory.com/266 by ccl(A) rewrite - 2021-09-25 16:01:15