SAP 에서 보내오는 정보를 인터페이스 받아 인터페이스 테이블에 저장하고 업무테이블에 옮겨야하는 작업 중에 이미 업무테이블에 있는 건은 update 해야하고 없는 건이면 insert 한 뒤 그 결과의 성공여부를 확인해야했다.
근데 암만 해도 결과값이 -2147482646 이런걸 받아왔다.
역시나 개발자 답게 인터넷 발품을 팔아야했다..
구글에 검색해보면 이런 문제로 고통받는 글로벌한 친구들이 많았다.
그들이 남긴 질문의 답변에 공통을 담긴 내용으로는..


뭔가 Batch가 의심스럽다!
그래서 mybatis-context.xml 을 들어가서 확인해보니

sqlSession 기본값으로 batch가 세팅되어있었다.
이렇게 세팅되어있던걸

이렇게 불러다 쓰고있어서 BATCH가 기본값이었던 것이었다.
근데 일단 이게 정확히 뭔지 모르잖아?
그래서 좀 찾아보기로 했다.
https://velog.io/@frankle97/MyBatis-%EC%9D%BC%EA%B4%84Batch-INSERTUPDATE
스프링 MyBatis 일괄(Batch) 처리 방법
MyBatis 일괄 처리 방법
velog.io
위 블로그의 2번 내용을 보면 내 프로젝트의 mybatis-context.xml 와 동일했다.
SqlSessionTemplate는 인자로 ExecutorType을 포함하는 생성자를 가지고 있다는데.... 뭔소린가 해서 공식문서에서 검색해 보니
https://mybatis.org/mybatis-3/ko/java-api.html
MyBatis – 마이바티스 3 | 자바 API
자바 API 이제 마이바티스를 설정하는 방법과 매핑을 만드는 방법을 알게 되었다. 이미 충분히 잘 사용할 준비가 된 셈이다. 마이바티스 자바 API 는 당신의 노력에 대한 보상을 얻게 할 것이다. JD
mybatis.org

sqlSession 마다 그 특성을 다르게 적용할 수 있는 것으로 보인다.
즉, 기존에 mybatis-context.xml에 설정된 sqlSession bean을 자바단에서 구현하면

이렇게 되는것이다.
이제 어느정도 개념이 잡혔으니 소스를 살짝 수정해보려 한다.

mybatis-context.xml 에 simpleSqlSession 이란 id 를 가진 bean 을 추가해주고

simpleSqlSession 이라는 id 를 가진 bean 을 직접 주입해줄 수 있도록 Qualifier 어노테이션을 통해 주입해줬다.

그리고 insert 하는 sqlSession 을 변경해주고 테스트를 해봤는데!..

이런 에러가 뜬다...
딱봐도 트랜잭션이 걸려있으면 도중에 ExecutorType을 바꾸지 못한다는거 같은데
위에 수정한 자바 서비스소스 앞단에 다른 서비스 파일에서는 batch sqlsession 을 사용하고 있어서 그런것 같다(추측..)
그래서 아예 메소드 내에 새로 선언하기로함.
mybatis-context.xml 에 추가한거 다 지우고

서비스 단에도 SqlSessionFactory만 주입해놓은 뒤

메소드 내부 최상단에 위와 같이 아예 별도로 선언해버렸다.
어플리케이션 전체가 batch로 sqlsession 을 사용해도 이 메소드내부에서는 simple 로 사용가능할거라 예상했다.
그 결과는..?

와 드디어 처리 완료된 행의 숫자를 제대로 받아온다... 오예
이렇게 하나 또 배웠다!
'JAVA' 카테고리의 다른 글
밀리초 4자리까지 가져와서 포맷팅하기 (0) | 2023.11.07 |
---|---|
FTP를 통해 파일 다운로드 (0) | 2023.06.07 |
댓글