[Spring] ORM, JPA, hibernate, iBatis/MyBatis 개념 및 차이점
ORM 기술도 트렌드가 변화하고있다. 한참동안은 MyBatis가 대세를 이루더니 요즘은 JPA+JPQL 이 대세라고 한다.
MyBatis는 동적쿼리를 작성할 때 xml로 태그를 열고 닫아야 하는 귀찮은 부분이 분명 있었지만,
SQL을 직접작성하다보니 쿼리를 볼 때 매우 직관적이고, Oracle의 내장함수를 이용할 수 있는 부분이 커다란 장점이였다.
최근의 JPA+JPQL의 조합은 어떠한가. CRUD를 직접 작성하지 않아도 되고, DB가 바뀌어도 쿼리작성은 JPA의 몫이니 크게 신경쓰지 않아도 된다.
그러나 JPA자체를 학습하는데는 또 다른 이해를 요구하는 일이다.
그리고 사실 JPA는 ORM 기술의 명세일뿐 실제 사용하려면 Hibernater같은 프레임워크가 필요하니 또다른 학습이 늘어난다.
무슨 기술이든 장단점은 존재하고 어떤 기술을 채택하여 사용할지를 결정하는 것 또한 프로그램에 큰 영향을 미치니
무엇을 사용하는 것이 좋다라고 말하긴 보단 잘 선택해서 사용하기를..
ORM이란?
- ORM의 표준 JPA와 JPA를 표준을 따르고 구현한 hibernate, iBatis/MyBatis
- ORM : JPA Hibernate, iBatis/MyBatis
ORM (Object-relational mapping : 객체 관계 매핑)
- 자바객체와 데이터베이스 테이블간의 매핑처리
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
- 데이터베이스에 저장된 데이터와 개체를 매핑하는 것은 프로그래밍 전략입
- 데이터 생성, 데이터 조작 및 데이터 액세스를 단순화 함
Java ORM Frameworks 종류
- Enterprise JavaBeans Entity Beans
- Java Data Objects
- Castor
- TopLink
- Spring DAO
- Hibernate
JPA (Java Persistence API)
- 자바 진영의 ORM 기술 표준 (사양)
- JPA는 객체 지향 도메인 모델과 관계형 데이터베이스 시스템 간의 다리 역할
- JPA는 자체적으로 어떤 작업도 수행하지 않음(사양일 뿐)
- Hibernate, TopLink 및 iBatis와 같은 ORM 도구는 데이터 지속성을 위한 JPA 사양을 구현
- ORM 도구에서 다른 도구로 애플리케이션을 전환하려는 경우 쉽게 수행 가능
- javax.persistence 패키지에 정의
- 자바 지속성 쿼리 언어 데이터베이스 작업을 수행하는 객체 지향 쿼리 언어 (JPQL) 사용
동작 방법
- JAVA가 JDBC API에 명령을 내리는 것이라니라 JPA를 사용하면 JPA가 JDBC API를 사용해서 DB와 통신하고 SQL을 호출하고 반환
- 저장시 JPA가 Entity를 분석해서 SQL을 생성함
- 조회시 JPA가 SQL을 생성하여 SQL을 생성
- 패러다임 불일치 해결
장점
- 개발이 편리함 : 기본적인CRUD용 SQL을 직접 작성하지 않아도 됨
- 데이터베이스에 독립적 개발 가능 : JPA는 데이터베이스에 종속적이지 않아서 데이터베이스가 변경되더라도 JPA가 해당 데이터베이스에 맞는 쿼리 알아서 생성해줌
- 유지보수가 쉬움: 테이블 변경시 JPA의 엔티티만 수정하면 됨
단점
- 학습이 어려움
- 특정 데이터베이스의 함수를 사용하지 못함
- 테이블을 객체지향 설계가 필요
Hibernate (하이버네이트)
- 2001 년 Gavin King이 만든 오픈 소스 영구 프레임 워크
- 데이터베이스와 상호 작용하는 Java 애플리케이션의 개발을 단순화하는 Java 프레임 워크
- 오픈 소스, 경량의 ORM (Object Relational Mapping) 도구
- 데이터 지속성을 위해 JPA (Java Persistence API) 사양을 구현(JPA 구현 중 하나 )
- 자바 객체와 데이터베이스 테이블사이의 매핑을 관리하려고 만들어진 도구 ORM
- 개체들의 도메인 객체가 있어야 하는데 단순한 POJO이고 각 객체는 데이터테이블과 간단하게 연결
- JDBC의 한계를 극복하는 데 사용
- org.hibernate 패키지에 정의 됨
동작방법
- Java Application내 Hibernate의 Configuration 파일(Hibernate.Properties)과 Hibernate XML Mapping 파일을 사용하여 데이터베이스에 대한 특정 작업을 수행하는 지속성 논리를 작성하여 특정 클래스의 객체(영속성 객체)를 만듦
- Hibernate Framework 내부의 SessionFactory, Session , Transaction 등과 같은 많은 객체를 사용하여 Java Application과 상호작용
- JDBC (Java Database Connectivity), JTA (Java Transaction API) 및 JNDI (Java Naming Directory Interface)와 같은 기존 Java API를 통해서 데이터베이스로 이동하여 지속성 논리를 수행하는 상호작용
- 데이터베이스와 상호작용 (CRUD 지속성 논리를 수행)
장점
- 오픈 소스 및 경량 : LGPL 라이선스하에 오픈 소스이며 경량임
- 빠른 성능 : 최대 절전 프레임 워크에서 캐시가 내부적으로 사용되기 때문에 최대 절전 프레임 워크의 성능이 빠름
- 데이터베이스 독립 쿼리 : HQL (Hibernate Query Language)은 SQL의 객체 지향 버전데이터베이스 독립적 인 쿼리를 생성 > 특정 쿼리를 작성할 필요가 없음
- 자동 테이블 생성 : Hibernate 프레임 워크는 데이터베이스 테이블을 자동으로 생성하는 기능을 제공 > 데이터베이스에 수동으로 테이블을 만들 필요가 없음
- 복잡한 조인 단순화 : 하이버 네이트 프레임 워크에서는 여러 테이블에서 데이터를 가져 오는 것이 쉬움
- 쿼리 통계 및 데이터베이스 상태 제공 : Hibernate는 쿼리 캐시를 지원하고 쿼리 및 데이터베이스 상태에 대한 통계를 제공
MyBatis
- 오픈 소스, 경량의 지속성 프레임 워크
- 가장 간단한 지속성 프레임 워크
iBatis
- iBatis는 SQL에 기반한 데이터베이스와 자바, 닷넷(.NET), 루비(Ruby) 등을 연결시켜 주는 역할을 하는 영속성 프레임워크(Persistence Framework)
- 연결은 프로그램의 소스코드에서 SQL 문장을 분리하여 별도의 XML 파일로 저장하고 이 둘을 서로 연결시켜주는 방식으로 작동
- iBatis는 사용자가 SQL 문장을 만들면 그에 적합한 객체모델을 생성하는 방식으로 작동
- 모든 SQL을 XML로 작성하고 SQL문을 사용하는 DAO클래스를 설계해서 SQL호출하는 방식
- 팀 전원이 아파치 소프트웨어 재단에서 구글 코드로 이전하면서 중단됨
- 새로운 프레임워크 MyBatis로 변경
장점
- 인터페이스와 애노테이션을 통해서 SQL문 설정하고 처리할 수 있음
- XML만을 이용해서 SQL문을 설정
- DAO에서는 xml찾아서 실행하는 코드 작성하는 방식
- SQL수정 유지보수적합하나 복잡성 증가
- 동적 Query 지원
- ORM 지원
결론
MyBatis | Hibernate |
---|---|
SQL을 생성하고 싶을 경우 | SQL 을 생성하고 싶지않을 경우 |
데이터베이스에 따라 달라질 수 있는 SQL을 사용 | 데이터베이스와 독립적인 HQL을 사용 |
ResultSet을 POJO 객체에 매핑하므로 테이블 구조에 대해 신경 쓸 필요 없움 | Java POJO 객체를 데이터베이스 테이블에 매핑 |
references
https://practice.geeksforgeeks.org/problems/what-is-orm https://www.javatpoint.com/hibernate-tutorial https://www.geeksforgeeks.org/introduction-to-hibernate-framework/ https://www.tutorialspoint.com/hibernate/orm_overview.htm https://www.geeksforgeeks.org/difference-between-jdbc-and-hibernate-in-java/ https://www.javatpoint.com/jpa-vs-hibernate https://www.tutorialspoint.com/mybatis/mybatis_overview.htm