본문 바로가기

JPA

[JPA] 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을 직접작성해주고, 패러다임 불일치 문제들도 해결해줌으로써 프로그래머가 객체지향적으로 코드를 설계할수있게끔 해준다.

 

'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