프로그래밍 언어/자바 & 코틀린

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 해줄 수가 있다!!