에러처리용 메서드를 하나 만들고 여기서 모든 케이스에 대한 오류를 처리하고자 하는데
지금은 사실상 그런식으로 일괄적인 처리는 할 수 없는 구조인 것 같더라고요
예를들면 CustomSignUp의 오류케이스는
디바이스 정보가 null일 경우
statusCode : 400
errorCode : UndefinedParameterException
message : undefined device_unique_id, device_unique_id을(를) 확인할 수 없습니다
게임정보 관리의 Insert예제의 오류케이스는
(스키마) 스키마를 정의할 때 선언한 컬럼의 데이터 타입과 insert 하려는 데이터 타입이 다른 경우
statusCode : 400
errorCode : BadParameterException
message : bad {column 명} dataType, 잘못된 {column 명} dataType입니다
(스키마) 스키마를 정의하지 않은 컬럼을 insert 하려고 시도한 경우
statusCode : 400
errorCode : BadParameterException
message : bad 컬럼이 존재하지 않습니다., 잘못된 컬럼이 존재하지 않습니다. 입니다
저렇게 에러케이스가 구성되어 있습니다
근데 이런 구조가 비효율성을 유발하는 문제점이 있어요
- CustomSignUp와 Insert는 완전히 다른 기능임에도 반환되는 statusCode는 똑같은 경우가 있어서
statusCode만으로는 일괄처리가 불가능함.
→ 따라서 로그인, 로그아웃, 차트 불러오기, 길드 정보 조회 등등의
뒤끝에서 제공하는 기능들을 쓸때마다
매번 그것에 맞는 에러 처리 케이스를 만들어놔야 함
2, Insert의 예시에서도 볼 수 있듯이 statusCode와 errorCode는 같은 에러임에도 원인은 달라서
결과값을 정확하게 예측할 수 없는 string형 변수값인 message에 따른 분기처리도 필요함.
→ 에러처리를 위해 statusCode와 errorCode는 어떻게든 int형으로 분기를 만든다고 쳐도
message까지 분기처리를 해야한다면 string을 미리 캐싱해야하며 크진 않겠지만 성능적인 문제도 있고,
가장 중요한건 개발자 입장에서는 서버에서 온 string값이 앞으로도 변하지 않을것이라는 절대적으로 신뢰할 수 있는 불변의 값이냐 라고 하면 그건 절대로 아니라고 보기 때문에 불안한부분이 있는것은 사실.
그리고 반환되는 string 메세지 자체도 개발자 입장에서 원하는 형태로 받을 수 있는것도 아니라
오류 발생 시 UI팝업에 message를 띄우자니 현지화 대응 이슈가 있고
원하는 텍스트를 띄워주려면 저 복잡한 분기처리를 대응하며 구성해야함.
그래서 저는 모든 에러 처리 케이스를 간단하게 분기처리할 수 있는 enum을 하나 만들어주셨으면 합니다
예를들면 아래 링크의
커스텀 로그인에서의 에러 케이스만 놓고 본다면
public enum ErrorState
{
Success, //<- 모든 서버 요청에서 성공했을 때 반환됨
…
BMember_CustomSignUp_NotExistID,
BMember_CustomSignUp_WrongPassword,
BMember_CustomSignUp_BlockedUser,
BMember_CustomSignUp_UndefinedDeviceInfo
…
}
이런식으로요,
Backend.BSocial.ErrorState
Backend.BMember.ErrorState
만약 클래스마다 대응되는 enum으로 구성이 된다면
public enum ErrorState
{
Success, //<- 모든 서버 요청에서 성공했을 때 반환됨
…
CustomSignUp_NotExistID,
CustomSignUp_WrongPassword,
CustomSignUp_BlockedUser,
CustomSignUp_UndefinedDeviceInfo
…
}
네이밍은 아마 이렇게 되겠죠
저는 enum 네이밍 규칙만 직관적으로 구성이 된다면
개발자 입장에선 어떤 오류가 발생했을 때 매번 가이드문서를 찾아보면서
이 오류에 대한 에러코드는 뭔지, 스테이터스 코드는 뭔지 찾아볼 일도 없고
또 에러발생 원인은 다른데 에러코드와 스테이터스 코드는 똑같아서 헷갈릴 경우도 없어질거라 봅니다
지금 구조는 어떤 에러인지 알기도 힘들어서 매번 주석으로 처리해줘야 하고
message까지 분기처리가 필요하면 분기처리 시키는게 너무 헬이라서
아마 대부분 프로젝트가 에러가 나오면 그냥 서버에서 오류가 발생했다는 UI를 띄워주고 게임을 강제로 꺼버리도록 하거나
에러사항에 대한 분기처리가 반드시 필요한 경우 십중팔구는
if문과 switch문이 되게 난잡하게 구성이 되어있을 가능성이 클 것 같아요
때문에 enum으로 직관적인 처리가 가능하게끔 구성을 해주셨으면 좋겠습니다