고급 오류 처리를 통한 Gin 웹 프로젝트 안정성 강화
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Go 언어를 사용한 웹 서비스 개발자, Gin 프레임워크 사용자
핵심 요약
- Gin의 Recovery 미들웨어 확장으로 전역 예외 처리 가능 (
CustomRecovery()
함수 사용) - 유니버설 API 응답 구조 정의 (
APIResponse
타입)으로 클라이언트 대응 용이 - 비즈니스 오류 분류 (
BusinessError
타입)로 구체적 에러 코드 제공 (예:ErrDatabase
,ErrAuth
) - Sentry 통합으로 실시간 오류 추적 및 분석 가능
섹션별 세부 요약
1. Gin 기본 Recovery 기능
- Gin 기본
Recovery()
미들웨어는 모든 패닉을 포착하고 HTTP 500 반환 - 예시 코드:
```go
r := gin.Default() // Logger 및 Recovery 미들웨어 기본 활성화
r.GET("/panic", func(c *gin.Context) { panic("에러 발생") })
```
- 클라이언트 응답:
{"error":"Internal Server Error"}
2. 커스텀 Recovery 미들웨어 구현
CustomRecovery()
함수로 패닉 로깅 및 구조화된 에러 응답 제공- 핵심 로직:
```go
func CustomRecovery() gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
if err := recover(); err != nil {
fmt.Printf("Panic occurred: %v\n", err)
c.JSON(500, gin.H{"code": 500, "message": "Internal Server Error", "error": fmt.Sprintf("%v", err)})
c.Abort()
}
}()
c.Next()
}
```
3. 유니버설 API 응답 구조 정의
- 성공/실패 응답 통일:
```go
type APIResponse struct {
Code int json:"code"
Message string json:"message"
Data interface{} json:"data,omitempty"
Error interface{} json:"error,omitempty"
```
- 유틸리티 함수로 응답 생성 간소화:
```go
func SuccessResponse(c *gin.Context, data interface{}) { c.JSON(200, APIResponse{Code: 200, Message: "success", Data: data}) }
func ErrorResponse(c *gin.Context, code int, message string, err error) { c.JSON(code, APIResponse{Code: code, Message: message, Error: err.Error()}) }
```
4. 비즈니스 오류 분류 처리
BusinessError
타입 정의로 구체적 오류 코드 제공:
```go
type BusinessError struct { Code int; Message string }
func (e *BusinessError) Error() string { return e.Message }
var ErrDatabase = &BusinessError{Code: 5001, Message: "database error"}
```
- 오류 타입 체크로 분기 처리:
```go
func handleError(c *gin.Context, err error) {
if be, ok := err.(*BusinessError); ok {
c.JSON(400, APIResponse{Code: be.Code, Message: be.Message, Error: err.Error()})
} else {
c.JSON(500, APIResponse{Code: 500, Message: "Internal Server Error", Error: err.Error()})
}
```
5. Sentry 통합 예시
- Sentry 초기화 코드:
```go
sentry.Init(sentry.ClientOptions{Dsn: "DSN", EnableTracing: true, TracesSampleRate: 1.0})
```
- 오류 발생 시 실시간 추적 기능 제공
결론
- Gin의 Recovery 미들웨어 확장으로 전역 예외 포착, 유니버설 응답 구조로 클라이언트 대응 용이
- Sentry 통합으로 실시간 오류 모니터링 가능, 비즈니스 오류 분류로 문제 빠르게 진단
- 실무 적용 시
BusinessError
타입 정의 및 Sentry DSN 설정 필수