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을 직접작성해주고, 패러다임 불일치 문제들도 해결해줌으로써 프로그래머가 객체지향적으로 코드를 설계할수있게끔 해준다.
'JPA' 카테고리의 다른 글
[JPA] 고급 매핑 - 상속 관계, 복합키와 식별 관계 (0) | 2021.10.17 |
---|---|
[JPA] 연관관계 매핑 (0) | 2021.10.14 |
[JPA] 필드와 컬럼 매핑 (0) | 2021.10.12 |
[JPA] JPA 영속성 컨텍스트 (0) | 2021.10.11 |
[JPA] JPA 성능최적화 - N+1문제 (0) | 2021.10.04 |