관계형 데이터베이스와 객체와의 패러다임의 불일치 문제를 개발자가 중간에서 해결하기에는 너무 많은 시간과 코드를 소비함
상속
객체는 상속이라는 개념이 있지만 테이블은 상속이라는 개념이 없음
Item 클래스를 상속받는 Album 클래스와 Movie 클래스를 저장하기 위해서
Item / Album / Movie 객체의 데이터를 따로 분리해서 각가의 테이블 넣어야 함
연관관계
객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회
반면에 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 활용해서 테이블을 조회
JPA는 위와 같은 패러다임 불일치 문제를 모두 해결해 줌
그리고 더 나아가 어떻게 하면 JPA를 JPA답게 사용할까 고민하고 공부하는 그 자체가 객체지향 프로그래밍에 도움이 됨 (@MappedSuperClass, @Inheritance, @Embedable, @Embeded, 연관관계 설정-참조)
Mybatis는 ORM이 아님 물론 쿼리와 로직을 분리해낼 수 있는 템플릿 역할(SQL Mapper)을 수행하지만 도메인 객체의 설계가 바뀔 때마다 복잡한 설정의 변경 과정이 수반됨
결국 쿼리를 미리 짜놓고 객체를 설계하는 프로그램 전체적인 개발 과정이 쿼리에 강하게 종속되는 문제를 절대 해결할 수 없음
JPA는 그런 부담감에서 개발자를 해방시켜주기 때문에 테이블을 미리 만들어 놓고 프로그래밍을 하는 쿼리 지향형 프로그래밍을 해야하는 상황을 막아줌
방언을 통해서 데이터 접근 추상화와 벤더의 독립성 → 쿼리를 수정하지 않아도 됨 (구현체만 갈아낌)