JPA는 (Java Persistence API)의 약자로 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 대표적으로 JPA로 구현한 오픈소스 Hibernate가 있다, 나도 처음에 헷갈렸었는데 JPA와 Spring-Data-JPA는 엄연히 다르다. Spring-Data-JPA는 JPA를 사용하는 Spring 프레임워크이다.
(이처럼 JPA가 있고 Spring Data JPA가 존재한다.)
JPA는 일단 반복적인 CRUD작업을 특정메서드만 사용하면되고 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만하면 되고, 예측도 쉽게 할 수 있다, 그리고 MyBatis 를 사용한다면 Query문구에 문제가 생겨도 직접 실행시키고 직접동작을 해봐야 확인이 가능하지만 JPA를 사용하면 Query를 자동으로 생성시켜주고 개발자는 Query조건과 테이블간의 관계만 신경쓰면 되니 생산성이 올라간다.
(최대한 그려봤는데 틀린점이 있으면 지적부탁드립니다.)
Java 진영에서 JPA는 이렇게 두 가지로 나눌 수 있겠는데 2단의 Spring Data JPA와 hibernate는 공통적으로 JPA를 쉽게 구현하기위해 만든 인터페이스 구현체라는 점에서는 같지만 내부에서 JPQL을 사용하는 방식이 다르다.
기술명 | 설명 |
---|---|
EntityManager | JPA에서 기본으로 쿼리를 작성하는 방식 |
QueryDSL | hibernate에서 제공하는 쿼리작성 프레임워크 |
JPARepository | Spring Data JPA에서 제공하는 JPA저장소 |
@Query | JPARepository에서 제공하는 쿼리를 직접작성할 수 있도록 제공하는 어노테이션 |
처음에는 JPQL이 무슨 라이브러리 개념인줄 알았는데 기술의 일종이었다.
JPQL | SQL | |
---|---|---|
대상객체 | Entity 객체 | 데이터베이스 테이블 |
추상화 수준 | 객체지향적인 추상화 수준을 가지고 있어 데이터베이스의 물리적인구조에 독립적이다. | 데이터베이스의 물리적 구조에 의존적이다. |
쿼리 작성 방식 | Entity 이름과 Entity의 필드 이름을 사용하여 쿼리를 작성한다. | 테이블 이름, 컬럼 이름을 직접 명시해야 한다. |
데이터 타입 | 자바 객체의 데이터타입을 사용한다. | 데이터베이스의 타입을 사용한다. |
쿼리 실행과정 | JPA 구현체가 JPQL을 SQL로 변환하여 데이터베이스에 전달한다. | 데이터베이스에 직접 쿼리를 전달하여 실행한다. |
JPA든 Mybatis 같은 SQL Mapper든 결국 데이터베이스의 테이블을 조회한다는 점에서 같다 하지만 각각 장단점이 뚜렷했다. 세계관점에서 보면 JPA를 많이 사용하고 국내에서도 신규 프로젝트 및 서비스를 운영하는 기업에서는 JPA를 많이 사용하는 추세다,
하지만 업무가 복잡한 은행과 공기업에서는 Mybatis를 사용할 수 밖에 없기에 쿼리를 직접 작성을 해야하는데 국내에는 Mybatis를 사용해야 할 정도로 복잡한 프로세스를 지닌 프로젝트가 수도 없이 많다. 국가 프로젝트 및 은행권에서 JPA를 사용하기까지는 시간이 좀 걸릴거 같다.