[Java] SqlSession, BatchSession의 차이(mybatis 개념과 연결하며)

Hyo Kyun Lee·2024년 11월 6일
0

Java

목록 보기
58/66

1. 개요

대용량 전산처리 로직의 성능 개선 작업을 진행하면서 대용량 처리 작업을 많이 보게 되는데, 이때 대용량 처리가 반드시 배치처리로 이루어지지는 않는다는 것을 알게 되었다.

일전에 대용량 처리를 배치로 작업하지 않는다면 비효율적이고 connection pool 관점에서 낭비이므로, 배치로 이루어지는 것이 효율적이다라는 생각을 가지고 있었다.

  • (mybatis에서) 단순한 for each는 한 row를 전산처리할 때 마다 db connection을 열고 닫는 과정이 계속 발생하며, 일괄처리인 batch session에 비해 비효율적이고 소모적이다.
  • batch는 반복적인 db connection없이, 일괄적으로 다량의 데이터를 전산처리한다. 단순 반복이 아닌 일괄처리의 의미에서 사용 목적을 잘 맞게 활용해야 한다.

하지만 이번에 BatchSession AOP가 없어지고, SqlSession으로 일원화되면서 다시금 대용량 전산처리에 대한 과정을 생각해보게 되었다.

2. AOP

일단 @SqlSession 어노테이션이 가지는 의미를 생각해보자. 결국 이는 AOP를 사용하겠다, 해당 클래스의 메소드를 실행 시 혹은 사용자가 원하는 시점에 부가적이고 세밀한 비즈니스 업무를 수행하겠다는 의미이다.

SqlSession은 스프링이 관리하는 빈에 해당 클래스 혹은 메소드를 관리하겠다는 의미이며, 해당 의존성을 주입받은 클래스 혹은 메소드는 내부 로직을 하나의 트랜잭션으로 인식한다. 따라서 하나의 전산처리 과정이라도 비정상적으로 종료되었을 경우 롤백처리 하며, 내부적으로 다른 SqlSession를 주입받은 클래스나 메소드를 호출하였다면 이는 별개의 병렬적인 트랜잭션 과정으로 인식한다.

AOP, DI 등을 이해한다면 스프링 구조와 객체의 흐름을 이해하는데 매우 용이하므로, 별도로 책과 함께 공부하도록 한다.

3. SqlSession과 BatchSession의 차이점

일단 AA측에서 SqlSession과 BatchSession를 나눌 이유, 즉 큰 차이점을 찾지 못하여서 그런지 BatchSession AOP를 삭제한 것으로 보인다.

SqlSession을 통한 대용량 처리를 한다 -> 비효율적
BatchSession을 통한 대용량 처리를 한다 -> 배치를 통한 대용량 처리 -> 효율적

이 흐름이 아니라,

4. 생각해야할 점

SqlSession과 BatchSession을 구분하지 않고, 용량구분없이 일반적인 처리는 SqlSession으로 진행, 동일하게 용량구분없이 배치 목적의 처리는 별도의 과정으로 진행하는 것으로 바꾼 것 같다.

(*이 부분은 문의해봐야겠다.)

그리고 실제로도 찾아보니까,

지금 배치 처리 몇몇은 SqlSession AOP -> mybatis for each 이런식으로 구현이 되어있는데, 수행연산속도에 대해 분류해놓은 참고자료를 찾아보니 이 조합이 가장 성능이 좋지 못하였다.

대용량 처리의 효율화를 위해 size를 나누어 처리하는 mybatis for-each 방식이 알고보니 성능적으로 좋지 않았던 것이다.

하지만, 개발표준상에서 SqlSession 객체를 생성하여 트랜잭션을 처리하는 것은 connection pool 관리가 안되는 이유로 금지된 상태이므로, 표준을 감안하였을때는 차선책이긴 하였다(자바단에서 for문을 통한 대용량 처리를 하는 것이 가장 성능적으로 안좋았다).

좀 정리가 안되긴 하는데 일단 더 알아보아야 할 부분은,
1) BatchSession 삭제된 이유
2) SqlSession을 통한 대용량 처리 진행 방식
3) SqlSesion이지만 배치 처리 진행 방식, 위와 차이점

그리고 대용량 처리 관련 새롭게 알게된 점,
1) 자바의 for each (for)와 mybatis의 for each는 다르고 성능적으로도 mybatis가 훨씬 우세하다.
2) SqlSesion AOP와 SqlSession을 직접 객체 생성 후 사용하는 것은 역시 성능적으로 다르고, 직접 객체를 생성하는 것이 더 우세하다(아마 AOP는 해당 의존성을 주입받을 시점 전/후에 특정 행동을 지정하는 등의 다소 복잡한 초기화 단계가 있으므로 이 부분에서 느려지는 것으로 추정).

5. 참고자료

SqlSession을 생성하여 mybatis와 연결 - https://gdngy.tistory.com/160
SqlSession / mybatis - https://mybatis.org/spring/ko/transactions.html
대용량 전산처리 작업을 하는 방안과 성능 비교 - https://m.blog.naver.com/minsg1202/221974440751

AOP - https://velog.io/@ann0905/AOP%EC%99%80-Transactional%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://shinsunyoung.tistory.com/133
https://velog.io/@soyeon207/Spring-Filter-Interceptor-AOP

0개의 댓글