MyBatis(SQL Mapper Framework)와 JPA 비교
개요
JPA (OLTP) : API 처럼 실시간 트랜잭션 처리
MyBatis(OLAP) : 통계를 위한 쿼리 : 분석(집계합수) - 쿼리를 세밀하게 튜닝, 복잡한 쿼리
차이점
OLTP(온라인 트랜잭션 처리)- 비즈니스 데이터를 저장하고 분석하는데 도움이 되는 데이터 처리 시스템, 트랜잭션 데이터를 안정적이고 효율적으로 대량으로 저장하고 업데이트
OLAP(온라인 분석 처리) - 다양한 관점에서 데이터를 분석할 수 있도록 데이터를 결합하고 그룹화 함
유사점
SQL Mapper Framework 단점
1. 반복되는 코드와 SQL
2. 관계형DB에 의존하는 어플리케이션
3. 수정하기 힘듦
4. 객체 구조와 관계형 데이터베이스의 테이블 구조가 다름
5. SQL 중심의 코드 구조와 비즈니스 로직
JPA 단점
- 구현 난이도가 높다
- JPA 프레임워크에 대한 높은 이해도가 필요
- OLTP에 적합
JPA 장점
- 생산성이 높다
- 데이터베이스에 독립적인 개발
- 데이터를 저장하거나 조회하는 일련의 작업이 테이블이 아닌 엔티티 클래스를 기준으로 진행되므로 개발자는 비지니스 로직에 집중
1. JPA란
- 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는
API
. 스프링에서 제공 X
- API(Application Programming Interface)란 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘
- 인터페이스는 두 애플리케이션 간의 서비스 계약이라고 할 수 있다
- 이 계약은 요청과 응답을 사용하여 두 애플리케이션이 서로 통신하는 방법을 정의
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한
인터페이스
다. 특정 기능을 하는 라이브러리 X
- 스프링의 PSA에 의해서(
POJO
를 사용하면서 특정 기술을 사용하기 위해서)표준 인터페이스를 정해두었는데, 그중 ORM을 사용하기 위해 만든 인터페이스가 바로 JPA이다.
POJO
(Plain Old Java Object): "Plain Old Java Object"의 약어로, 간단히 말해 특정 프레임워크나 규약에 종속되지 않는 간단한 자바 객체를 의미
- POJO는 특별한 규약이나 인터페이스를 따르지 않고, 순수한 자바 클래스
- ⇒ POJO는 일반적인 학생, 교복을 입지 않고 특별한 규칙이나 제약 없이 학교에 다니는 학생, JPA는 이 학생들을 학교 시스템에 등록하고 관리하는 시스템을 제공하는 역할
- 기존 EJB에서 제공되던 엔티티 빈을 대체하는 기술이다.
- ORM이기 때문에 자바 클래스와 DB테이블을 매핑한다.(SQL을 매핑하지않는다)
- ORM을 사용하기 위한 인터페이스를 모아둔 것이며, JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus같은 ORM 프레임워크를 사용해야 합니다.
JPA의 동작 과정
JPA는 애플리케이션과 JDBC 사이에서 동작한다.
개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.
즉, 개발자가 직접 JDBC API를 쓰는 것이 아니다.
JDBC를 사용하여 데이터를 영속하는 애플리케이션의 구조
ORM 프레임워크를 사용하여 데이터를 영속하는 애플리케이션의 구조
2. JPA의 개요
2-1. 버전별 특징
3. 사용 방법
- 객체를 저장하는 코드
jpa.persist(member);
- 객체를 조회하는 코드
Member member = jpa.find(memberId);
4. JPA의 사용 목적
- JPA를 이용하는 개발의 핵심은 객체지향을 통해서 영속 계층을 처리하는데 있다.
- 테이블과 SQL을 다루는 것이 아니라 데이터에 해당하는 객체를 엔티티 객체라는 것으로 다루고JPA로 이를 데이터 베이스와 연동해서 사용
4.1 Entity란?
- 쉽게 말해서
PK(기본키)를 가지는 자바의 객체
- 고유의 식별을 위해
@Id를 이용
해서 객체를 구분하고 관리
4.2 Persistence
- 사전적 의미로는 영속성, 애플리케이션이 생산한 데이터가 영구적으로 유지되는 성질
- 데이터를 생성한 프로그램이 종료되어도 사라지지 않는 데이터의 특성을 말한다.
- 영속성을 갖지 않으면 데이터는 메모리에서만 존재하게 되고 프로그램이 종료되면 해당 데이터는 모두 사라지게 된다.
- 그래서 우리는 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여한다.
Persistence Layer
- 프레젠테이션 계층 (Presentation layer) - UI 계층 (UI layer) 이라고도 함
- 애플리케이션 계층 (Application layer) - 서비스 계층 (Service layer) 이라고도 함
- 비즈니스 논리 계층 (Business logic layer) - 도메인 계층 (Domain layer) 이라고도 함
- 데이터 접근 계층 (Data access layer) - 영속 계층 (Persistence layer) 이라고도 함
4.3 ORM이란?
- ORM이란 객체와 DB의 테이블이 매핑을 이루는 것을 말합니다.
- 즉, 객체가 테이블이 되도록 매핑 시켜주는 것을 말합니다.
- ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있습니다.
- 예를 들어, User 테이블의 데이터를 출력하기 위해서 MySQL에서는
SELECT * FROM user;
라는 query를 실행해야하지만, ORM을 사용하면 User 테이블과 매핑된 객체를 user라 할 때, user.findAll()
라는 메서드 호출로 데이터를 조회 가능합니다.
- query를 직접 작성하지 않고 메서드 호출만으로 query가 수행되다 보니, ORM을 사용하면 생산성이 매우 높아집니다.
- 그러나 query가 복잡해지면 ORM으로 표현하는데 한계가 있고, 성능이 raw query에 비해 느리다는 단점이 있기때문에, JPQL, QueryDSL 등을 사용하거나 한 프로젝트 내에서 Mybatis와 JPA를 같이 사용하기도 합니다.
4.4 JPA Hibernate(하이버네이트) -ORM 프레임워크
- 하이버네이트는 JPA 구현체의 한 종류이다.
JPA는 DB와 자바 객체를 매핑하기 위한 인터페이스(API)를 제공하고 JPA 구현체(하이버네이트)는 이 인터페이스를 구현한 것이다.
- 하이버네이트 외에도 EclipseLink, DataNucleus, OpenJPA, TopLink Essentials등이 있다.
- Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
- Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐이다.
- HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함하고 있다.
- HQL은 SQL하고 매우 비슷하며 추가적인 컨벤션을 정의할 수도 있다.
- HQL은 완전히 객체 지향적이며 이로써 상속, 다형성, 관계 등의 객체지향의 강점을 누릴 수 있다.
- HQL은 쿼리 결과로 객체를 반환하며 프로그래머에 의해 생성되고 직접적으로 접근할 수 있다.
- HQL은 SQL에서는 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.
- HQL은 여러 테이블을 작업할 때 명시적인 join을 요구하지 않는다.
4.5 Spring - Data - JPA
- 엔티티 객체를 이용해서 JPA를 이용하는데 더욱 편리한 방법들을 제공하는 스프링 관련 라이브러리
- 자동으로 객체를 생성하고 이를 통해서 예외 처리 등을 자동으로 처리하는데 이를 위해서 제공되는 인터페이스가 JpaRepository
- Raw JPA? EntityManager는 이름 그대로 @Entity 어노테이션을 달고 있는 Entity 객체를 관리하며 실제 DB 테이블과 매핑하여 데이터를 조회/수정/저장하는 중요한 기능을 수행
JPA는 ORM을 위한 자바 EE 표준이며 Spring-Data-JPA는 JPA를 쉽게 사용하기 위해 스프링에서 제공하고 있는 프레임워크이다.
추상화 정도는 Spring-Data-JPA -> Hibernate -> JPA
이다.
Hibernate를 쓰는 것과 Spring Data JPA를 쓰는 것 사이에는 큰 차이가 없지만
- 구현체 교체의 용이성
- 저장소 교체의 용이성이라는 이유에서 Spring Data JPA를 사용하는것이 더 좋다.