ORM 은 무엇이며 MyBatis와 JPA는 어떤 상황에서 쓸까?
ORM(Object Relational Mapping) 이란?
ORM 이란 객체(Object) 와 DB의 테이블을 Mapping 시켜 RDB 테이블을 객체 지향적으로 사용하게 해주는 기술입니다.
JAVA 에서 대표적인 ORM으로는 JPA와 그의 구현체 Hibernate 가 있다.
JPA (Java Persistent API) 등장 이전에는 MyBatis라는 Object Mapping 기술을 사용하였다.
- MyBatis는 Java 클래스 코드를 직접 작성한 SQL 코드에 Mapping 시켜 주어야 한다.
- 반면 JPA와 같은 ORM 기술은 객체가 DB에 연결되기 때문에, SQL을 직접 작성하지 않고 표준 인터페이스 기반으로 처리한다는 점에서 차이가 있다.
물론 지금도 많은 곳에서 MyBatis를 사용하지만, 전 세계적으로는 Hibernate를 많이 사용하는 추세이다.
SQL Mapper와 ORM
데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence)라고 한다.
Java에서는 데이터의 영속성을 위한 JDBC를 지원해 주는데, 이는 매핑 작업을 개발자가 일일이 수행해야 하는 번거로움이 있다.
SQL Mapper와 ORM 은 JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로 DB와 연동되는 시스템을 빠르게 개발할 수 있도록 기능을 제공해 주는 Persistence Framework에 종류이다.
MyBatis와 JPA 차이점
MyBatis
장점
- 복잡한 쿼리나 동적 쿼리에 강하다.
단점
- SQL 쿼리를 직접 수정하고 관리해야 한다.
- 특정 DB에 종속적이다.
JPA
장점
- CRUP 메서드를 기본 제공한다. 즉 단순 쿼리를 작성하지 않아도 된다.(생산성 향상)
- DB에 종속적이지 않다.
단점
- 단순 JPA만으로는 복잡한 쿼리를 만들기 어려우므로 QueryDSL을 함께 이용한다.
- N+1 문제가 발생할 수 있다.
- 서비스가 고도화된다면 학습할 내용이 많아져 그만큼 학습 비용이 발생한다.
MyBatis와 JPA는 모두 각각의 특징을 갖고 있기 때문에 상황에 맞는 적합한 ORM을 사용하는 것이 중요하다.
특징 | MyBatis | JPA |
DB | 종속적 | 비종속적 |
쿼리 | 직접구현 | 일부 자동구현 |
복잡쿼리 | 강함 | 약함 |
오류확인 | 런타임 | 컴파일타임 |
쿼리수정 | 수동 | 자동 |
언어 | 다양한 언어 | 자바 |
... |
현업에서 JPA 대신 MyBatis를 사용하는 이유
[ 러닝 커브 ]
JPA는 Mybatis에 비해 러닝 커브가 높은 편입니다.
Mybatis의 경우는 기존의 JDBC를 이용한 개발 방식에서 SQL 쿼리를 통한 접근방식을 따로 모아서 관리하는 것이기 때문에 JDBC를 이용한 개발을 할 줄 아는 개발자라면 쉽게 배울 수 있습니다.
하지만 JPA는 SQL Query를 직접 만들어준다는 장점이 있지만, 영속성 콘텍스트, Entity 매핑 등 복잡한 개념 때문에 러닝커브가 높습니다.
[ 세밀한 SQL 제어 ]
MyBatis는 일반적으로 JPA와 비교하여 좀 더 세밀한 SQL 제어가 필요하거나, 기존에 이미 존재하는 SQL 쿼리들을 재사용해야 할 때 많이 사용됩니다. 또한 SQL 작성에 익숙한 개발자들이나 특정 데이터베이스 기능을 활용해야 하는 경우에도 MyBatis를 선호할 수 있습니다.
JPA와 MyBatis의 선택
상황에 맞게 사용하자!
- 추가, 수정, 삭제, 테이블 한 개의 조회는 JPA와 같은 ORM을 사용하면 편리합니다.
- 두 개 이상의 테이블을 조인할 경우 Mybatis로 쿼리를 작성하는 게 편리합니다.
또한 JPA에서는 서브쿼리(인라인 뷰)는 JPQL(Querydsl 포함)에서 지원하지 않습니다. 그래서 이러한 문제점이나 복잡한 쿼리는 Mybatis를 함께 사용해서 처리한다면 된다고 합니다.
출처 :
https://mangkyu.tistory.com/20?category=872426
https://hoehen-flug.tistory.com/47
https://doreree.tistory.com/29
'JAVA' 카테고리의 다른 글
[JAVA] staic 과 final (1) | 2024.10.29 |
---|---|
== 와 equals 차이 , hashcode (0) | 2024.10.24 |
[Java] Call by Value 와 Call by Reference (6) | 2024.10.21 |
[자바의 신] 정리해봅시다 [1장~ 10장] (0) | 2024.10.19 |
[JAVA] 자바 버전과 특징 8 ,11 (0) | 2024.10.10 |