-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
커스텀 에러를 error 미들웨어에서 처리합니다. #101
Conversation
func (e *AppError) Error() string { | ||
return e.Message | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
error
인터페이스 구현해서 AppError
타입이 error
로 반환될 수 있도록 합니다.
// Error handler | ||
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc { | ||
return func(c echo.Context) error { | ||
err := next(c) | ||
if err != nil { | ||
var appErr *pnd.AppError | ||
if errors.As(err, &appErr) { | ||
return c.JSON(appErr.StatusCode, appErr) | ||
} | ||
|
||
if err := pnd.FromPostgresError(err); err != nil { | ||
if errors.As(err, &appErr) { | ||
return c.JSON(appErr.StatusCode, appErr) | ||
} | ||
} | ||
|
||
return c.JSON(http.StatusInternalServerError, pnd.ErrUnknown(err)) | ||
} | ||
|
||
return err | ||
} | ||
}) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
새로 추가된 에러 미들웨어입니다. 에러를 응답으로 만들어주는 부분은 여기서 진행되어 이제 핸들러에서 하지 않아도 됩니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확실히 이전보다 에러 핸들링할떄 관리포인트가 줄어들어 관리하기 편할것 같네요
수고하셨습니다!
🙇 |
기존 방식의 단점
error
대신*pnd.AppError
로 강제되어 비즈니스 로직과 별개로 존재하는 함수도 래핑해서 생성해야 했음.error
와*pnd.AppError
가 혼재하여err
외에도err2
,err3
을 써야하는 경우가 많았음.c.JSON(appErr.code, appErr.response)
로 동일한데 매번 명시해줘야 했음.FromPostgresError
를 까먹고 안하면 문제 발생.해결 방안
pnd.AppError
은 error 인터페이스를 구현합니다.router.go
에 에러 미들웨어를 추가해AppError
,FromPostgresError
를 한 곳에서 처리합니다.FromPostgresError
래핑하는 부분 일괄 제거합니다.앞으로의 방안
앞으로 이렇게 서비스 함수를 작성하면 됩니다.
error
타입으로 넣어줍니다.return err
해주면 됩니다. (FromPostgresError
는 직접 호출하지 않습니다.)AppError
를 만들었다면 핸들러에서 에러 응답을 가공하지 않아도 됩니다. 그냥 err을 리턴해버리면 됩니다.