Custom Error Code가 왜 필요했을까?
커스텀 에러 코드를 도입한 이유
이때까지 백엔드에서 예외가 발생하면 프론트엔드로 다음과 같은 응답 메시지를 보내고 있었다.
// response
{
"message": "요청 형식이 잘못되었습니다."
}
각 Http Status Code 마다 응답되는 message는 한 가지뿐이었다.
따라서 어떠한 예외가 발생하던 위의 4가지 중 하나의 메시지만 받을 수 있었다.
악의적인 사용자가 악의적인 요청을 보내 예외가 발생하는 경우 어떠한 잘못으로 인해 예외가 발생했는지 알 수 없게 하기 위해서 위처럼 메시지를 추상화하여 응답하였다.
그러나 이런 추상적인 메시지 덕분에 프론트 개발자가 개발하는데에 어려움을 겪게 되었다.
프론트 개발자가 개발 진행 중, 요청을 보냈을 때 예외가 발생하면 응답 메시지를 통해 어떤 예외가 발생했는지 알고 싶은데, 위의 4가지 메시지만으로는 어떠한 이유로 예외가 발생했는지 알 수 없었다.
따라서 사용자에게 추상화된 메시지를 보여주고, 프런트 개발자에게는 발생한 예외에 대한 구체적 메시지를 전달해야 했다.
이러한 이유로 커스텀 에러 코드를 만들게 되었다.
커스텀 에러 코드를 통해 구체적인 메시지 전달 방법
우리는 예외가 발생했을 때 다음과 같이 응답을 전달하도록 변경을 하였다.
// response
{
"codeNumber" : "1234",
"message": "요청 형식이 잘못되었습니다."
}
그리고 codeNumber에 대한 정보는 아래와 같이 rest docs에서 찾아볼 수 있다.
따라서 개발자는 에러가 발생했을 때 어떤 에러인 지 모르겠다면 응답으로 받은 codeNumber를 rest docs에서 확인하면 된다.
물론 rest docs가 서비스 사용자에게는 감추어져야 한다.
커스텀 에러 코드 생성 기준
에러 코드는 총 4자리의 수이다. 에러 코드가 어떠한 방식으로 4자리로 설정되었는지 알아보자.
1. 도메인
첫자리는 도메인에 따라서 나누었다. 각 도메인별로 숫자를 부여하였다.
number | domain |
0 | Auth |
1 | TEAM |
2 | POLL |
3 | APPOINTMENT |
4 | CORE |
5 | ROLE |
9 | MORAK |
어떤 도메인에서 발생한 예외인지에 따라 첫자리가 달라진다. 도메인은 계속해서 추가될 수 있는 가능성이 있다.
도메인이 계속 추가되어 10개를 넘어가는 경우 에러 코드를 5자리로 확장하면 된다.
2. 에러 종류
두 번째 자리는 어떤 상황에서 에러가 발생하는지에 따라 숫자를 부여하였다.
number | situation |
0 | 도메인 또는 dto 객체를 생성할 때 잘못된 경우,즉 MethodArgumentValidException 또는 ConstraintViolationException이 발생한 경우 |
1 | 도메인 로직 상의 오류인 경우 |
2 | 인증, 인가가 안된 경우 |
3 | 존재하지 않는 리소스에 접근한 경우 |
4 | 외부 API 연동 중 에러가 발생한 경우 |
우리 서비스에서 발생하는 예외는 위처럼 크게 5가지로 분류해 볼 수 있었다.
3. 에러 순서
세 번째, 네 번째 자리는 같은 종류의 에러 순서에 따라 번호를 부여하였다.
예를 들어, 약속잡기 기능의 도메인 로직 상의 오류인 경우는 여러 가지일 것이다.
각각의 도메인 로직 상 오류로 인한 예외들을 순서대로 3101, 3102, … 3111 … 과 같이 번호를 부여하였다.
커스텀 에러 코드에 대한 생각
커스텀 에러 코드를 만들게 된 본질적 이유는 프런트 개발자와의 원활한 소통을 위해서다.
커스텀 에러 코드를 만들기 위해 여러 기준을 세우고 번호를 부여하였지만, 사실 이 부분은 프런트 개발자와 협의를 통해 다른 기준으로도 번호를 부여할 수도 있다. 따라서 어떤 방식으로 번호를 부여해야 할 지에 대해 고민하기보다는 어떤 방식으로 코드를 전달해야 프론트 개발자가 더 쉽게 개발할 수 있을지 고민해야겠다.
그런데 에러 코드를 적용하다 보니 다른 생각이 들었다. 애초에 팀 컨벤션을 정할 때 응답 메시지를 조금 더 친절하게 주는 방향으로 진행했다면 에러 코드를 만들 일이 있었을까?라는 생각이 들었다. 에러 응답 메시지에 사용자 인증에 실패했습니다. 또는 만료된 초대 코드입니다. 정도의 에러 메시지를 보낸다한들 악의적인 사용자가가 이 정보를 이용하여 무엇을 할 수 있을까?라는 것에 대해 고민을 해보았다.