프로그래밍 언어/자바 & 코틀린
Exception 발생해도 원하는 파라미터 return하는 방법
희랍인 조르바
2018. 2. 25. 21:52
실무에서 처음으로 @Transitional을 써봤다.
MariaDB에서 프로시저를 사용하라는 팀장님의 오더에 체크하는 로직을 프로시저에 넣어 구현했다.
for문을 돌면서 데이터를 insert하고 check하기 때문에 for문 중간에서 에러가 나면 전체 rollback이 필요했다.
@Transitional에서 RuntimeException이 나면 전체 rollback이 진행된다.
근데 생각해보니 Exception이 나면 아예 실행이 멈추니 에러가 발생했는데
어디서 에러가 났는지 사용자에게 alert를 띄워줄 방법이 없었다.
내가 구상한 프로세스는 각각의 에러마다 번호를 부여해 그 번호를 return하면 alert로 사용자에게 에러를 알려주려고 했다.
구글링의 결과를 참고해 구현했다.
방법은 Service단에서 exception이 나면 그것을 Controller단에서 catch해서 값을 return해주는 것이다.
RuntimeException을 상속하고 원하는 결과값을 return하는 class다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class ValueReturnException extends RuntimeException{ private static final long serialVersionUID = 1L; final Object value; public ValueException(Object value, String message) { super(message); this.value = value; } public Object getValue() { return value; } } | cs |
Service단에서 구현한 부분이다.
결과값이 "0"이 아니면 무조건 exception을 던져서 전체 rollback을 시킨다.
1 2 3 4 5 6 7 8 9 10 11 12 | int checkResult = -1; List<Map<String,Object>> detailList = dao.getList(params); for (int i = 0; i < detailList.size(); i++) { DetailDTO detailDto = detailList.get(i); checkResult = dao.detailInfo(detailDto); if(!checkResult.equals("0")) throw new ValueReturnException(checkResult, "상세정보 저장 도중 에러가 발생했습니다."); } return checkResult; | cs |
Service단에서 날아온 exception을 Controller단에서 캐치해 return 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @RequestMapping(value="/pratice/examination.do") public ModelAndView insertAndcheckData(@RequestBody Map<String, Object> params, HttpServletRequest request){ ModelAndView mv = new ModelAndView(); Map<String, Object> result = new HashMap<>(); String checkResult = ""; try { result = service.insertAndcheckData(params); }catch (ValueReturnException e) { e.printStackTrace(); checkResult = (String) e.getValue(); result.put("checkResult", checkResult); } mv.addObject("result", result); mv.setViewName("jsonView"); return mv; | cs |
이렇게하면 exception에러가 발생해도 원하는 결과값을 return 해줄 수가 있다!!