이제 첫번째 프로젝트가 막바지에 다다랐다.
웹개발에서 내가 맡은 부분을 마치고 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 [일상생활 조각모음]
'Web > Spring Framework' 카테고리의 다른 글
스프링부트. @ControllerAdvice를 이용한 HTML과 JSON 요청에 대한 예외 처리 (1) | 2017.12.31 |
---|---|
Mybatis 추가 시 mybatis egovframework.com.cmm.EgovMessageSource (0) | 2017.01.18 |