본문 바로가기

Web/Spring Framework

mybatis에서 mssql 프로시저 호출 시 raise error을 catch하지 못하는 경우

이제 첫번째 프로젝트가 막바지에 다다랐다.

웹개발에서 내가 맡은 부분을 마치고 jquery-mobile을 이용해서 웹앱을 개발중이다.


그러던 중 이상한 현상을 겪었다.

우선 지금 프로젝트는 새로운 시스템을 구축 하는것이 아닌

기존에 ASP로 개발된 시스템을 자바-스프링으로 재구축하는 프로젝트이다.


DB는 MSSQL을 사용하고 있었기 떄문에 DB를 새로 디자인 할 필요도 없으므로 신입인 나에게 적합한 프로젝트인 것 같다.

또, 모든 쿼리를 프로시저로 사용해서 마이바티스에선 그저 프로시저의 매개변수와 결과를 매핑시켜주는 부분에만 집중하면 되었다.


그런데 문제가 생겼다.


MSSQL은 DBMS자체에서 에러를 throw할 수 있는 RAISERROR라는 시스템 저장 프로시저가 있다.


이 프로시저를 마이바티스에서 호출하니까 에러가 잡히지 않는다.

프로시저 자체 문제인가? 하고 management studio에서 프로시저를 호출해보니 에러는 잘 잡힌다.


문제는 다른 테이블의 컬럼에 update를 한번 실행하고 입력을 검사한 뒤 에러를 raise하는 부분에 있었다.

입력을 검사하기 전에 update을 수행하고 이를 성공하게 되면 


"(1개 행이 영향을 받음)"

와 같은 메시지가 먼저 나온다.


이후에 입력을 검사하여 에러가 발생했을 때

메시지 50000, 수준 16, 상태 1, 프로시저 ......., 줄 220

에러입니다..!

와 같은 에러가 출력된다.


이렇게 되면 mybatis에서는 첫번째 메시지가 먼저 반환되므로 에러가 아니라고 판단하는 것 같다.


이를 해결하기 위한 방법은 프로시저에 SET NOCOUNT ON 구문을 추가하는 것이다.


SET NOCOUNT(Transact-SQL)
Transact-SQL 문 또는 저장 프로시저의 영향을 받은 행 수를 나타내는 메시지가 결과 집합의 일부로 반환되지 않도록 합니다.


출처: http://soyeonii.tistory.com/162 [일상생활 조각모음]