Gin 웹 프로젝트 안정성 강화: 고급 오류 처리 전략
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

고급 오류 처리를 통한 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 설정 필수