Jpa
Jpa 란?
Java Persistence API (JPA)는 Java 진영의 ORM (Object relational mapping ) 기술 표준으로서 (API 표준 명세로 , JPA 자체가 구현체는 아니다. ) , JDBC API를 추상화해 application과 JDBC 사이에서 동작한다.
Jpa를 사용하려면 그 구현체를 선택해야하는데, 구현체는 hibernate , EclipseLink , DataNuclues가 존재하며 이중에서 hibernate가 가장 대중적이다.
ORM의 정의
객체와 관계형 데이터베이스의 엔티티를 매핑한다
ORM을 왜 사용해야하는가?
ORM을 사용해야하는 이유는 관계형 데이터베이스와 객체간의 차이점에서 온다.
비즈니스 요구사항을 모델링한 application 객체를 entity라고 하는데, ORM을 사용하지 않으면 entity가 Dao 로직의 SQL에 의존적이 된다. 예를 들면 entity에 추가적인 필드가 생기면 Dao내 sql로직을 같이 수정해주어야 한다.
따라서 application 에서 sql을 직접 다루면, entity를 신뢰할수 없으며 sql에 의존적인 개발이 이루어진다.
ORM이 해결해야하는 문제
- ORM은 객체와 관계형 데이터베이스간의 불일치성을 해결해야 한다. 대표적인 객체와 관계형 데이터베이스간의 차이점을 보면 아래와 같다.
- 상속
- 객체는 상속이 가능하지만 테이블은 상속이 불가능하다. 데이터베이스 모델링에서는 슈퍼타입 서브타입 관계를 사용하면 객체 상속과 유사한 형태로 테이블을 설계할수는 있다.
- 연관관계
- 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회하는 반면 테이블은 외래키를 사용해 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
- 비교
- 데이터베이스는 PK의 값으로 각 row을 구분하는 반면 객체는 동일성 (==,주소값비교) , 동등성 (equals(),값비교) 으로 구분된다.
Jpa를 왜 사용해야하는가?
- 생산성
Jpa를 사용하면 데이터베이스 엔티티를 마치 객체를 다루듯이 추상화해주어 개발 생산성이 증가한다. 반복적인 CRUD SQL를 직접 작성할 필요가 없다.
유지보수성
SQL을 직접 다루면 엔티티에 필드 변경이 생겼을 경우 이에 관련된 Dao내의 sql코드가 모두 변경되야 한다. Jpa는 이러한 과정이 모두 추상화되어 제공되기 때문에 수정에 덜 열려있다.객체와 관계형 데이터베이스간의 불일치성 해결
성능
Jpa 는 write buffering 을 통한 여러가지 성능 개선의 여지를 준다.DB 벤더와 독립적으로 개발 가능
관계형 데이터베이스는 벤더 (ex) oracle ,mysql) 마다 사용법이 다른 경우가 빈번한데, Jpa는 application이 특정 DB벤더에 종속적이지 않도록 추상화해준다. (Jpa Dialect)
Mybatis와 차이점
Mybatis를 프로젝트에서 직접 사용해본 경험은 없지만 차이점을 알고 추후에 프로젝트에 더 알맞는 기술을 선택해 개발하는게 중요할 것 같아서 정리한다.
Mybatis는 SQL Mapper 기능을 해주는데,객체와 SQL 결과를 매핑해준다. 즉 순수JDBC API를 사용해 ResultSet으로 부터 반환되는 값들을 개발자가 직접 매핑해주는게 아니라 SQL Mapper 기능을 해주는 Mybatis 가 이를 대신 처리해준다.
Jpa에 비해 갖는 장점 : 복잡한 쿼리 (ex) 동적 쿼리 ,통계성 쿼리) 도 SQL 쿼리를 직접 작성하기 때문에 최적화된 쿼리를 작성만 할 능력이 된다면 손쉽게 구현할 수 있다.
- Jpa에 비해 갖는 단점: 앞서 공부했던것처럼 Jpa는 sql에 의존적인 개발을 피하게 추상화시켜준다. 따라서 mybatis는 비즈니스 요구사항 변경시마다 sql로직을 직접 수정해주어야 한다는 단점이 존재한다.
정리
Jpa 는 Java ORM 기술 표준으로 그 구현체는 hibernate가 주로 쓰인다, 관계형 데이터베이스와 객체간의 불일치성을 중간에서 추상화시켜 해결해주며, 장점으로는 생산성,유지보수성,DB 벤더에 종속적이지 않게 해준다.
Mybatis는 sql mapper로서 sql로직을 직접 작성하지만 그만큼 복잡한 쿼리를 작성하는데는 장점을 가지고 있으나 엔티티가 변경된다면 변경에 열려있다는 단점을 가지고 있다.