Menu
Coddy logo textTech

errors.Is를 사용한 언래핑

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 40번째.

래핑된 에러를 다룰 때, 에러 체인의 어느 곳에든 특정 에러가 존재하는지 확인하는 방법이 필요합니다. errors.Is 함수는 정확히 이 기능을 제공하며, 여러 번 래핑된 경우에도 센티널 에러(sentinel errors)를 식별할 수 있게 해줍니다.

errors.Is 함수는 두 개의 매개변수를 받습니다: 검사하려는 에러와 찾으려는 대상 에러입니다. 대상 에러가 에러 체인의 어느 곳에서든 발견되면 true를 반환합니다:

var ErrNotFound = errors.New("not found")

wrappedErr := fmt.Errorf("failed to load user: %w", ErrNotFound)

if errors.Is(wrappedErr, ErrNotFound) {
    fmt.Println("This is a not found error")
}

이것은 Go에서 특정 오류를 확인하는 현대적이고 권장되는 방법입니다. 문자열 비교나 직접적인 동일성 확인과 달리, errors.Is는 래핑된 오류(wrapped errors)와 함께 올바르게 작동하며 오류 체인을 따라 일치하는 항목을 찾습니다. 이를 통해 오류가 애플리케이션의 여러 계층을 통과하더라도 오류 처리를 견고하고 신뢰할 수 있게 만듭니다.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

challenge icon

챌린지

쉬움

errors.Is를 사용하여 래핑된 에러 체인에서 특정 연결 에러를 식별하는 데이터베이스 연결 모니터링 시스템을 구축하십시오. 이 챌린지는 여러 애플리케이션 계층을 통해 추가적인 컨텍스트와 함께 래핑된 경우에도 errors.Is를 사용하여 센티널 에러(sentinel errors)를 감지하는 방법을 보여줍니다.

두 개의 입력을 받게 됩니다:

  • "database_name,operation,error_type" 형식의 데이터베이스 작업 세부 정보가 포함된 문자열 (예: "users_db,connect,connection_timeout")
  • "service_name,retry_count" 형식의 애플리케이션 컨텍스트가 포함된 문자열 (예: "AuthService,3")

당신의 과제는 다음과 같습니다:

  1. errors.New()를 사용하여 세 가지 센티널 에러를 정의합니다:
    • 메시지가 "connection timeout"ErrConnectionTimeout
    • 메시지가 "connection refused"ErrConnectionRefused
    • 메시지가 "database not found"ErrDatabaseNotFound
  2. 첫 번째 입력을 쉼표로 분리하여 데이터베이스 이름, 작업 및 에러 유형을 파싱합니다.
  3. 두 번째 입력을 쉼표로 분리하여 서비스 이름과 재시도 횟수를 파싱합니다.
  4. 에러 유형에 따라 원본 에러를 생성합니다:
    • 에러 유형이 "connection_timeout"인 경우: ErrConnectionTimeout 사용
    • 에러 유형이 "connection_refused"인 경우: ErrConnectionRefused 사용
    • 에러 유형이 "database_not_found"인 경우: ErrDatabaseNotFound 사용
    • 그 외의 에러 유형인 경우: errors.New("unknown database error") 사용
  5. fmt.Errorf%w를 사용하여 데이터베이스 수준의 래핑된 에러를 생성합니다: "failed to [operation] database [database_name]: %w"
  6. 서비스 수준의 래핑된 에러를 생성합니다: "[service_name] database operation failed after [retry_count] retries: %w"
  7. errors.Is를 사용하여 최종 래핑된 에러가 각 센티널 에러와 일치하는지 확인하고 결과를 표시합니다:
    • "Checking for connection timeout: [true/false]"
    • "Checking for connection refused: [true/false]"
    • "Checking for database not found: [true/false]"
  8. 에러 체인을 표시합니다:
    • "Error Chain:"
    • "Original: [original_error_message]"
    • "Database level: [database_level_error_message]"
    • "Service level: [service_level_error_message]"
  9. 에러 분석 내용을 표시합니다:
    • "Error Analysis:"
    • "Database: [database_name]"
    • "Operation: [operation]"
    • "Service: [service_name]"
    • "Retries: [retry_count]"
    • "Error type detected: [detected_error_type]" (여기서 detected_error_type은 "Connection Timeout", "Connection Refused", "Database Not Found", 또는 "Unknown Error" 중 하나여야 합니다)

입력 문자열을 쉼표로 분리하기 위해 strings 패키지를 사용하고, 센티널 에러와 errors.Is를 위해 errors 패키지를, 에러 래핑을 위해 fmt 패키지를 사용하십시오. 이 챌린지는 errors.Is가 래핑된 에러에서도 올바르게 작동하는 강력한 에러 식별 기능을 제공하여 복잡한 애플리케이션에서 신뢰할 수 있는 에러 처리를 위해 필수적임을 보여줍니다.

치트 시트

errors.Is 함수는 여러 번 래핑된 경우에도 에러 체인의 어느 곳에든 특정 에러가 존재하는지 확인합니다:

var ErrNotFound = errors.New("not found")

wrappedErr := fmt.Errorf("failed to load user: %w", ErrNotFound)

if errors.Is(wrappedErr, ErrNotFound) {
    fmt.Println("This is a not found error")
}

errors.Is는 조사할 에러와 찾으려는 대상 에러라는 두 개의 매개변수를 받습니다. 대상 에러가 에러 체인의 어느 곳에서든 발견되면 true를 반환합니다.

이는 Go에서 특정 에러를 확인하는 현대적이고 권장되는 방법입니다. 문자열 비교나 직접적인 동일성 확인과 달리 래핑된 에러에서도 올바르게 작동하기 때문입니다.

직접 해보기

package main

import (
	"errors"
	"fmt"
	"strings"
)

func main() {
	// 입력 읽기
	var dbOperation string
	var appContext string
	fmt.Scanln(&dbOperation)
	fmt.Scanln(&appContext)
	
	// 입력 파싱
	dbParts := strings.Split(dbOperation, ",")
	databaseName := dbParts[0]
	operation := dbParts[1]
	errorType := dbParts[2]
	
	contextParts := strings.Split(appContext, ",")
	serviceName := contextParts[0]
	retryCount := contextParts[1]
	
	// TODO: 아래에 코드를 작성하세요
	// 1. errors.New()를 사용하여 세 가지 센티넬 에러(sentinel errors) 정의
	// 2. 에러 유형에 따라 원본 에러 생성
	// 3. %w와 함께 fmt.Errorf를 사용하여 데이터베이스 수준의 래핑된 에러 생성
	// 4. 서비스 수준의 래핑된 에러 생성
	// 5. errors.Is를 사용하여 각 센티넬 에러 확인
	// 6. 결과 및 에러 체인 표시
	
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 & 흐름의 모든 레슨