JPA(Java Persistence API) 란?

jeygeon·2023년 6월 5일

JPA란?

  • JPA란 Java언어를 통해서 영속 계층을 처리하고자 하는 하이버네이트 기반의 ORM 표준 API이다. JPA가 Java Persistence API의 약자인데 여기서 Persistence가 영속성이라는 뜻이다.

    영속성이란 데이터를 생성한 프로그램이 종료되어도 삭제되지 않는 특성이다.

    아래 그림은 데이터가 생성한 프로그램이 종료되었을때의 상황이다.

    데이터는 항상 보존되어야 하기 때문에 데이터베이스를 통해 영속성을 부여하게 된다.

Spring Boot의 아키텍처를 이해하면서 아래와 같이 크게 4개의 layer로 구분된다.

  1. Presentation Layer
    • 프리젠테이션 계층은 HTTP 요청을 처리하고, JSON 매개변수를 객체로 변환하고, 요청을 인증하고 비즈니스 계층으로 전송
  2. Business Layer
    • 비즈니스 계층은 모든 비즈니스 로직을 처리한다. 서비스 클래스로 구성되며 데이터 액세스 계층에서 제공하는 서비스를 사용합니다. 또한 인증 및 유효성 검사 도 수행한다.
  3. Persistence Layer
    • 데이터베이스 행 간에 비즈니스 개체를 변환합니다.
  4. DataBase
    • 데이터베이스 계층에서는 CRUD (생성, 검색, 업데이트, 삭제) 작업이 수행된다.

앞으로 설명할 JPA는 위의 계층에서 Persistence Layer 즉 영속 계층에서 사용되는 API이다.

위의 JPA를 소개하면서 JPA란 하이버네이트 기반의 ORM표준 API라고 했는데, 사실 JPA를 처음 접하는 사람이라면 저 말을 듣고 무슨소리인가 했을 것 이다.

일단 위의 말을 이해하기 위해서 ORM을 알아야 한다.

ORM(Object Relational Mapping) 이란?

ORM이란 object relational mapping의 줄임말로 쉽게 말하자면 객체와 데이터베이스 사이의 관계를 연결해주는 역활을 하게 된다.

JAVA → 객체 저장 가능

DataBase → 객체 저장 불가능

데이터베이스는 객체를 저장하는것이 아닌 단순 데이터를 저장하는 것 이다. ORM은 이러한 DB와 OOP의 불일치성을 해결할 수 있다. (이러한 불일치를 패러다임의 불일치 라고 한다.)

예를들어 객체를 DB에 저장하기 위해 insert SQL을 직접 작성하는 것이 아니라 객체를 자바 컬렉션에 저장하듯이 ORM표준 프레임워크에 저장하게 되면 ORM은 적절한 insert SQL을 생성해서 데이터베이스에 저장하게 된다.

이렇듯이 ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달하는 것 뿐만이 아니라 앞에서 설명한 패러다임의 불일치 문제도 해결할수 있게 된다. 그러면 개발자는 더욱 객체측면에서의 정교한 데이터 모델링 또한 가능해져 객체지향 어플리케이션 개발에 집중할 수 있게 되는 장점이 있다.

하지만 모든 ORM 프레임워크들이 다 같은건 아니고 어떤 프레임워크는 단순 CRUD의 기능정도만 제공하고 있고 어떤 프레임워크는 패러다임의 불일치 문제까지 대부분 해결해주는 ORM 프레임워크가 있다. 하이버네이트(Hibernate)가 딱 그것이다.

여기까지 이해가 됬으면 위의 JPA란 하이버네이트 기반의 ORM 표준 API라는 말이 이해가 될 것이다.

왜 JPA인가?

  1. 생산성
    • 지루하고 반복적인 코드와 CRUD용 SQL을 직접 개발자가 작성하지 않아도 된다.
    • create table 같은 DDL문을 자동으로 생성해주는 기능도 있기 때문에 이런 기능들을 사용하면 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전할 수 있다.
  2. 유지보수
    • SQL을 직접 다루게 되면 컬럼이 하나만 추가되어도 개발자 입장에서는 수정해야하는 코드가 많아지게 된다. JPA를 사용하면 이러한 부분을 어느정도 대신 처리를 해서 개발자가 직접 수정해야 하는 코드수가 줄어들게 된다.
    • JPA가 패러다임의 불일치 문제를 해결해주므로 좀 더 유연하고 유지보수하기 좋은 도메인 주도 모델을 설계할 수 있게 된다.
  3. 데이터베이스 벤더의 독립성
    • 단적인 예로 페이징 처리같은 경우 데이터베이스마다 쿼리가 달라지기 때문에 각각 SQL을 다르게 작성해야 한다. JPA는 애플리케이션과 데이터베이스 사이의 추상화된 데이터 접근 계층을 제공하기 때문에 사용하는 데이터베이스가 달라지더라도 JPA에게 알려주기만 하면 된다.

💡Question

Q: 매우 복잡한 쿼리같은 경우 SQL의 처리?

A: JPA는 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화 되어 있다. 때문에 JPA가 제공하는 네이티브 SQL을 사용하거나 MyBatis같은 SQL mapper 형태의 프레임워크를 혼용하는것도 좋은 방법이다.

Q: JPA vs MyBatis

A: MyBatis같은 경우가 SQL mapper이다. SQL과 객체를 매핑만 해주면 되는 좋은 프레임워크이지만 결국 이것 또한 SQL을 직접 작성해야하기 때문에 SQL에 의존하는 개발을 피할 순 없다. 반면 ORM은 객체와 테이블을 매핑만하면 ORM프레임워크가 SQL을 만들어서 처리하기 때문에 SQL에 의존하는 개발을 피할 수 있다.


References

0개의 댓글