2022년까지의 프로젝트와 2023년의 프로젝트를 비교했을 때 새롭게 적용했던 부분은 기존에 사용하던 Mybatis 대신 JPA + QueryDSL를 사용했다는 점입니다. 해당 기술들을 사용하면서 느꼈던 점과 장단점을 정리해 보려고 합니다.
Mybatis의 시작.
회사에 입사하고 나서 기존 프로젝트가 Mybatis를 사용하고 있어서 처음 시작을 하게 되었습니다. SQL 문법만 알면 SQL문을 직접 작성할 수 있고 xml 파일로 분리되어 있어서 SQL문 변경이 있을 경우는 자바 코드수정하지 않고, SQL만 수정해서 바로 반영할 수 있는 편리함이 있었습니다. 더 나아가 Subquery, Join, Union등 복잡한 조건의 쿼리문을 쉽게 작성했었습니다.
//로직이 담겨있는 SQL문
with sample_today_data as (
select today_value, today_date, cat_id
from t_today_avg_data
where today_date >= to_char(now(), 'yyyyMMDD')
and today_value > 0
)
select s1.today_value, s1.today_date, s2.cat_nm
from sample_today_data s1
join (
select c1.cat_id, c2.cat_nm, c2.cat_def_value
from sample_cat_data c1
join sample_def_data c2
on c1.cat_id = c2.cat_id
where c1.cat_nm like 'sample%'
) s2
on s1.cat_id = s2.cat_id
...
그러다 보니 쿼리에 로직이 담겨있어 유지보수 할 때 쿼리문을 바꾸는 데 시간이 걸리고 힘들었습니다. 또한 쿼리문이 복잡한 경우는 재활용하기가 어려웠습니다. Postgresql 에서 MSSQL로 DB를 변경했을 때, DB에종속된 쿼리문들을 수정해야 했습니다.
//Postgresql 문법이 적용된 SQL문
SELECT NOW();
//MSSQL 문법으로 변경
SELECT GETDATE();
JPA는 어떨까?
2023년 프로젝트는 JPA(+QueryDSL)를 사용해 보기로 했습니다. 이번 프로젝트는 복잡한 쿼리문을 사용하지 않아도 되고, 누구나 사용할 수 있는 웹을 만들기 때문입니다. 사실, 자체 서비스를 제공하는 회사에서 많이 사용하는 개발 생산성, 유지보수 강점인 JPA를 사용해 보고 싶어서 선택하게 됬습니다. (DB 중심의 개발이 객체 중심 개발의 필요성을 느꼈기 때문입니다) Mybais와 다르게 학습하고 적용하는 데 확실히 오래 걸렸습니다. 양방향, 영속성 등 JPA의 특성을 학습하는데 시간을 많이 투자해야 했습니다.
Entity를 기반으로 DB 간의 매핑을 자동으로 해줘서 스키마 변경할 때 Entity만 수정하면 되는 편리함이 있었습니다. 직접 SQL문을 작성하지 않고 JPA에서 메소드 명으로 간단한 CRUD(Create, Read, Update, Delete) 작업을 할 수 있습니다.
그러나 JPA는 복잡한 쿼리, 동적 쿼리, 페이징 등을 만드는 데 한계가 있었습니다. 이 부족한 부분을 QueryDSL로 채웠습니다. 무엇보다 좋았던 것은 문자가 아닌 코드로 SQL문을 작성하기 때문에, 컴파일 시작에 오류를 확인할 수 있다는 점입니다. Mybatis는 런타임시에 오류를 확인할 수 있었기 때문입니다.
//join 활용
//BooleanExpression을 활용해 동적인 조건문 사용
queryFactory.select(userInfo.userId, userInfo.userId.count())
.from(userInfo)
.leftJoin(projectList)
.on(userInfo.userId.eq(projectList.userId))
.where(eqUseYn(param.get("useYn")),
eqUserType(param.get("auth")))
.groupBy(projectList.projectType)
.fetch();
느낀 점
JPA 적용 시, SQL문에 있던 로직을 JAVA 코드로 옮기면서 로직 작성할 때 끊김없이 쭉 작성할 수 있었습니다. 쿼리에 시간을 보내는 게 아니라 내가 짜는 코드에 시간을 쏟을 수 있어서 무엇보다 좋았습니다. 그리고복잡한 쿼리문은 Mybatis가 JPA보다 편하고 수정하기 편했지만, SQL문에서는 데이터를 뽑아오고 로직에서데이터 가공을 하는 형식으로 바꾸면서 로직에 집중했고, JDBC에서 직접 구현하거나 @Query를 사용해 JPA에서 사용하는 방법도 있었지만 직관적이지 못하고 문자열로 작성해야 하는 불편함도 있어서 꼭 필요한 경우에만 사용했습니다.
Mybatis와 JPA의 장단점이 확실히 있어서 담당할 프로젝트에 적합한 기술을 사용하면 좋을 것 같습니다. 필요시에는 둘 다 사용하면 될 것 같습니다. 아직 JPA를 깊게 써보지 않은 것 같아서, 리팩토링 하면서 추가로 포스팅을 하겠습니다 :)
'Java > Java' 카테고리의 다른 글
[Java] 제네릭의 이해1 (0) | 2024.04.30 |
---|---|
[공통] 자바 네이밍 규칙 (0) | 2024.04.25 |
[Java] 자주 사용하는 Stream 정리 (1) | 2024.03.15 |
[Java] 객체지향프로그래밍(OOP) / SOLID 원칙 이란? (1) | 2024.02.16 |
[JAVA] .toString() String.valueOf() 차이점 (0) | 2021.03.06 |