
처음 입사했을 때 Mybatis를 사용한다는 차장님 말에 뭘 어디에 Mybatis를 사용한다는 거지...? 의아했었다ㅋㅋㅋ 내 눈에 보이는 UI는 그저 이클립스와 Toad DB 밖에 없었기에... 근데 처음 보는 형식의 SQL문이 입력된 xml 파일의 상단에 Mybatis가 명시되어 있었다. jpa와 비교되는 부분을 정리하며 Mybatis도 하나의 API 종류가 아닐까 생각했다.
1) Mybatis
Mybatis는 개발자가 지정한 SQL, 저장 프로시저 그리고 몇 가지 고급매핑을 지원하는 SQL Mapper이다. JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다. 기존에 JDBC를 사용할 때는 DB와 관련된 여러 복잡한 설정들을 다뤄야 했지만, SQL Mapper는 Java 객체를 실제 SQL문에 연결함으로써, 빠른 개발과 편리한 테스트환경을 제공한다. 데이터베이스 record에 원시 타입과 Map 인터페이스 그리고 Java POJO?를 설정해서 매핑하기 위해 xml과 Annotation을 사용할 수 있다.
장점
- SQL 쿼리를 직접 작성하므로 최적화된 쿼리를 구현할 수 있다.
- SQL 쿼리를 그대로 사용하기 때문에 복잡한 쿼리를 좀 더 수월하게 작성 가능하다.
- SQL의 세부적인 내용 변경 시 좀 더 간편하다.
- 엔티티에 종속받지 않고 다양한 테이블을 조합할 수 있다.
- 동적 쿼리 사용 시 JPA보다 간편한 구현이 가능하다.
단점
- 스키마 변경 시 SQL 쿼리를 직접 수정해야 한다.
- 반복된 쿼리가 발생하여 반복 작업이 존재한다.
- Mapper 작성부터 인터페이스 설계까지 JPA 보다 많은 설계와 파일, 로직이 필요하다.
- 쿼리를 직접 작성하기에, 데이터베이스에 종속된 쿼리문이 발생할 수 있다.
- DBMS를 변경할 경우 수정해야 할 로직이 많다.
- 컴파일 시점이 아닌, 런타임 시점에 오류확인이 가능하다.
2) JPA
JPA는 Java Persistence API의 약자로 Java ORM 기술에 대한 API 표준 명세를 말한다. JPA는 단순한 명세이기 때문에 JPA만 가지고는 어떤 구현 기술을 사용할 수 없다. 실제로 우리가 사용하는 Repository 는 Spring Data JPA로부터 제공되는 기술이다. Spring Data JPA를 간편하게 사용하도록 만들어놓은 오픈 소스일 뿐이다.
장점
- 코드 레벨로 관리되므로 사용하기 용이하고 생산성이 높다.
- 데이터베이스에 종속적이지 않으므로 RDB 종류와 관계없이 추상적으로 기술 구현이 가능하다.
- DBMS 변경이나 코드 재사용에 용이하다.
- 기본적인 CRUD 제공과 페이징처리 등 상당 부분 구현되어 있어 비지니스 로직에 집중할 수 있다.
- 테이블 생성, 변경 등 엔티티 관리가 간편하다.
- 개발 초기에는 쿼리에 대한 이해가 부족해도 코드 레벨로 어느정도 커버가 가능하다.
- 별도로 쿼리 작성에 신경쓰지 않아도 돼서 빠른 개발이 가능하다.
- 1차 캐시, 쓰기지연, 변경감지, 지연로딩을 제공하여 성능 상 이점을 얻을 수 있다.
- 엔티티로 관리되므로 스카마 변경 시 수정하게 되면 엔티티를 사용하는 고나련 쿼리는 자동으로 변경내역이 반영된다.
- 객체지향적으로 데이터를 관리할 수 있다.
- 컴파일 타임에 오류를 확인할 수 있다.
단점
- 학습 난이도가 높다.
- JPA만 사용하여 복잡한 연산을 수행하기에는 다소 무리가 있다.
- 초기에는 생산성이 높을 수 있으나, 점차 사용하다 보면 성능상 이슈가 발생할 수 있다.
- 고도화될수록 학습 곡선이 높아질 수 있다.
- 단방향, 양방향, 임베디드 관계 등 이해해야 할 내용이 많으며, 연관관계 이해 없이 잘못 코딩했을 시 성능상의문제와 동작이 원하는대로 되지 않는 일이 발생한다.
트렌드와 나의 생각
세계적으로 Mybatis보다는 JPA를 사용하는 국가가 훨씬 많다. 나는 아직 JPA를 사용해본 적이 없어 어떤 편리함과 이점이 있는지 와닿지 않지만 이토록 많은 국가에서 사용하는 데는 분명 이유가 있지 않을까 싶어 JPA에 대한 궁금증이 높아졌다. 각각의 이점이 존재함에 따라 JPA와 Mybatis를 혼용하여 사용하는 곳도 많다고 하니 JPA도 공부해두는 것이 좋을 것 같다.
REFERENCE
https://blog.naver.com/seek316/222664026334