Jpa란
ORM? Hibernate? JPA?
1. ORM이란
- Object-relational- mapping
- 어떤 어플리케이션을 만든다고 가정하자. 단골손님의 주소록을 만든다고 하자. 사람의 객체에는 이름, 키 몸무게 등이 저장 될 것이고, 주소록 객체에는 전화번호, 사람 번호, 주소 등이 저장되어 객체가 연결 될 것이다. 이렇게 생성된 사람 객체를 영구적으로 저장하기 위해 파일이나 데이터베이스에 저장하고자 하면 테이블에 객체가 가지고 있던 정보를 입력하고, join과 같은 SQL 질의어를 통해 설정을 해 주게 된다. 여기서 이 태이블과 객체간의 이질성이 발생한다.
0. MyBatis (SQL Mapper)
- 객체와 SQL문을 매핑하여 데이터를 객체화 하는 기술
- 객체와 관계를 매핑하기 보다는 SQL문의 질의 결과와 객체를 매핑시켜준다.
장점
- 다른 프레임워크들에 비해 간단하다(SIMPLE)
- 소스 코드와 SQL의 분리 (생산성, 작업 분배)
- SQL을 직접 다룰 수 있다. (복잡한 쿼리, 저장 프로시저 등)
단점
- 반복적인 코드와 CRUD SQL 작업
- SQL 데이터베이스 벤더에 대한 종속성
1. ORM 장점
- 객체 지향적인 코드로 더 직관적이고 비지니스 로직에 더 집중 할 수 있다.
- SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 향상된다.
- 재사용 및 유지 보수의 편리성이 증가한다.
- ORM은 독립적으로 작성되어 있고, 해당 객체들은 재사용 할 수 있다.
- DBMS 에 대한 종속성이 줄어든다.
- ORM 솔루션은 DB에 종속적이지 않다.
- 프로그래머는 Object에 집중함으로써, 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다.
2. ORM 단점
-
완벽한 ORM으로 서비스를 구현하기 어렵다.
- 사용사기는 편하지만 설계는 매우 신중하게 해야한다.
- 프로젝트의 복잡성이 커질 경우, 난이도가 올라간다.
- 잘못된 구현의 경우 속도 저하 및 일관성이 무너지는 문제점이 생길 수 있다.
-
프로시저가 많은 시스템에선 ORM의 객체 지항적인 장점을 활용하기 어렵다.
- 프로시저가 많은 시스템에선 다시 객체로 바꿔야 하며, 그 과정에서 생산성 저하나 리스크가 발생할 수 있다.
프로시저란?
- 특정 작업을 수행하는, 이름이 있는 PL/SQL BLOCK
-
장점을 극대화 하기 위하여 알아야 할 게 많다.
JPA와 Hibernate
1. JPA
- Java Persistence API
- ORM 전문가가 참여한 EJB 3.0 스펙 작업에서 기존 EJB ORM이던 Entity Bean을 JPA라고 바꾸고 JavaSE, JavaEE를 위한 영속성(persistence) 관리와ORM을 위한 표준 기술
- JPA는 ORM 표준 기술로 Hibernate, OpenJPA, EclipseLink, TopLink Essentials과 같은 구현체가 있고 이에 표준 인터페이스
장점
- 생산성
- JPA를 사용하면 CRUD 용 SQL을 개발자가 직접 작성하지 않아도 된다.
- Spring Data Jpa를 사용하면 interface 선언만으로 쿼리 구현이 가능
- 유지 보수
- 칼럼 추가/삭제 시 관련된 CRUD 쿼리를 모두 수정하는 대신, JPA가 관리하는 Entity만 수정하면 된다.
- 데이터베이스 접근 추상화와 벤더 독립성
- 데이터베이스 벤더마다 미묘하게 다른 데이터 타입이나 SQL을 JPA를 이용하면 손쉽게 해결 가능
- SQL 중심적인 개발에서 객체 중심으로 개발
- 패러다임 불일치 해결 (상속, 연관 관계, 레퍼런스, 오브젝트 등)
2. Hibernate
- Jpa 실제 구현체 : Hibernate, EclipseLink, DataNucles
-
Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
- Hibernate가 지원하는 매서드 내부에는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐이다.
- HQL
-
Hibernate Query Language
-
SQL과 매우 비슷하며 추가적인 컨벤션을 정의 할 수 있다.
-
HQL은 객체 지항적이며, 상속, 다형성, 관계등의 객체지향의 강점을 누릴 수 있다.
-
HQL은 SQL에서 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.
-
출처
http://www.incodom.kr/ORM#h_702209f3f35878a32ee91352ddc6bbe7
https://www.slideshare.net/dongmyo/mybatis-jpa-123381168
https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html
https://tinkerbellbass.tistory.com/24
https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/en/ArchitectureInDetail/DataAccessJpa.html