JPA란 무엇인가?

JPA

Java Persistence Application Programming Interface의 약자로 java에서 객체를 DB에 저장하기 위한 프로그래밍 명세라고 이해하면 된다.

 

JPA는 Java 진영의 ORM 표준으로 인터페이스이기 때문에 실제 구현된 것이 아닌 어떻게 구현되어야 하는지가 명세되어있을 뿐이다.

따라서 실제 사용을 위해서는 JPA의 구현체를 사용해야하는데 보편적으로 가장 많이 쓰이는 구현체가 바로 Hibernate이다.

 

ORM

Object Relactional Mapping의 약자로 객체를 관계적으로 매핑하는 기술로 객체와 관계형 데이터베이스의 패러다임 불일치 문제를 해결하고 기존의 매퍼 방식(JDBC Template, MyBatis 등 직접 SQL을 작성하는 방식) 보다 더 객체지향적으로 데이터를 저장하는 방법이다.

 

 

객체와 RDB의 패러다임 불일치

패러다임이란 인식 체계나 개념의 집합체라는 뜻으로 객체와 RDB는 데이터를 인식하는 개념이 다르다는 뜻이다.

객체는 추상화, 캡슐화, 정보은닉, 상속, 다형성 등의 특징을 가지고있지만, RDB는 이러한 특징을 가지고 있지 않기 때문에 아래와 같은 불일치 문제가 발생한다.

  1. RDB에는 객체 세상의 상속 관계를 표현하기 위해 정해진 방법이 없다.
    1. 부모 테이블을 만들어 조인할 수도 있고, 모든 자식에 부모의 컬럼을 넣을 수도 있는 등 방법이 다양하다.
    2. JPA에서 다양한 방법들을 어노테이션으로 간단하게 설정할 수 있다.
  2. 객체는 참조를 통해 연관된 객체를 불러오는 반면, RDB는 외래 키를 통해 연관된 데이터를 가져올 수 있다.
    1. RDB는 하나의 외래 키를 통해 양쪽 테이블의 데이터를 모두 가져올 수 있는 반면, 객체는 참조를 가지고있는 쪽에서만 데이터를 가져올 수 있다.
    2. JPA에서 연관관계 매핑을 사용하면 객체를 이용해서 양쪽 모두에서 접근이 가능하다.
  3. 객체는 상황에 따라 유연하게 데이터를 가져올 수 있는 반면, 쿼리는 모든 상황에 대해 미리 작성해두어야 한다.
    1. 객체는 필요할 때 get()을 통해 유연하게 값 또는 참조를 가져올 수 있다. 하지만 SQL은 개발자가 미리 작생해둔 쿼리로만 데이터를 가져올 수 있다.
    2. JPA는 객체를 통해 동적으로 쿼리를 생성할 수 있다.
  4. 패러다임의 불일치는 아니지만 JPA로 짜여진 코드는 특정 DB에 종속되지 않는다.
    1. DB가 변경되더라도 수정할 것이 적다. 만약 직접 SQL 작성했다면 모든 쿼리를 수정해야 할 것이다.

 

 

패러다임 불일치 문제 해결

JPA는 객체로 데이터를 관리한다고 했다. 아래의 그림을 보면 데이터를 저장하는 DAO에서 Entity를 JPA에 보내는 모습을 볼 수 있다.

그림에 있는 JPA 영역에서 Java의 컬렉션을 이용해서 데이터를 처리하고, JPA가 스스로 쿼리를 생성해서 DB에 보내준다.

JPA가 패러다임 불일치 문제를 해결해주기 때문에 개발자는 SQL이 아닌 객체에만 집중할 수 있게되고, 유지 보수성이 높아지게 된다.