개발을 하다보면 정말 수많은 Exception을 만나게 된다. 그러면 우리는 항상 구글링을 통해, 또는 코드를 뒤적뒤적하다가 Exception을 해결하곤 한다. 근데 이러한 Exception을 사용자가 마주했다면? 그렇다면 분명히 제대로 설명이 필요할 것 이다. 이며 표준 명시된 예외처리가 나간다고 하면 우리의 API를 사용하는 유저들은 불친절한 에러에 당장 회원탈퇴를 누르고 말 것이다.
그렇다면 서버에서는 어떻게 해야 사용자들이 잘못된 방식, 접근을 하였을 경우 Exception을 어떻게 처리해주면 좋을까? 방법은 Exception을 Custom 해주면 된다. 쉽게 말해 우리가 직접 예외처리를 만들어 주면 된다. 만약 사용자가 아이디 또는 비밀번호를 잘못 입력하여 Exception을 마주했다고 했을때 표준 명시된 Exception이 나가버린다면, 이 사람은 자기가 무엇을 잘 못 했는지 알 방도가 없다. 그렇다면 당연히 로그인 안하고 서비스를 이용조차 안하게 될 것 이다.
이뿐만 아니라 만약 회원가입을 한다하였을때 필수 항목을 입력하지 않고 회원가입을 눌렀는데 표준 명시된 Exception으로 에러 메시지를 전송해준다면? 그렇다면 과연 프론트는?
그만큼 우리에게 있어서 커스텀 예외처리를 만드는 것은 상당히 중요한 일이기도 하다. 어떻게 보면 서버를 개발함에 있어서 기능 구현도 중요하지만 Exception 을 얼마나 잘 처리 하냐가 매우 중요한 비중을 차지하기도 한다.
최근에 내가 개발하고 있는 프로젝트로 간단하게 예시 및 작동을 들어보도록 하겠다.
총 4가지의 클래스가 존재한다, Exception이 발생하였을때 알려준 Status 상태와 메시지를 담은 enum 클래스 CustomErrorCode
일종의 Dto 역할을 하고있는 CustomErrorResponse, 그리고 RuntimeException을 상속받아 커스텀화 해준 클래스, 마지막으로 커스텀화 한 클래스 및 다른 Exception들의 Handler 클래스가 구성하고 있다.
설명하기에 앞서 휴대폰 인증을 구현한 API Service가 있다고 가정하고 각각 설명을 해보도록 하자.
위와같은 enum 클래스에서 휴대폰 인증에서 Exception 발생시 전달해준 Status와 statusMessage를 명시해주었다.
위 값들은 Final로 선언되어 당연히 변하지 않게끔 만들어 주었다.
Exception 발생이 처리해줄 Dto 클래스를 구현 해주었다.
우리가 예외를 직접 발생시켜 커스텀 예외처리를 만들었을때 이 부분을 return 해줄 것 이다. log를 통해서 서버에서 좀더 자세한 확인이 가능하게끔 구현 해 놓았다. 그렇다면 Service 부분으로 들어가 어떻게 작동 되는지 보도록하자.
휴대폰 번호를 하이픈을 포함하여 일반 전화번호를 가지고 온다하였을때 13글자여야 한다, 만약 13글자보다 적거나 많다면 이는 잘못된 핸드폰 번호를 입력했음을 서버에서 Validation 해주며 13글자가 아니라면 CustomeException의 PHONE_NUM_ERROR 를 출력하게 한다.
예외처리를 커스텀 해주는 것은 정말 중요하다. 표준명시로는 사용자, 프론트에게 제대로 된 메시지를 전달할 수 없다. 제대로된 메시지를 전달하여 정확한 에러 및 잘못된 사항의 요점을 짚어주는 것이 좋기 때문에 예외처리를 커스텀하여 보다 구체적으로 클라이언트와 소통이 되도록 하자. 물론 커스텀 예외처리가 모든 상황에서 좋은 것은 아니다. 사소한 것 까지 커스텀하면 코드의 양이나 비효율적인 개발이 될 수 있기 때문에 적절한 상황에 좋은 커스텀 처리를 사용하도록 하자.
! 참고하면 좋을 사항
'모험가의 Spring > Spring' 카테고리의 다른 글
JpaRepository에서 Optional 객체에 담긴 정보 가져오기 (0) | 2022.09.30 |
---|---|
인텔리제이로 Spring을 개발할때 TIP ! (0) | 2022.09.05 |
SpringSecurity 접근 허용에 주의 할 점 (0) | 2022.08.21 |
Spring을 이용한 CRUD 구현_Create (0) | 2022.07.26 |
Spring 기초 : SpringDataJpa 사용하기 (0) | 2022.07.20 |