ORM
하이버네이트
- ORM은 객체와 관계형 데이터베이스를 매핑하는 기술로, 객체와 테이블의 매핑관계만 설정해주면 ORM 프레임워크가 SQL을 만들어서 데이터베이스와 관련된 처리를 해준다.
- 매핑 방법만 알려주면 ORM 프레임워크가 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 처리해주기 때문에, 개발자는 객체지향 애플리케이션 개발에 집중할 수 있다.
- 자바의 ORM 기술에 대한 API 표준이 JPA이고, JPA를 구현한 ORM 프레임워크가 하이버네이트이다.
MyBatis
- MyBatis나 스프링 JdbcTemplate은 ORM이 아니라 SQL 매퍼로, SQL 매퍼는 객체와 SQL을 매핑한다.
- SQL과 매핑할 객체만 지정하면 반복되는 JDBC API 사용과 응답 결과를 객체로 매핑하는 일을 SQL 매퍼가 대신 처리해준다.
- 하지만 개발자가 SQL을 직접 작성해야 하므로 SQL에 의존하는 개발을 피할 수 없다는 문제점이 존재한다.
JPA
- 과거 자바 진영은 엔터프라이즈 자바 빈즈라는 기술 표준에는 엔티티 빈이라는 ORM 기술도 포함하고 있었지만, 너무 복잡하고 자바 엔터프라이즈 애플리케이션 서버에서만 동작한다는 단점이 있었다.
- 이후 이러한 문제를 해결한 하이버네이트라는 오픈소스 ORM 프레임워크가 등장하면서, 하이버네이트를 기반으로 한 새로운 자바 ORM 기술 표준 JPA가 탄생했다.
- 즉, JPA는 자바 ORM 기술에 대한 API 표준 명세로 일반적이고 공통적인 기능의 모음이다.
장점
생산성
- JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에 저장할 객체를 전달하면 되므로, INSERT SQL을 작성하고 JDBC API를 사용하는 반복적인 일을 JPA에게 맡길 수 있다.
- 따라서 개발자는 반복적인 코드와 CRUD용 SQL을 직접 작성하지 않아도 되고, 더 나아가서 DDL 문을 자동으로 생성해주는 기능을 사용하면 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전시킬 수 있다.
유지보수
- SQL을 직접 다루면 엔티티에 필요한 필드를 하나만 추가해도 관련된 SQL과 결과를 매핑하기 위한 JDBC API 코드를 모두 변경해야 했다.
- 하지만 JPA를 사용하면 이러한 과정을 JPA가 대신 처리해주므로 유지보수해야 하는 코드 수가 줄어든다.
패러다임 불일치 문제 해결
- JPA는 상속, 연관관계, 객체 그래프 탐색, 비교와 같은 객체와 관계형 데이터베이스 간의 패러다임 불일치 문제를 해결해 준다.
- 따라서 개발자들은 객체지향 언어가 가진 장점들을 활용해서 애플리케이션 개발을 할 수 있다.
성능
- JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다.
- 예를 들어 같은 트랜잭션 안에서 같은 회원을 두 번 조회하는 경우, JDBC API를 사용하면 회원을 조회하는 SELECT SQL을 사용해서 데이터베이스와 두 번 통신한다.
- 하지만 JPA를 사용하면 회원을 조회하는 SELECT SQL을 한 번만 데이터베이스에 전달하고, 두 번째는 조회한 회원 객체를 재사용한다.
데이터 접근 추상화와 벤더 독립성
- 관계형 데이터베이스는 같은 기능도 벤더마다 사용법이 다른 경우가 많기 때문에, 애플리케이션은 처음 선택한 데이터베이스 기술에 종속되고 다른 데이터베이스로 변경하기가 어렵다.
- 하지만 JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.
- 만약 데이터베이스를 변경하려면 JPA에게 다른 데이터베이스를 사용한다고 알려주기만 하면 된다.
'Spring > JPA' 카테고리의 다른 글
영속성 컨텍스트와 연속성 관리 (0) | 2022.03.05 |
---|---|
N+1 문제와 해결 방법 (0) | 2022.03.05 |
JPQL과 페치 조인 (0) | 2022.02.23 |
QueryDSL (0) | 2022.02.04 |
스프링 데이터 JPA (0) | 2022.01.23 |