[PersonaAI - 비공개 프로젝트 d] myBatis useGeneratedKeys 안될때
회사 솔루션에 새로 들어갈 기능 일부를 맡아서 개발을 시작했다.
내가 맡은 부분은 트리구조로 사용자가 사내 on-premise로 운영중인 서버 내의 NAS 서버 디렉토리 안에 디렉토리를 자유롭게 생성하고 파일을 저장하고 그 파일을 RAG에 자동으로 Embedding 시키는 것 까지가 내 역할이었다.
순조롭게 개발되다가 예상치 못한 부분에서 막혀버렸다.
하지만 파일 저장 후 Embedding을 하는데 예외처리를 하면서 실패/성공 사유를 로그로 쌓으려고
DB에 저장된 파일 정보의 Index를 받아오려했지만 실패한것이다.
해당 솔루션은 속도이슈로 JPA 를 걷어내고 myBatis를 쓰고 있었기 때문에 무난하고 쉽게
insert 태그에 useGeneratedKeys를 활용해서 만들었었다.
디버깅 모드로 확인해 보니 반환받은 데이터는 1
데이터 행이 추가되었을 때 반환되는 데이터다.....
여기서 부터 해결한 과정을 서술한다.... (오래걸렸는데 결과는 허무하다....)
시도 1. 반환 타입 변경 ( Integer -> int )
처음엔 insert를 하는 도중 이슈가 생겨서 null 값이 반환될 것을 우려해서 Integer로 했다.
( ㄴ> 회사 인프라가 미쳤다... 종종 서버가 죽고 DB가 죽고 어느날엔 계정의 서버 접근권한이 달라져있기도해서 항상 만약을 대비해야한다... )
혹시 model의 field 값이 int이다 보니 데이터 타입에 따른 문제인가 하고 바꿔 보았다
=> 하지만 실패!
( 당연하다... 애초에 Integer int의 상위요소로도 볼 수 있고 자바에서는 Integer와 int사이의 변환을 별다른 parsing 절차없이 박싱/언방식이 된다.)
시도 2. 쿼리 와 DB 테이블 설정 확인
다음에 눈길을 돌린건 DB 쪽이었다. 혹시 내가 Auto_Increment로 설정을 안해두고 있었나..? 란 생각에 한번더 확인
=> 실패! ( 역시나 Auto로 해놓았다 )
다음은 쿼리를 보았다 혹시 다른 테이블을 불러다가 insert한건아닌지? 확인해봤다.
=> 실패! ( 그럴리가 없었다.)
시도 3. insert 된 데이터 행의 값을 받아오는 방식을 변경
처음에 한 방법은
<insert id="saveTest" useGeneratedKeys="true" keyProperty="id">
하지만 안되니까 keyColumn 을 추가 해봤다.
<insert id="saveTest" useGeneratedKeys="true" keyProperty="id" keyColumn="INDEX">
=> 실패! ( 이거다 하고 해본 방법이었는데 안됐다...)
그다음에 써본 방법은
<insert id="saveTest">
<selectKey keyProperty="index" order="AFTER" resultType="model">
SELECT LAST_INSERT_ID()
</selectKey>
=> 실패! ( 솔직히 이건 밑져야 본전이다하고 해본 방법이다.. 이게 되도 그건그거대로 문제였을듯...)
시도 4. result로 오는 값이 mapper 통해서 변수로 return 되는게 아닌가란 생각을 함
여기까지 도달하는데 오래 걸렸다.
생각해보니 난 데이터의 resultType을 적용한적이 없고 그렇다면 parameter로 들어간 타입이 적용되서 반환되지 않았을 까란 생각을 했다.
난 생성해 둔 model 객체에 데이터를 세팅해서 insert했는데 혹시나해서 mapper를 void로 변경하고 model의 getter를 호출해서 해당 필드를 불러보니...
=> 성공!!!
여기에 들어있었다.
그 전까지는 그냥 int로 받아서 쉽게 받아오곤 했었는데 그거랑 이거는 무슨 차이가 있는지는 주말에 공부해보려고한다.