도입
프로젝트를 새롭게 시작하면서, 둘 중 어떠한 기술 스펙을 정하는 것이 더 효율적인가에 대해서 고민하게 되었다. JPA는 1년 전쯤 백엔드 프로젝트를 하면서 다뤄본 적이 있었고, MyBatis는 SSAFY 교육 과정에 포함되어 있어서 새롭게 배웠었다.
그러나 막상 정확하게 어떤 점이 다르고 어떤 점에서 이점이 있는지 설명하려고 하니 입이 턱 막혔다. 팀원들에게 해당 공유하고 제대로된 의사결정을 하기 위해서, 제대로 알아보고 내용을 정리하려고 한다.
JPA, MyBatis 등장 배경
기존에 JDBC를 사용했을 때는 sql문이 코드에 섞여 있었고 만들어 요청하는 과정에서 sql문 생성시 String을 붙이고 자르는 등의 작업이 필요해서 sql문이 조금만 길어져도 번거롭고 관리도 힘들었다. 따라서 코드와 sql문을 분리해서 관리하기 위해서 JPA, MyBatis 등을 사용한다.
MyBatis란 ? (특징)
- JDBC를 좀 더 편하게 사용할 수 있도록 객체를 SQL이나 저장 프로시저와 매핑해주는 퍼시스턴스 프레임워크(persistence framework) 즉, SQL Mapper 이다.
- SQL을 프로그래밍 코드가 아닌 XML로 분리한다.
분리해서 관리하다보니 따로 mybatis-config.xml로 연결도 해야 했는데, 종종 query.xml은 만들고 까먹고 설정을 해주지 않아서 오류가 난 적도 꽤 많았다.
3. SQL문을 자바 메소드와 매핑해줌 → SQL문을 직접 작성해야 함
쿼리를 종류별로 SQL문을 작성하고, .xml 파일로 분리하여 관리했었다.
MyBatis의 장점, 단점
장점]
- 다른 프레임워크에 비해 간단해서 배우기 쉽다. 위에서 사진으로 봤던 .xml파일만 작성할 수 있으면 됐어서 따로 특별한 학습이 많이 이루어지지 않아도 사용할 수 있었다.
- 소스 코드와 SQL의 분리(생산성, 작업 분배 용이)
- 복잡한 SQL을 직접 다룰 수 있다. (함수, 저장 프로시저 등)
단점]
- 반복적인 코드와 CRUD SQL 작업 특별한 로직이 따로 들어가지않은 CRUD작업은 계속해서 복붙형식으로 작업을 했었는데, 꽤나 귀찮은 작업이었다. (ctrl+c, ctrl+v의 반복…)
- SQL과 데이터베이스 벤더에 대 한종속성: 데이터베이스 변경시 로직도 함께 수정해주어야 한다.
JPA란 ? (Java Presistence API)
- Java ORM 기술에 표준 명세이다.
- ORM (Object-Relational Mapping): 자바 객체(Class)와 RDB(Relational DataBase)의 테이블을 매핑한다는 뜻
- JPA의 실제 구현체로는 Hibernate, EclipseLink, Data Nucleus가 있으며 Hibernate가 가장 대중적이고 사실상 표준(de facto)이다.
JPA의 장점, 단점
장점]
- 생산성: Spring Data JPA를 사용하면, interface 선언만으로 쿼리 구현 가능 → 가독성 향상, 코드 작성시간 감소
⇒ 비지니스 로직에 집중가능
JPA를 사용했을 때는 SQL을 작성한 기억이 거의 없다. 사진에서 보다시피 interface만 선언해도 충분히 구현할 수 있었다.
2. 유지보수: 칼럼 추가/삭제 시 직접 관련된 CRUD 쿼리를 모두 수정하는 대신, JPA가 관리하는 모델(Entity)를 수정하면 된다.
3. 데이터 접근 추상화와 벤더 독립성: 데이터베이스 벤더마다 미묘하게 다른 데이터 타입, SQL을 JPA를 이용하면 손쉽게 해결할 수 있다.
자바 코드로 작성하므로 DB벤더를 고려하지 않아도 된다.
단점]
- 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있다.(N+1, FetchType, Proxy, 연관관계)
- JPA를 제대로 사용하려면 알아야할 것이 많아서 학습하는데 시간이 오래 걸린다.
- 다수의 테이블 조인시 신경써야 할게 많다.
JPA vs MyBatis 정리
결론적으로, JPA는 객체 중심의 개발 방식을 지원하며, 개발자가 중복적인 CRUD SQL을 작성하지 않고도 객체를 관리할 수 있다는 장점이 있고,
Mybatis는 SQL을 직접 작성할 수 있어 개발자가 더욱 자유롭게 데이터베이스를 다룰 수 있다는 장점이 있다.
따라서, 프로젝트의 목적과 상황에 따라 적절한 기술을 선택해야 한다. 각각의 장점을 취하기 위해서 혼용하는 것도 하나의 방법이다.
우리 프로젝트에서도 JPA를 사용할지 mybatis를 사용할 지 고민을 해봤는데, 프로젝트 특성상 기능 구현을 빠르게 해야하기 때문에 기본적으로는 JPA를 사용하고, 추후에 복잡한 쿼리를 필요로 하게 되면 그 때 mybatis를 도입할 예정이다.
프로젝트에서 JPA를 쓰기로 확정이 된 이상 다시 JPA에 대해서 공부해야겠다. 전에는 제대로 알지 못하고 기능 구현에만 급급했는데, 이번에는 제대로 알고 써볼 수 있도록 해야겠다. JPA는 써본지 꽤 오래 지나서 사실 잘 기억이 나지 않는 상태인데, 프로젝트 개발시작 전에 어느정도 다시 복습하여 기억을 되살려 나야겠다.
참고 및 출처
한 DB에 Spring JPA와 Mybatis를 동시에 활용하기
잘못된 내용에 대한 피드백은 언제나 환영입니다.
'Backend > Spring' 카테고리의 다른 글
[Spring] 회원 관리 예제 - 웹MVC 개발 (0) | 2022.07.02 |
---|---|
[Spring] 스프링 빈과 의존관계 (0) | 2022.07.01 |
[Spring] 회원 관리 예제 - 백엔드 개발 (0) | 2022.06.26 |
[Spring] 스프링 웹 개발 기초 (0) | 2022.06.25 |
[Spring] 프로젝트 환경설정 (0) | 2022.06.24 |
댓글