오류 처리를 위한 구문적 지원(또는 미지원)에 대하여

1 week ago 5

  • Go 언어에서 오류 처리의 장황함이 오랫동안 사용자 불만의 상위에 해당함
  • 다양한 구문 개선 제안(예: check/handle, try, ? 연산자 등) 이 논의 및 실험되었으나, 커뮤니티의 충분한 합의 없이 모두 기각됨
  • 언어 변화가 미치는 코드, 도구, 문서 등 광범위한 영향과 Go 특유의 단순함 유지 원칙이 주요 고려사항임
  • 현행 방식의 명확함, 디버깅 편의 및 일부 사용자 선호로 인해, 굳이 구문 변화를 도입할 명분이 약함
  • 가시적 미래에는 오류 처리 구문 변화 계획이 없으며, 관련 제안들은 모두 추가 조사 없이 종료될 예정임

Go의 오류 처리 장황함 문제 제기

  • Go의 오래된 불만 중 하나는 오류 처리 구문이 지나치게 장황함
  • 대표적으로 if err != nil과 같은 패턴이 코드에서 반복적으로 나타남
  • 여러 API 호출이 필요한 프로그램일수록 이 구문이 두드러지며, 실제 로직보다 오류 처리 코드가 더 많아지는 현상 발생함
  • 연간 사용자 설문에서 해당 불만이 상위에 지속적으로 언급됨

커뮤니티와의 협의 및 초기 제안

  • Go 팀은 커뮤니티 피드백을 중시하여 오류 처리 개선안 연구를 계속해 옴
  • 2018년 Go 2 프로젝트 논의에서 Russ Cox가 오류 처리 문제 핵심을 공식적으로 정리함
    • Marcel van Lohuizen이 제안한 check와 handle 메커니즘 안 등장
    • 유사 언어들과 비교 분석 및 다양한 대안 검토 포함
  • 이 방식은 실제로 코드를 간결하게 해주긴 하지만, 복잡성 증가로 인해 채택되지 않음

try 제안과 그 이후

  • 2019년, 훨씬 간소화된 try 내장 함수 제안이 이루어짐
    • check 기능만 코드로, handle 생략
    • 해당 제안은 제어 흐름을 감추는 문제로 비판받고 커뮤니티 반발 속에서 폐기됨
  • 이 경험을 통해 충분한 피드백 없는 완성형 제안의 위험성을 깨닫게 됨
    • 대규모 변경 제안은 초기 설계 단계에서 더 폭넓은 의견 수렴이 중요함을 확인함

추가 시도 및 다양한 제안들

  • 수많은 변형과 대안적 오류 처리 방식 제안이 꾸준히 커뮤니티에서 등장함
    • Ian Lance Taylor의 umbrella issue로 현황 정리, Go Wiki 및 블로그 등에서 사례 지속 수집
  • 2024년에는 Rust에서 차용한 ? 연산자 적용 제안이 나옴
    • 소규모 사용성 테스트에서 직관적이라는 피드백 있었으나, 역시 다양한 의견 속에 합의에 이르지 못함

논의의 교착과 결론

  • 공식, 비공식 제안이 3건 이상, 커뮤니티 제안은 수백 건에 달하지만 충분한 공감대/합의 부족으로 모두 기각됨
  • Go 내부 아키텍트 그룹조차 방향성에 대한 의견 일치가 없음
  • 상황 변화나 특별한 공감대 형성 전까지는 오류 처리 구문 변화 시도 자체를 중단하기로 결정함

현행 방식 유지를 옹호하는 주요 논거

  • 초기 언어 설계 시 구문적 설탕을 넣었으면 논란이 없었겠지만, 현재는 15년간 사용된 방식에 익숙한 생태계가 읶음
  • 새로운 구문을 도입하면 필연적으로 기존/신규 사용자 간 코드 스타일 간극 및 일관성 붕괴 우려 존재함
  • Go의 설계 철학(같은 것을 여러 방식으로 하지 않음)과 간결성/일관성 중시 원칙과도 부합함
    • 짧은 변수 선언(:=)의 재선언 허용도 오류 처리로 인해 생긴 부차적 변화임
  • 명확한 오류 처리 구문(if를 통한)은 코드 읽기, 디버깅, 브레이크포인트 설정에 직관적인 강점이 있음
  • 언어 변화는 실제 변경의 범위(코드, 문서, 도구 등)와 비용 측면에서도 큰 부담임

대안적 개선 및 미래 방향

  • 표준 라이브러리의 기능 강화(예: cmp.Or 도입)로 일부 반복 코드 줄이기는 가능함
  • IDE·개발 도구의 코드 접기, 자동완성, LLM 활용 등으로 장황함을 실무에서 어느 정도 극복 가능
  • 주요 Go 사용자 그룹(예: Google Cloud Next 행사 참석자)에서는 언어 변화 필요성에 부정적인 견해 우세함
    • Go 사용이 늘수록 장황함 문제는 실제로 체감이 줄어듦

구문 개선 필요성을 지지하는 논거

  • 사용자 피드백 기반으로 여전히 오류 처리 구문 개선 요구 존재
  • 문자 수만 줄이는 게 아닌, 명확성을 높이는 오류 처리 구문이 코드 품질/안전성 개선에 기여할 수도 있음
  • 단순 오류 확인이 아닌, 실제 역할을 하는 오류 처리에 대해 더 정밀한 연구가 필요함

최종 결론 및 향후 정책

  • 현재까지 별다른 합의나 실질적 변화 없는 상황을 인정하며, 가시적 미래에는 오류 처리를 위한 구문적 언어 변화 논의·제안을 모두 중단함을 선언함
  • 기존 논의와 연구 과정은 Go 생태계와 프로세스 개선에 간접적으로 기여함
  • 향후 혹시 더 명확한 문제 정의와 합의가 생길 경우 논의가 재개될 수 있음
  • 당분간은 새로운 시도보다는 Go 자체의 견고함과 단순함을 유지하는 데 주력할 방침임

Read Entire Article