2025 . 오은

repo

에러 던지기

문제 정의

try-catch 블록 내에서 발생한 에러를 적절히 처리하고 재던지는 것은 애플리케이션의 안정성과 보안성에 직접적인 영향을 미칩니다. 초기에는 catch 블록에서 에러를 단순히 로깅한 후 다시 던지는 방식(throw error)을 사용했으나, 보안상의 이유로 민감한 정보가 노출될 수 있는 문제를 인지하게 되었습니다. 이에 따라, 에러를 재던질 때 상황에 맞는 적절한 방식을 선택하는 것이 중요하다는 점을 깨닫게 되었습니다.

해결 과정

에러를 재던지는 두 가지 주요 방법을 학습하고, 각각의 상황에 맞게 적용하는 방안을 모색했습니다:

  1. 단순 재던지기 (throw error):

    • 사용 시점: 에러를 단순히 로깅하고, 상위 호출 스택으로 에러를 전달하여 추가적인 처리나 사용자 알림을 원할 때 사용합니다.
    • 장점: 원본 에러 정보가 그대로 전달되어 디버깅에 용이합니다.
    • 단점: 원본 에러 메시지나 스택 트레이스가 외부에 노출될 경우, 민감한 정보가 유출될 수 있습니다.
  2. 새로운 에러 생성 (throw new Error("메시지")):

    • 사용 시점: 보안상의 이유로 원본 에러 정보를 숨기고, 일반적인 에러 메시지나 사용자에게 필요한 정보만 전달하고자 할 때 사용합니다.
    • 장점: 민감한 정보가 노출되지 않아 보안성이 향상됩니다.
    • 단점: 원본 에러 정보가 손실되어 디버깅이 어려워질 수 있습니다.

구현 예시:

// 단순 재던지기 예시
function fetchData() {
  try {
    // 데이터 패칭 로직
    throw new Error("네트워크 오류 발생");
  } catch (error) {
    console.error("에러 로깅:", error);
    throw error; // 에러를 상위로 재던짐
  }
}

// 새로운 에러 생성 예시
function secureFetchData() {
  try {
    // 데이터 패칭 로직
    throw new Error("네트워크 오류 발생");
  } catch (error) {
    console.error("에러 로깅:", error);
    throw new Error("데이터를 가져오는 중 문제가 발생했습니다."); // 사용자에게 전달할 일반적인 메시지
  }
}

결과

에러 재던지기 전략을 적절히 적용한 결과, 다음과 같은 개선 효과를 얻었습니다:

  • 보안 강화: 민감한 에러 정보가 외부에 노출되지 않아, 보안성이 향상되었습니다.
  • 코드 유지보수성 향상: 에러 처리 로직이 명확해져, 코드의 가독성과 유지보수성이 개선되었습니다.
  • 사용자 경험 개선: 사용자에게 친숙한 에러 메시지를 제공하여, 불필요한 기술적 정보를 숨기면서도 문제를 인지할 수 있게 되었습니다.
  • 디버깅 효율성: 단순 재던지기를 사용할 경우, 원본 에러 정보가 보존되어 디버깅이 용이해졌습니다. 반면, 새로운 에러 생성 시에는 로깅을 통해 원본 에러를 기록하여 디버깅에 활용할 수 있었습니다.

배운 점 (인사이트)

  • 상황에 맞는 에러 처리 선택: 모든 상황에서 단순 재던지기보다는, 에러의 민감도와 보안 요구 사항을 고려하여 적절한 에러 처리 방식을 선택하는 것이 중요하다는 점을 깨달았습니다.
  • 에러 정보의 균형 유지: 디버깅에 필요한 충분한 정보를 로깅하면서도, 사용자에게는 필요한 정보만을 전달하여 보안과 사용자 경험을 균형 있게 유지할 수 있었습니다.
  • 보안 실천: 에러 메시지에 민감한 정보나 내부 구현 세부 사항을 포함하지 않음으로써, 잠재적인 보안 취약점을 줄일 수 있음을 배웠습니다.
  • 에러 처리 일관성 유지: 프로젝트 전반에 걸쳐 일관된 에러 처리 전략을 적용함으로써, 코드의 일관성과 유지보수성을 높일 수 있었습니다.
  • 에러 처리의 유연성 확보: 특정 상황에서는 단순 재던지기, 다른 상황에서는 새로운 에러 생성 등 유연하게 에러 처리 방식을 적용할 수 있는 능력을 키웠습니다.