프로젝트_트러블슈팅

[PersonaAI - 비공개 프로젝트 d] myBatis useGeneratedKeys 안될때

quantumee 2024. 7. 25. 00:44

회사 솔루션에 새로 들어갈 기능 일부를 맡아서 개발을 시작했다. 

내가 맡은 부분은 트리구조로 사용자가 사내 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로 받아서 쉽게 받아오곤 했었는데 그거랑 이거는 무슨 차이가 있는지는 주말에 공부해보려고한다.