본문 바로가기
JAVA

Mybatis insert, update, delete 결과가 음수인 경우

by ez.pang 2023. 10. 30.

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

댓글