슬기로운 개발생활

[MyBatis] MyBatis VS JPA/Hibernate

by coco3o
반응형

MyBatis 란?

객체지향 언어인 JAVA의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 persistence framework입니다.
persistence framwork란?

자바에서 DB 프로그래밍을 하기 위해서 JDBC가 제공되었습니다.
(기본 JDBC - 직접 DB Connection 생성, Statement 생성 및 쿼리 수행, 결과값(ResultSet) 처리를 구현해야 함)
자바는 JDBC API를 제공해주지만, 기존 JDBC만을 이용한 방식은 코드가 상당히 길어지고 반복된 코드가 존재할 뿐더러,
SQL의 변경이 필요한 경우에도 자바 프로그램을 수정하기 때문에 유연성이 좋지 못합니다.

Mybatis는 JDBC의 이러한 단점들을 개선함으로 개발자가 작성한 SQL 명령어와 자바 객체를 매핑해주는 기능을 제공하고,
기존에 사용하던 SQL 명령어를 재사용하여 코드의 중복과 무의미한 코드 작성을 생략할 수 있으면서도,
SQL문을 xml 파일에 작성하여 변환이 자유롭고 가독성이 좋습니다.

MyBatis 특징

MyBatis는 다음과 같은 특징을 갖습니다.

- 간단함 : 간단한 persistence framwork. 배우기가 쉽다.

- 생산성 : 62%정도 줄어드는 코드, 간단한 설정

- 성능 : 데이터 접근 속도를 높여주는 Join 매핑(구조적 강점) ,
여러 방식의 데이터 가져오기 전략(가져오기 미루기, SQL줄이기 기법)

- 관심사의 분리 : 설계를 향상 (유지보수성) 리소스를 관리하여 계층화를 지원
(Connection, PreparedStatement, ResultSet)

- 작업의 분배 : 팀을 세분화하는 것을 도움

- SQL문이 어플리케이션 소스 코드로부터 완전 분리

- 이식성 : 어떤 프로그래밍 언어로도 구현 가능

- 오픈소스이며 무료이다.

MyBatis 사용 방식

MyBatis를 이용할 때 SQL문을 사용하는 방식은 크게 3가지로 나뉠 수 있습니다.

1. xml만을 이용한 SQL문을 설정, DAO에서는 XML을 찾아서 실행하는 코드로 작성하기
- 장점 : SQL문은 별도로 xml로 작성되어 SQL문의 수정이나 유지보수에 적합하다.
- 단점 : 개발 시 코드의 양이 많아지고, 복잡성이 증가한다.

2. Annotation과 인터페이스만을 이용하여 SQL문을 설정
- 장점 : 별도의 DAO 없이도 개발가능하여 생산성이 크게 증가한다.
- 단점 : SQL문을 Annotation으로 작성하므로, 수정이 필요할 경우 매번 다시 컴파일 해야한다.

3. 인터페이스와 xml로 작성된 SQL문 활용
- 장점 : 간단한 SQL문은 Annotation으로 / 복잡한 SQL문은 xml로 처리하여 유연성이 좋다.
- 단점 : 개발자에 따라 개발 방식 차이로 인해 유지보수가 중요한 프로젝트에서는 부적합하다.


JPA VS MyBatis 및 각각의 장단점


아래 그림은 구글 트렌드를 이용한 JPA와 마이바티스 중 어떤 것을 더 많이 사용하는지 나타낸 표입니다.

[구글 트렌드]


동아시아를 제외하고 대부분의 나라에서는 JPA를 압도적으로 많이 사용하고 있다는 것을 알 수 있습니다.
그만큼 JDBC를 직접 사용하는 Mybatis보다 JDBC를 노출하지 않고 ORM 기술을 사용하는 JPA를 선호한다는 것을 알 수 있겠습니다.
(각각 장단점이 존재하기 때문에 서비스에 따라 Mybatis를 사용할지 JPA를 사용할지 스스로 결정하는 것이 좋습니다.)

JPA

Java Persistence API의 약자로 Java ORM 기술에 대한 API 표준 명세를 말합니다.
JPA는 단순한 명세이기 때문에 JPA만 가지고는 어떤 구현 기술을 사용할 수 없습니다.
실제로 우리가 사용하는 Repository는 Spring Data JPA로 부터 제공되는 기술입니다.
Spring Data JPA는 JPA를 간편하게 사용하도록 만들어놓은 오픈 소스일 뿐입니다.
이와 비슷한 기술로 다양한 라이브러리가 존재합니다.
그리고 JPA를 사용하다 보면 Hibernate를 많이 사용하게 되는데 Hibernate는 JPA의 구현체라고 할 수 있습니다.
Hibernate 이외에도 EclipseLink, DataNucleus 등 다양한 JPA 구현체가 존재합니다.
그래도 우리가 Hibernate를 사용하는 이유는 가장 범용적으로 다양한 기능을 제공해주기 때문입니다.

장점

  • 1차캐시, 쓰기지연, 변경감지, 지연로딩을 제공하여 성능상 이점을 얻을 수 있다.
  • 코드 레벨로 관리 되므로 사용하기 용이하고 생산성이 높다.
  • 컴파일 타임에 오류를 확인할 수 있다.
  • 데이터베이스에 종속적이지 않으므로 특정 쿼리를 사용하지 않아 추상적으로 기술 구현이 가능하다.
  • 엔티티로 관리되므로 스키마 변경시 엔티티만 수정하게 되면 엔티티를 사용하는 관련 쿼리는 자동으로 변경된 내역이 반영된다.
  • 개발 초기에는 쿼리에 대한 이해가 부족해도 코드 레벨로 어느 정도 커버가 가능하다.
  • 객체지향적으로 데이터를 관리할 수 있다.
  • 부족한 부분은 다양한 쿼리 빌더와 호환하여 보안할 수 있다.

 

단점

  • JPA만 사용하여 복잡한 연산을 수행하기에는 다소 무리가 있다. (로직이 복잡하거나 불필요한 쿼리가 발생할 수 있다.)
  • 초기에는 생산성이 높을 수 있으나 점차 사용하다 보면 성능상 이슈가 발생할 수 있다.(N+1, FetchType, Proxy, 연관관계)
  • 고도화 될수록 학습 곡선이 높아질 수 있다. (성능 이슈의 연장선으로 해결 방안에 따라 복잡한 내부 로직을 이해해야 할 필요가 있다)

 

MyBatis

사실 MyBatis와 JPA는 비교 대상이 되지 않을 수 있습니다.
왜냐하면 JPA는 ORM 기술로 분류되고, MyBatis는 SQL Mapper의 한 종류이기 때문입니다.
MyBatis는 xml과 Annotation을 사용하여 primitive타입과 Map 인터페이스, 자바 POJO 객체를 설정하여
DB record에 사용할 수 있습니다.

장점

  • SQL 쿼리를 직접 작성하므로 최적화된 쿼리를 구현할 수 있다.
  • 엔티티에 종속받지 않고 다양한 테이블을 조합할 수 있다.
  • 복잡한 쿼리도 SQL 쿼리만 작성할 수 있다면 손쉽게 작성할 수 있다.

 

단점

  • 스키마 변경시 SQL 쿼리를 직접 수정해주어야 한다.
  • 반복된 쿼리가 발생하여 반복 작업이 있다.
  • 런타임시에 오류를 확인할 수 있다.
  • 쿼리를 직접 작성하기 때문에 데이터베이스에 종속된 쿼리문이 발생할 수 있다.
  • 데이터베이스 변경시 로직도 함께 수정해주어야 한다.

 

 


참고 :
https://oingdaddy.tistory.com/202#recentComments
https://incheol-jung.gitbook.io/docs/q-and-a/spring/jpa-vs-mybatis

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기