[Mybatis] update, insert 시 seq 반환받기. (update, insert returning)

update, insert 쿼리

보통 update, insert 를 하는 경우 mapper xml 파일에 다음과 같이 적곤 한다.

<insert id="insertTableA">
	INSERT INTO TABLE_A (column1, column2, column3) VALUES (#{param1}, #{param2}, #{param3});
</insert>

<update id="updateColumn2">
	UPDATE TABLE_A SET column2 = #{param} WHERE seq = #{seq};
</update>

거의 대부분은 이런식일 것이다. 이렇게 seq가 정해지고 딱딱 들어간다면 얼마나 좋을까..

하지만 실무에서는 특정 where 절에 대하여 조건을 가진 행만이 update되고 이는 사전에 어떤 seq를 가지는 row가 update 처리가 될지 미리 예측하기는 같은 조건으로 select를 해보기 전에는 모르는게 일반적이다.

 

예를 들어 이런경우!!

<update id="updateColumnDateColumnNow">
	UPDATE TABLE_A SET column1 = #{param} WHERE date_column >= ('2020-06-08'::timestamp);
</update>

위의 문법은 Postgresql이라는 오픈소스 데이터베이스의 문법이다. TABLE_A의 컬럼1을 업데이트하는건데 date_column의 날짜가 오늘인경우의 모든 컬럼을 업데이트 친다.

 

이렇게 될때 어떤 seq를 가진 컬럼이 업데이트 쳐질지 select를 쳐보기 전에는 알기 어렵다는 것이다. 하지만 RETURNING이라는 키워드를 통해 update 처리된 전체 seq List를 얻어올 수 있다.

 

사실 update나 insert 문은 return 값이 있는 함수이다. 바로 처리된 count 개수가 리턴된다. Mapper 인터페이스에 void로 처리하는 경우가 있지만 정석대로라면 int count를 반환받아 처리해야한다. 그 말 즉슨, 다른 값도 리턴받을 수 있다는 것이다.

 

RETURNING 키워드를 통한 seq 반환

간단히 Returning column을 붙여주면 된다. 하지만 update나 insert 태그가 아닌 select 태그를 사용함을 명심해야한다. 왜냐하면 조회니까!!

<select id="updateColumnDateColumnNow" resultType="Integer">
	UPDATE TABLE_A SET column1 = #{param} WHERE date_column >= ('2020-06-08'::timestamp)
    RETURNING seq;
</select>

언뜻 태그를 보면 select 조회문이지만 안쪽의 SQL은 UPDATE 문이다. 이를 통해 N개의 row가 update 처리되었지만 추후에 어떤 row들이 update 쳐졌는지는 리턴되는 seq List의 결과에서 조회할 수 있을 것이다.

 

List<Integer> seqs = mapper.updateColumnDateColumnNow(param); 

 

사용후기

회사 업무에서 이러한 문법을 접했는데 매우 당황스러웠다. 시스템에는 Returning이 단건의 seq만 리턴하는 것밖에 사용되고 있지 않더라.. 근데 나는 seq의 List가 필요했었다.. 과연 List로도 리턴이 될까 의심하고 구글검색하기만 하다가 무작정 실행해보았다. Mapper 클래스의 리턴타입에 따라 selectOne, selectList가 결정되기 때문에 Mapper 클래스에는 List<Integer>로 선언하고 여러개의 update문을 처리하게 한 후 반환되는 값을 보니....

 

인텔리제이 자동 디버깅으로 size = 3 을 보고 적막한 사무실에서 흡!!! 놀랐다...

 
하지만 이는 업데이트시에 select 쿼리가 존재하고 select쿼리의 성능에 문제가 있거나 테이블의 조회량이 많아 오래걸릴 경우 update 대상 테이블에 lock이 걸리게 되어서 다른 서비스가 중지될수 있으니 케이스를 잘 봐가면서 사용해야 할듯합니다.

가끔은 이런 알아가는 재미가 있다.

댓글

Designed by JB FACTORY