JPA vs Mybatis, 현직 개발자는 이럴 때 사용합니다.

개발 테크
2024. 01. 26
조회수
8,559

jpa

웹 애플리케이션을 위한 백엔드로 가장 많이 사용되는 프레임워크로는 Java 기반의 Spring 또는 Springboot를 사용합니다. Spring은 대규모 기업환경에서 안정성과 신뢰성이 검증된 프레임워크이기 때문이며, 많은 기업에서 스프링을 사용하여 안정적인 서비스를 운영하고 있습니다

이때, 백엔드에서 데이터를 저장하고 조회하려면 데이터베이스를 활용해야 하는데, 백엔드에서 데이터베이스를 사용하는 프레임워크로 가장 많이 쓰이는 기술이 ‘Mybatis’‘JPA’입니다. 

Java 기반의 Spring 또는 Springboot에서 데이터베이스를 사용하려면 두 가지 기술 중 하나를 사용해야 하기 때문에 Java 백엔드 개발자는 ‘Mybatis’ ‘JPA’를 반드시 알아야 합니다

데이터 베이스 접속을 편하게 사용하기 위해 SQL Mapper 기술과, ORM(Object Relational Mapping) 기술을 제공합니다. 둘 다 DB와의 연동, 저장을 위한 기술이며, SQL Mapper는 ‘개발자가 작성한 SQL 실행 결과를 객체에 매핑’시켜주는 프레임워크이며, ORM은 객체와 DB의 데이터를 ‘자동으로 매핑’시켜주는 프레임워크를 말합니다.

SQL Mapper 기술을 제공하는 것이 ‘MyBatis’이며, ORM 기술을 제공하는 것이 ‘JPA(Java Persistence Api)’입니다. 두 가지 기술은 모두 데이터를 관계형 데이터베이스에 저장, 즉 영속화(Persistence) 시킨다는 측면에서는 동일하지만, 서로 다른 접근 방식을 채택하고 있습니다.

그렇다면 데이터베이스를 효율적으로 사용하기 위해 JPA와 Mybatis를  언제, 어떻게 사용하며, 장단점은 무엇인지 탄생 배경과 함께 대한민국 No.1 IT 인재 매칭 플랫폼 이랜서에서 알려드리겠습니다!



 

MyBatis란?

spring-data-jpa

MyBatis 프레임워크는 반복적인 JDBC 프로그래밍을 단순화하여, 불필요한 Boilerplate 코드를 제거하고, Java 소스코드에서 SQL 문을 분리하여 별도의 XML 파일로 저장하고, 이 둘을 서로 연결시켜주는 기능을 제공합니다.

 

 

MyBatis의 특징

 

Java 코드와 SQL 매핑

MyBatis를 사용하면, MyBatis 내부에서 그러한 Boilerplate 코드가 구현되어 있고, MyBatis에서 Java 메소드와 SQL 간에 매핑을 시켜서 개발자는 Java 메소드 선언과 SQL 문만 만들면 MyBatis가 자동으로 그 둘 간을 연결시켜 주게 됩니다. 

SQL 문장이 Java 코드 내에 들어가 있어서 수정하기도 힘들고, 보기도 힘들었는데, SQL 문을 별도로 Java 코드에서 분리해두어서 관리가 편하게 하였으며, 분리된 SQL 문을 MyBatis가 찾아서 실행해 주는 기능을 합니다.

jpa-란

MyBatis 프레임워크는 반복적인 JDBC 프로그래밍을 단순화하여, 불필요한 Boilerplate 코드를 제거하고, Java 소스코드에서 SQL 문을 분리하여 별도의 XML 파일로 저장하고, 이 둘을 서로 연결시켜주는 기능을 제공합니다.


 

MyBatis의 특징

 

Java 코드와 SQL 매핑

MyBatis를 사용하면, MyBatis 내부에서 그러한 Boilerplate 코드가 구현되어 있고, MyBatis에서 Java 메소드와 SQL 간에 매핑을 시켜서 개발자는 Java 메소드 선언과 SQL 문만 만들면 MyBatis가 자동으로 그 둘 간을 연결시켜 주게 됩니다. 

SQL 문장이 Java 코드 내에 들어가 있어서 수정하기도 힘들고, 보기도 힘들었는데, SQL 문을 별도로 Java 코드에서 분리해두어서 관리가 편하게 하였으며, 분리된 SQL 문을 MyBatis가 찾아서 실행해 주는 기능을 합니다.

spring-jpa

 

동적 SQL 생성 기능

MyBatis는 Boilerplate 코드 제거 및 SQL 문 분리 외에도 동적인 SQL(Dynamic SQL) 생성 기능을 제공하여 프로그램 실행 중에 입력되는 파라미터에 따라 서로 다른 SQL 문을 동적으로 생성해 내는 기능을 제공해 줍니다.

동적으로 SQL 문이 생성된다는 의미는 검색 조건같이 사용자가 입력하는 값에 따라 서로 다른 SQL 문장이 생성되어 실행된다는 의미입니다. 예를 들어, 게시판 테이블을 검색할 때, 사용자가 작성자만 입력하여 검색하면 작성자가 WHERE 절에 있는 다음의 SQL이 생성되고,

  • SELECT * FROM BOARD WHERE AUTHOR = ‘파라미터’

     

제목을 입력하여 검색하면 다음과 같이 제목을 검색하는 SQL이 만들어진다는 의미입니다.

  • SELECT * FROM BOARD WHERE TITLE LIKE ‘%파라미터%’

     

MyBatis 내에 if 문, choose, when, otherwise, foreach 등의 문법을 지원해서 동적인 SQL 문 생성이 가능합니다. 아래 예시에서는 title 파라미터를 입력받게 되면 SQL 문이 아래와 같이 생성되고,

  • SELECT * FROM BLOG WHERE state = ‘active’ AND title like #{title}

 

title 파라미터 없이 호출이 되는 경우엔, 아래와 같이 title 조건이 없는 SQL 문이 생성됩니다.

  • SELECT * FROM BLOG WHERE state = ‘active’
  •  

jpa-builder
 

MyBatis는 개발자가 작성한 SQL 문을 Java 객체로 자동으로 매핑 시켜주는  프레임워크입니다. 그렇다면 JPA는 어떤 기술일까요?

JPA는 이보다 한발 더 나아가서 SQL 문까지 자동으로 생성해 주고, DB 데이터와 Java 객체를 매핑 시켜주는 기술입니다. SQL 문장 작성이 필요 없으니 MyBatis보다 한 단계 더 자동화되어 더 편리함과 반복작업을 없애줍니다.



 

JPA(Java Persistence API)란?

jpa-findall

JPA(Java Persistence API)는 Java 객체와 관계형 데이터베이스 간의 매핑을 위한 API입니다. JPA는 ORM(Object-Relational Mapping)을 구현하는 자바 표준 스펙으로, 개발자가 객체지향 프로그래밍 언어에서 사용하는 객체 모델과 관계형 데이터베이스의 테이블 간의 매핑을 자동으로 처리해 줍니다.

 

JPA가 생겨난 이유

그런데, MyBatis와 같이 SQL 문과 Java 코드를 연계하는 접근 방식이 아니라 Java 객체와 DB 엔티티(테이블) 자체를 그대로 매핑해서 처리할 수 있는 접근 방식을 채택한 새로운 기술표준이 등장했는데, 이것이 바로 ‘JPA(Java Persistence API)’입니다.

데이터베이스는 데이터 중심의 구조를 가지고 있고, Java는 객체지향적인 구조로 관리되기 때문에 둘 사이에 데이터를 직접적으로 쉽게 가져오거나 쉽게 저장하는 방법이 존재하지 않았습니다. 이 둘 사이를 손쉽게 변환이 된다면 개발이 용이해질 것입니다. 

JPA의 접근 방식은 이런 ORM(Object-Relational Mapping) 기술을 의미합니다. 즉, 객체와 데이터베이스 간의 매핑 기술을 의미하며, Java 개발자가 좀 더 객체지향 관점에서 개발할 수 있게 하고, 개발을 용이하게 해주어서 DB와 Java 간의 불일치를 해소해 줍니다.

이해를 돕기 위해 ORM 기술을 좀 더 구체적으로 살펴보겠습니다. 아래 그림에서 보면 Java 객체인 Student 클래스가 ORM 매핑을 통해서 DB 테이블에 영속화(Persistence) 되고, 또다시 영속화된 데이터가 다시 Java 객체로 변환하는 과정을 나타내고 있습니다. ORM은 이렇게 Java객체를 DB 테이블로 자동으로 영속화 시켜주는 기술을 의미합니다.

 

spring-boot-jpa

이러한 ORM 기술을 실제 구현해서 만들어진 프레임워크가 Hibernate입니다. JPA 스펙을 구현한 기술은 Hibernate 외에도 EcliseLink, DataNucleus 등이 있지만, 현재 사실상 표준(de facto standard)으로 널리 사용되는 것은 Hibernate입니다.

jpa-join

Java와 DB 데이터 간의 매핑을 자동화해주어서 개발자는 SQL 문을 작성할 필요가 없어지고, DB가 바뀌어도 DB에 따라 새로운 SQL을 작성할 필요가 없이 Hibernate에서 DB에 맞는 적합한 SQL 문을 생성해 줍니다.


 

 

JPA 특징

MyBatis와 다르게 SQL 문의 작성이 불필요하며 ORM 내부적으로 java 메소드에 적합한 SQL 문이 자동으로 생성이 되어 실행되게 됩니다. Java 개발자는 클래스만 만들어서 사용하고, ORM 프레임워크가 자동으로 관련된 SQL을 만들어 줍니다. 

즉, Java 개발자는 jpa.persist(member)라고 사용하면, Insert SQL 문이 자동으로 생성되어 DB에 저장이 됩니다.

jpa-query

또한,  jpa.find(memberId)라고 사용하면, 자동으로 Select SQL 문이 자동으로 생성되어 DB에 조회가 됩니다.

mybatis-foreach

MyBatis와 JPA 모두 DB를 사용할 때 번거로운 반복작업을 없애줍니다. MyBatis는 SQL 문을 Java와 분리하여 별도 파일로 관리할 수 있어서, SQL 개발과 유지 보수에 용이하고, JPA는 SQL 문을 아예 만들 필요가 없기 때문에 더욱 자동화되고 반복작업을 더욱 줄여줍니다.



 

Mybatis vs JPA 비교 및 장단점

두 가지 기술 모두 현재 현업에서 모두 많이 사용되고 있는 기술입니다. 그러면 어떤 기술이 더 많이 검색되고 있는지 ‘구글 트렌드’를 통해서 확인해 보겠습니다.

spring-boot-mybatis

전체적으로는 JPA가 MyBatis 보다 더 인기 있고, 더 많이 사용되는 기술이지만, 한국과 중국은 MyBatis가 JPA보다 더 많이 사용되고 있습니다.

springboot-mybatismybaatis-차이

그 이유는 정부의 표준 프레임워크로 사용되는 전자정부 프레임워크가 MyBatis를 사용하기 때문에 전통적으로 MyBatis가 DB 연동 기술로 많이 사용되어 왔습니다. 하지만, 최근에는 인터넷 서비스 기업과 스타트업 기업을 중심으로 JPA 기술을 기반으로 서비스를 하는 기업이 늘어나고 있습니다.

MyBatis와 JPA의 사용시기를 알기 위해 주요 차이점과 장, 단점을 비교해 보겠습니다. MyBatis와 JPA의 주요 차이점과 장단점을 비교하면 다음과 같습니다.

 

 

MyBatis 장점 

jpa-mybatis

 

SQL 직접 제어

MyBatis는 SQL에 대한 직접적인 제어를 제공하므로, 개발자가 SQL을 직접 작성하고 최적화할 수 있습니다. 또한 복잡한 쿼리 또는 특정 데이터베이스에 최적화된 쿼리 작성이 필요한 경우에 적합합니다.

 

학습 용이성

 SQL을 잘 아는 경우에, JPA에 비해 학습이 용이하고 쉽게 사용이 가능합니다. SQL을 직접 제어할 수 있다는 것은 DB에 적합한 성능 좋은 SQL문을 만들어서 사용할 수도 있고, 또, 통계/분석용 데이터 추출을 위해 복잡한 쿼리를 만들어야 하는 경우에 자유롭게 테이블 간 JOIN 등을 통해서 원하는 데이터를 추출할 수 있어서 좋습니다.


 

MyBatis 단점 

spring-data-jpa

 

CRUD 단순 작업에 반복 수작업 필요

SQL을 직접 만들어야 하므로 CRUD 같은 기본적인 코드에 대해서 단순한 코드를 계속 만들어야 하는 불편한 점이 있습니다. 단순한 코드를 반복해서 만들면 개발 생산성이 떨어지고, 코드에 대한 유지보수도 힘들어집니다.

 

데이터베이스에 종속적

특정 DB를 기준으로 SQL 문이 작성되어 있어서, DB를 변경하려면 SQL 문을 전체 다 확인 후 수정해야 합니다.

 

 

JPA 장점

jpa-native-query

 

표준화된 인터페이스

JPA는 자바에서의 ORM을 위한 표준 인터페이스를 제공합니다. Hibernate, EclipseLink, Apache OpenJPA 등의 구현체가 JPA 표준을 따릅니다.

EclipseLink, Apache OpenJPA 등의 구현체가 JPA 표준을 따를 경우 어떤 것이 좋은 건가요? EclipseLink, Apache OpenJPA가 JPA 표준을 따르기 때문에 좋은 것이 아니고 JPA가 자바 표준 기술이기 때문에 다른 프레임웍들이 표준을 따라 만들어진 것입니다. 

Java의 표준을 이용하므로 특정 제품에 종속되지 않고, 개발자 간에 협업이 용이하고, 일관된 방식으로 개발을 할 수 있습니다. 
 

자동 매핑으로 개발 및 유지보수성 향상

JPA는 객체와 데이터베이스 간의 자동 매핑을 지원합니다. 개발자가 별도의 SQL 작성 없이도 데이터베이스와 객체 간의 매핑이 이루어집니다.

 

객체 지향적인 접근 지원

JPA는 객체 지향적인 개발에 중점을 둡니다. 테이블 간의 연관 관계와 객체 간의 연관 관계를 쉽게 다룰 수 있습니다.
 

 DBMS에 독립적

사용하는 DB 종류에 관계없이 JPA에서 자동으로 적합한 SQL Dialect(방언)를 만들어 주기때문에, DB가 변경되어도 SQL 문을 다시 작성할 필요가 없습니다. DB 마이그레이션을 해야 할 경우에 MyBatis로 개발된 시스템과 비교하면 손쉽게 설정 변경만으로 DB 변경이 가능합니다.


 

JPA 단점

jpa-one-to-many

 

높은 학습곡선

JPA 관련 다양한 스펙과 작성법(@Entitity, @Table, @Column, @Id, @OneToMany, @ManyToOn)을 학습해야 하고, 또 JPA 적용으로 생기는 다양한 이슈, 즉시 로딩(EAGER LOADING), 지연 로딩(LASY LOADING), 영속성 전이(CascadeType), 복합키 매핑(@EmbededId, @IdClass) 등에 대한 해결 방법을 익혀야 합니다. MyBatis에 비해 배우기가 어렵습니다.
 

복잡한 SQL 생성의 어려움

일반적으로 시스템을 개발하면 단순한 CRUD와 같은 기능도 많이 있지만, 통계 또는 분석과 같은 화면과 기능도 개발이 필요합니다. 이때는 복잡한 쿼리를 만들어야 하는데 여러 테이블을 Join 해서 데이터 결과를 가져와야 하는 경우에, JPA로는 복잡한 쿼리를 만드는 데 용이하지 않습니다. 

직접적인 SQL 작성을 통해서 복잡한 쿼리를 만들어야 하는 경우, JPA와 같이 자동으로 만들어지는 SQL로는 원하는 결과를 정확히 얻기가 힘든 경우가 많습니다.

 

성능에 대한 고려 필요

 JPA에 의해 자동으로 SQL이 만들어지다 보니, DB의 특성(index, join 등)을 이해하고 DB에 맞는 SQL을 직접 튜닝해서 만들면 성능이 훨씬 뛰어날 수 있으나, 자동화된 SQL 문으로 인해서 데이터 조회 성능이 떨어질 가능성이 있습니다. 

일반적인 간단한 CRUD에는 큰 문제가 없으나, 데이터가 많아지고, 테이블 간 Join이 많아지는 경우, SQL 문을 어떻게 튜닝하는 가로 인한 성능이 크게 차이가 날 여지가 있으므로, JPA 사용 시 이러한 부분을 주의해서 고려할 필요가 있습니다.

 

 

Mybatis는 이럴 때, JPA는 이럴 때 사용하세요.

jpa-mybatis-혼용

그러면 둘 사이의 선택 기준은 어떻게 하는 것이 좋을까요?  MyBatis와 JPA는 DB와 Java 프로그램간의 데이터 저장, 조회를 위해 사용되지만, 각각의 특징과 사용 시나리오에 따라 선택해야 합니다.

복잡한 쿼리와 SQL 제어가 필요한 경우는 MyBatis로 개발할 수 있습니다. 기존 SQL 경험이 풍부하거나, 특정 데이터베이스에 최적화된 SQL 작성이 필요한 경우는 MyBatis를 선택할 수 있습니다.

간단한 매핑 및 객체 지향적인 접근이 필요한 경우는 JPA가 SQL작성 등의 반복적인 부분을 해결해 줍니다. 표준화된 인터페이스와 자동 매핑이 중요하며, 다양한 데이터베이스에 대응해야 하는 경우는 JPA를 선택하면 DB가 변경되더라도 DB에 종속되지 않고 손쉽게 Migration이 가능합니다.

물론, 실제 선택은 프로젝트의 특성, 개발자의 선호도, 팀의 스킬셋 등을 고려하여 이루어져야 합니다. MyBatis 또는 JPA 중 하나를 선택하거나 때로는 두 기술을 혼용하여 사용하는 것도 가능합니다. 백엔드 개발을 위한 MaBatis와 JPA 전문가를 찾으신다면 대한민국 No.1 IT 인재 매칭 플랫폼 이랜서에 프로젝트를 등록하고 데이터로 검증된 MaBatis와 JPA 전문가를 매칭 받으세요.


 

‘MyBatis’ ‘JPA’를 활용하여 

서버를 유기적으로 활용할

Java 백엔드 개발자’가 필요하신가요? 

 

이랜서에 프로젝트를 등록하고Java 전문가’를 매칭 받으세요!


 

대한민국 No.1 IT 인재 매칭 플랫폼 이랜서는?

mybatis-jpa

이랜서는 데이터를 바탕으로 ‘전문성’‘인성(협업 능력)’ 모두 검증된 IT 프리랜서를 매칭하는 No.1 IT 프리랜서 매칭 플랫폼입니다.

MyBatis와 JPA, SQL을 활용해 서버를 관리하는 백엔드 개발자부터 React, React Native, Vue, JavaSciprt, TypeScript, Node js, Nextjs 등을 활용해 웹을 개발하는 프론트엔드 개발자와 소프트웨어의 고객 경험을 향상시킬 ‘서비스 기획자’, 프로그램의 매력을 더해줄 UX/UI 디자이너와 웹/ 앱 디자인을 위한 전문 디자이너 약 40만 명의 IT 전문가가 등록되어 있습니다.

mybatis-란

 

“철저하게 데이터로 

검증된 맞춤형 IT 전문가 매칭

이력서만 확인하고 추천하는 타 채용 플랫폼과는 다릅니다.”

 

이랜서에서 매칭하는 IT 프리랜서는 현장에 바로 투입 가능한 전문가입니다. 이랜서는 IT 전문가 채용 시 어려움을 겪는 기업들의 문제를 해결하기 위해 약 1.5억 개의 사용자 데이터와 350만 개의 프리랜서 평가 데이터를 활용해 IT 프리랜서의 ‘전문성’ ‘인성(협업 능력)’ 모두 검증된 IT 프리랜서를 매칭합니다.


mybatis-config


 

프로젝트 개발을 위한 1:1 맞춤형 서비스

1:1 매니저 배정을 통해 필요한 인력을 원하는 시기에 매칭합니다.

 

이랜서는 프로젝트 개발이 바로 진행될 수 있도록 최적합 IT 프리랜서를 매칭합니다. 기업의 성향과 요구사항을 모두 맞추기 위해 프로젝트 등록 후 1:1로 매니저를 배정하고, 원하는 조건을 확인하여 프로젝트 등록 후 24시간 이내 데이터로 검증된 IT 전문가를 매칭합니다.



 

 MyBatisJPA를 활용해 서버를 유기적으로 관리할

Java 개발자를 찾으시나요?

 

대한민국 No.1 IT 인재 매칭 플랫폼 이랜서

-> 회원 가입만 하세요.

-> 24시간 안에 전담 매니저가 연락을 드립니다.

-> 끝입니다. 이게 다냐구요? 네, 이게 다입니다.

-> 급하시다고요? 전화 주세요. 02-545-0042

 

24년의 노하우 데이터를 바탕으로 검증된 IT 프리랜서를 매칭해 드립니다.

 

freelancerBanner
projectBanner
댓글0
이랜서에 로그인하고 댓글을 남겨보세요!
0
/200
이랜서에 로그인하고 댓글을 남겨보세요!
0
/200
실시간 인기 게시물
이랜서 PICK 추천 게시물