Controller Exception Handler

김명래·2023년 5월 18일
0

사용 계기

service logic은 당연히 service단에 있고 service 단에서 exception 처리와 log를 찍는다.

근데 뭔가 킹받는 부분이 있었다.

@GetMapping("/id")
    public HashMap<String, Object> findById(Long seqNo){
        response = new HashMap<String, Object>();
        Media m = ms.findById(seqNo);
        if(m != null){
            response.put("status", "success");
            response.put("data", m);
        }else{
            response.put("status", "fails");
            response.put("reason", "조회된 데이터가 존재하지 않습니다.");
        }
        return response;
    }

이건 내가 전에 만든 controller method중 일부인데 문제는 바로
ms.findById에서 무슨 exception을 발생시킬 줄 알고 이렇게 코드를 짜는가 였다.

그래서 생각한 방안은 2가지였다.

  1. 메소드의 반환값을 error msg 나 success msg를 string 형식으로 반환하기.
    -> 이건 시도도 안했다.. 뭔가 시원한 방식이 아니였기 때문에.
  2. service metghod에서 exception throw 하기
@DeleteMapping
    public HashMap<String, Object> remove(@RequestBody LdapUser[] users) {
        response = new HashMap<String, Object>();
        try {
            lss.removeLdapUser(users);
            response.put("status", "success");
        }catch (NameNotFoundException e){
            response.put("status", "error");
            response.put("reason", "일치하는 mac 주소와 일치하는 LDAP Data가 존재하지 않습니다.");
            log.error(e.getMessage());
        }catch (Exception e){
            response.put("status", "error");
            response.put("reason", "exception 발생");
            log.error(e.getMessage());
        }

        return response;
    }

service 단에서 발생한 예외를 catch 하는 로직인데

짜 증 난 다

뭔가 더럽다. 그리고 service에서 log 를 찍어야 하는데 이러면 controller에서 찍지 않는가 ?

그래서 찾아낸것이 바로 ExceptionHandler 이걸 사용하면 훨씬 코드를 간결하고 내가 생각해낸 방식으로 진행할 수 있을거라는 생각이 들었다.

@DeleteMapping
    public ResponseEntity<String> remove(@RequestBody LdapUser[] users) {
        lss.removeLdapUser(users);  
        return ResponseEntity.status(HttpStatus.OK).body("삭제 성공");
    }

    @ExceptionHandler(NameNotFoundException.class)
    public ResponseEntity<String> handleNameNotFoundException(NameNotFoundException e){
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("일치하는 mac 주소와 일치하는 LDAP Data가 존재하지 않습니다.");
    }

그저 '빛'

너무나도 깔끔해진 나의 코드에 눈이그만 멀어버렸다.

profile
독자보다 필자를 위해 포스팅합니다

0개의 댓글