본문 바로가기
Study/spring

자바 ORM 표준 JPA 프로그래밍(1) - JPA란 무엇인가?

by 유경호 2020. 11. 18.
반응형

JPA란 무엇인가?

JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다. 어플리케이션과 JDBC 사이에서 동작한다.

 

ORM이란? ROM(Object-Relational Mapping)은 이름 그대로 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다. 객체를 마치 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장함으로써 데이터베이스에 INSERT 할 수 있게 된다. 그러면 ORM 프레임워크가 적절한 INSERT SQL을 생성해서 데이터베이스에 객체를 저장해준다.

 

위와 같이 ORM 프레임워크가 객체 모델과 데이터베이스 사이의 패러다임 불일치 문제를 해결해주기 때문에 개발자는 데이터 중심인 관계형 데이터베이스를 사용해도 객체지향 어플리케이션 개발에 집중할 수 있다.

Java 진영에 다양한 ORM 프레임워크들이 있다. 그 중 하이버네이트 프레임워크가 가장 많이 사용된다. 하이버네이트는 거의 대부분의 패러다임 불일치 문제를 해결해주는 성숙한 ORM 프레임워크이다.

 

하이버네이트와 JPA

EJB가 나오고 쓰일 당시에 그 안에는 엔티티 빈이라는 ORM 기술도 포함되어 있었다. 하지만 너무 복잡하고 기술 성숙도도 떨어졌으며 자바 엔터프라이즈(J2EE) 어플리케이션 서버에서만 동작했다. 이 때 하이버네이트(hibernate.org)라는 오픈소스 ORM 프레임워크가 등장하였는데 EJB의 ORM 기술과 비교해도 가볍고 실용적인 데다 기술 성숙도도 높았다. 자바 엔터프라이즈 어플리케이션 서버 없이도 동작하여 많은 개발자들이 사용하기 시작했고 결국 EJB 3.0에서 하이버네이트 기반 새로운 자바 ORM 기술 표준이 만들어졌는데 이것이 바로 JPA이다.

JPA 소개

JPA는 자바 ORM 기술에 대한 API 표준 명세이다. JPA라는 표준 덕분에 특정 구현 기술에 대한 의존도를 줄일 수 있고 다른 구현 기술로 손쉽게 이동할 수 있는 장점이 있다. JPA 표준은 일반적이고 공통적인 기능의 모음이다. 따라서 표준을 먼저 이해하고 필요에 따라 JPA 구현체가 제공하는 고유의 기능을 알아가면 된다.

JPA를 사용해야하는 이유

생산성

JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달하면 된다. INSERT SQL을 작성하고 JDBC API를 사용하는 지루하고 반복적인 일은 JPA가 대신 처리해준다.

1
2
jpa.persist(member); // 저장
Member memeber = jpa.find(memberId); // 조회
cs

 

반본적인 CRUD용 SQL 작업을 개발자가 하지 않아도 된다. 더 나아가 JPA는 CREATE TABLE과 같은 DDL 문을 자동으로 생성해주는 기능도 있다. 이와 같은 기능들을 사용하면 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전시킬 수 있다.

 

유지보수

SQL을 직접적으로 다루게 되면 SQL과 어플리케이션의 결합도가 높기 때문에 엔티티에 필드를 하나만 추가해도 관련 CRUD SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 수정해야 했다. JPA를 사용하면 이런 과정을 JPA가 대신 처리해주어 필드를 추가하거나 삭제해도 수정해야 할 코드가 줄어든다. 기존 방식으로 개발시 개발자가 처리해야하는 유지보수 작업을 JPA가 대신 처리해주어 유지보수해야 하는 코드 수가 줄어든다.

 

또한, JPA가 패러다임의 불일치 문제를 해결해주기 때문에 객체지향 언어가 가진 장점들을 활용하여 유연하고 유지보수하기도 좋은 도메인 모델을 설계할 수 있도록 해준다.

 

패러다임 불일치 해결

데이터베이스는 객체와 달리 데이터 중심의 설계가 되어있기 때문에 패러다임의 불일치 문제가 생긴다. JPA는 상속, 연관관계, 객체, 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결해준다.

 

성능

JPA는 어플리케이션과 데이터베이스 사이의 다양한 성능 최적화 기회를 제공한다. JPA는 어플리케이션과 데이터베이스 사이에서 동작하기 때문에 다양한 성능 최적화를 시도할 수 있다.

1
2
3
String memberId = "helloId";
Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);
cs

위 코드는 같은 트랜잭션 안에서 같은 회원을 두 번 조회하는 코드의 일부분이다. 기존의 방식인 JDBC API를 사용하여 해당 코드를 작성했다면 회원을 조회할 때마다 SELECT SQL을 사용해서 데이터베이스와 두 번 통신했을 것이다. JPA를 사용하면 회원을 조회하는 SELECT SQL을 한 번만 데이터베이스에 전달하고 두 번째는 조회한 회원 객체를 재사용한다.

 

데이터 접근 추상화와 벤더 독립성

관계형 데이터베이스는 같은 기능도 벤더마다 사용법이 다른 경우가 많다. 단적인 예시로 페이징 처리는 데이터베이스마다 달라서 사용법을 각각 배워야한다. 즉 어플리케이션은 처음 선택한 데이터베이스 기술에 종속되고 다른 데이터베이스로 변경하기가 매우 어려워진다.

 

JPA는 어플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공하기에 어플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 해준다. 데이터베이스를 변경하고자 한다면 JPA에게 다른 데이터베이스를 사용한다고 알려주기만 하면 된다. JPA 사용법에만 맞춰 개발을 한 후 데이터베이스만 정해서 JPA에 알려주면 개발자가 원하는 동작을 JPA가 데이터베이스에 맞게 변경해주기 때문이다.

 

표준

JPA는 자바의 ORM 기술 표준이다. 표준을 사용하면 다른 구현 기술로 손쉽게 변경할 수 있다.

반응형