𝑾𝑬𝑩/𝑆𝑃𝑅𝐼𝑁𝐺

JPA 와 MyBatis 의 차이 (ORM, SQL Mapper)

기누 2022. 11. 17. 23:13

저번 달, 생애 처음으로 봤던 한 기업의 면접에서 이런 질문을 받았다. 'JPA와 MyBatis의 차이를 설명해줄 수 있나요?'

나는 프로젝트에 JPA를 사용했었고, 그에 따라온 꼬리 질문이었다. 면접 전 JPA와 MyBatis의 차이에 대해서 준비를 하고 갔음에도 불구하고, 막상 면접을 하니 '내가 이해한 정도' 의 차이점만 말할 수 있더라. 그래서 오늘 이 기회에 JPA와 MyBatis에 대해 더 자세히 정리해보고자 한다.

 

JDBC

먼저 JPA 와 MyBatis 를 얘기하기 전에, MyBatis 이전에 사용되었던 JDBC에 대해 간단히 정리해보자. 자바에서는 자바를 이용해서 DB를 사용하기 위해 기본적으로 JDBC 라이브러리가 제공되었다. 하지만 JDBC는 가독성이 떨어지고 반복적인 코드가 만들어질 수 있으며, 쿼리문의 변경이 필요한 경우에도 자바 프로그램을 수정하기 때문에 작업이 불편하다. 그리고 이러한 JDBC의 단점을 보완해 나온 것이 MyBatis 이다. 

 

SQL Mapper 

SQL Mapper 는 개발자가 작성한 SQL 문을 이용하여 RDB에 접근, 그 결과를 객체(Object)화 시켜 사용하게 해주는 기술이다. 

RDB에 따라 문법이 다르기 때문에 특정 RDB에 종속적이다. 

 

ORM

ORM  Object Relation Mapping 의 약자로, 객체(Object)와 데이터베이스(DB)의 테이블을 Mapping(연결)을 통해, RDB 테이블을 객체 지향적으로 사용하게 해주는 기술이다.

즉 객체와 RDB를 별개로 설계하고, 객체와 RDB 그 중간에서 매핑을 해주는 것이 ORM이다. 

ORM은 SQL Mapper 와 다르게 SQL 문이 아닌, RDB 데이터 그 자체와 매핑하기 때문에 SQL 문을 직접 작성할 필요가 없다. 그리고 이로인해 MySQL, Oracle 과 같은 어떤 RDB를 사용해도 상관 없는 것이다. 

 

MyBatis (SQL Mapper)

MyBatis는 SQL Mapper의 한 종류로, 개발자가 작성한 SQL 쿼리문과 자바 객체를 Mapping 해주는 기능을 제공한다. 즉, JDBC로 처리하는 상당부분의 코드와 파라미터 설정값 및 결과 매핑을 대신 해준다.

 

😃 ) 존에 사용한 쿼리를 재사용하여 코드의 중복을 생략할 수 있게 하면서 SQL 문을 xml 파일에 작성해 변환이 자유롭고 SQL 문의 수정이 용이하다는 장점이 있다.

 

🙁 ) 하지만 이것은 다시말해 개발자가 SQL 코드를 작성하고, 결과를 객체와 매핑하는 것 까지 모두 직접 처리해야한다는 것이다. 또한 RDB에 따라 문법이 다르기 때문에 특정 RDB에 종속적이다. 테이블 또는 DTO가 변경될 때 마다 Mapping 에 관련된 부분을 계속해서 수정해야 하기 때문에 유지 보수에 취약하다는 것 또한 MyBatis의 치명적인 약점이다.

 

JPA (ORM)

JPA 는 Java Persistence API의 약자로, 여러 ORM 기술의 표준이며, 구현되지 않은 인터페이스를 모아둔 것이다. 대표적으로 Hibernate를 예로 들 수 있다.

 

😃 ) JPA에서는 설정에 따라 Mapping된 객체를 바탕으로 엔티티에 맞는 테이블을 자동으로 만들어준다. 또한 MyBatis의 경우, 데이터를 수정할 경우 DTO와 함께 수정해야하는 반면, JPA는 객체만 수정하면 된다. 즉, 객체 중심으로 개발이 가능하고, 위의 ORM에서 설명한 것과 같은 이유로 특정 DB에 종속적이지 않다. 또한 Spring Data JPA에서는 CRUD 메소드 및 쿼리 메소드를 기본으로 제공되기 때문에 쿼리를 따로 만들지 않아도 된다. 그러므로 유지 보수가 간편해진다는 장점도 자동적으로 따라오게 된다. 

 

🙁 ) 단점으로는, 먼저 어렵다! 양방향, 단방향, 임베디드 관계 등 이해해야할 내용이 많다. 그리고 복잡한 쿼리의 경우, JPA를 이용해서는 해결이 어려울 때도 있다. 하지만 이런 경우에 MyBatis를 이용하기보다, QueryDSL 이라는 오픈소스를 이용하면 된다!

 

 

JPA VS MyBatis 

여러가지 장점들을 고려했을 때 JPA 를 이용하는 것이 권장된다. MyBatis는 실제로 레거시 프로젝트에서 많이 쓰이고 있고, JPA의 이용 추세는 점점 증가하고 있다. 실제로 김영한님의 강의에 따르면 실제로 거래량이 많은 대형 서비스에서는 JPA를 사용하는 추세라고 한다.

 

이제는 낡아버린 기술인 MyBatis를 보내주자 ...

 

JPA와 MyBatis의 차이를 정리해보면서, JPA의 장점을 더 자세히 알게되는 시간이었다. 앞으로 개발을 한다면 MyBatis를 사용하지 말고, JPA만 이용해서 프로젝트를 진행해보자!

 

 

 

[참고]

https://dreaming-soohyun.tistory.com/entry/JPA%EC%99%80-MyBatis%EC%9D%98-%EC%B0%A8%EC%9D%B4-ORM%EA%B3%BC-SQL-Mapper  

https://mangkyu.tistory.com/20