JPA 등장배경
JPA가 등장하게 된 배경이 무엇일까??
객체를 관계형 데이터베이스에 저장하기 위해서는 중간에서 변환해주는 작업이 필요해!!
WHY?
객체와 관계형 데이터베이스간에는 해소하지 못하는 차이점이 존재해!!
- 상속
- 연관관계
- 데이터 타입
- 데이터 식별방법
등이 존재해!!
상속
먼저 첫번째로 상속을 살펴보자.
상속의 경우 데이터베이스에서는 이를 슈퍼타입 서브타입 관계라는 유사한 개념이 있으나 동일 시 할 수 없다!
한번 생각을 해보자. A라는 객체와 이를 상속하는 B라는 객체가 있다. B라는 객체의 정보를 데이터베이스에 저장하기 위해서는 B객체에서 A객체의 부분을 떼어내어 이를 A를 담당하는 데이터베이스에 저장하고 B에서는 A부분을 제외한 데이터를 B를 담당하는 데이터베이스에 저장해야한다!! 완즈이 우엑이다….
이렇게 저장하는 관점에서만 생각해보아도 매우 별로인데 조회하는 부분에서도 당연히 어려움이 존재한다.
조인을 이용해서 A,B를 들고와야하는 등….
→ DB에 저장할 객체에는 일반적으로 상속관계를 사용하지 않는다
연관관계
다음으로 연관관계 부분을 살펴보자.
객체간의 관계에서는 참조를 통해 그 관계를 정의한다!! 이때 단방향, 양방향 두가지가 존재할 수 있지.
그러나 테이블간의 관계는 조인을 이용하여 만들어지는데 굳이 정의를 내려보자면 무조건 양방향 관계라는거야.
그리고 객체의 경우 참조변수를 통해 참조를 할 때 체이닝을 통해 참조하고 있는 객체들을 쭉쭉 접근할 수 있어!
s.getA().getB().get(C) 이런식으로 말야!!
그러나 테이블에서는 그러한 부분이 가능하지 않아!! only 조인해서 들고온 정보들만 볼 수 이쒀
데이터타입
다음으로 데이터타입!!
보통 데이터베이스에 접근하는 경우 이를 담당하는 함수들을 정의 해 놓겠지. 하지만 협업의 과정에서 다른 사람이 작성해놓은 sql문을 통해 어떤 정보들이 정확히 반환되어지는지, 혹은 실수 없이 잘 작성하였는지 등 신뢰성 문제가 발생할 수 있어.
뿐만아니라 위에서 얘기했듯이 참조관계에 있는 객체들에 있어, 어떠한 참조변수에 해당하는 데이터는 조인으로 가져왔지만 또 어떤 참조변수에 해당하는 데이터는 가져오지 않았다면 이러한 상황혹에서 문제가 발생할 수 있어.
예를들어 Member 클래스에는 Team과 Order 객체를 참조할 수 있는 참조변수들이 정의되어있는데 쿼리 결과롤 Team에 해당하는 참조변수에만 데이터가 들어있을경우
member.getOrder()의 정상적인 동작을 기대하고 사용할 경우 null 친구를 만나게 된다… ㅠ_ㅠ
데이터 식별방법
마지막으로 데이터식별방법에도 차이가 있다!!
만약 자바 컬렉션을 통해 특정 객체를 조회했다고 생각해보자.
1 | A a1 = list.get(a_id); |
위처럼 컬렉션으로 들고온 객체에 대해서 비교연산자를 진행할 경우 같다는 결과를 반환하나 테이블에서 데이터를 가져오는 메소드의 결과를 통해 조회한 것에 대해서는 그렇지 않다는 차이점이 존재한다!!!
차이점이라고 설명은 하였으나 사실 편리함과 불편함의 차이라고 봐도 무방할 정도이다…
이러한 상황속에서 다음과 같은 생각이 스물스물 올라오게 된다… “객체답게 모델링 할수록 매핑 작업만 늘어나.. 제길슨…”, “왜이렇게 불편할까… 객체를 자바 컬렉션에 저장하듯이 db에 저장할 순 없나..?”
그래서 등장한 놈이 JPA야!! 😆😆😆😆
JPA는 그럼 무엇인가??
→ 바로~ 자바 진영의 ORM 기술 표준이야!!
그럼 또 한가지 의문이 들지. ORM이 무엇이죠…??
ORM은 Object-relational mapping(객체 관계 매핑)이라는 녀석인데
객체는 객체대로 설계하고 RDB는 RDB대로 설계해서 중간에서 저 친구가 매핑해주기에 개발자들이 고생하던 불편함을 없앨 수 있게 해주는 아주 좋은 친구야!! 그리고 JPA는 이러한 ORM기술 중 하나인 것이고!!
JPA는 어플리케이션과 JDBC사이에서 동작해! 즉 내부적으로 JDBC API를 통해 Database와 통신한다고 보면 돼!!
JPA가 관리하는 객체를 Entity라고 부르는데 만약 특정 Entity Object를 persist(저장)하려고 한다면 JPA는 Entity를 분석하고 이에 맞게 INSERT SQL을 생성해줘!! 그리고 JDBC API를 CALL하는거지!!
그럼 결과적으로 객체와 DB간 패러다임 불일치 문제를 해결해주는거지!!
이렇게 JPA를 사용함으로써 개발자는 생산성, 유지보수, 패러다임 불일치, 성능 등 많은 이점들을 얻을 수 있어!!! 완전 대박 멋진 기술이다 이말이야~~