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가지였다.
@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가 존재하지 않습니다.");
}
그저 '빛'
너무나도 깔끔해진 나의 코드에 눈이그만 멀어버렸다.