본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 딕셔너리 안전 접근 가이드 : KeyError 방지를 위한 get() 메서드와 고급 방어 기법

by Papa Martino V 2026. 2. 6.
728x90

KeyError
KeyError

 

파이썬 프로그래밍을 진행하다 보면 가장 빈번하게 마주치는 자료구조가 바로 딕셔너리(Dictionary)입니다. 키(Key)와 값(Value)의 쌍으로 데이터를 관리하는 이 효율적인 도구는 매우 강력하지만, 한 가지 치명적인 약점이 있습니다. 바로 '존재하지 않는 키'를 참조하려 할 때 발생하는 KeyError입니다. 프로그램이 실행 도중 갑자기 멈추는 이 에러는 서비스의 안정성을 해치는 주범이 됩니다. 본 포스팅에서는 초보자가 흔히 저지르는 실수인 직접 참조 방식의 위험성을 파헤치고, 파이썬이 제공하는 가장 우아한 해결책인 get() 메서드부터 실무에서 활용되는 defaultdict, setdefault까지 데이터 안전성을 극대화하는 모든 방법을 심층적으로 다룹니다.


1. 왜 직접 참조(Bracket Notation)는 위험한가?

일반적으로 우리는 dict['key']와 같은 대괄호 표기법을 사용하여 데이터에 접근합니다. 하지만 이 방식은 해당 키가 반드시 존재한다는 확신이 있을 때만 사용해야 합니다.

  • 예외 발생: 키가 없을 경우 파이썬 인터프리터는 즉시 실행을 중단하고 KeyError를 발생시킵니다.
  • 흐름 제어의 어려움: 에러를 피하기 위해 매번 if 'key' in dict:와 같은 조건문을 추가해야 하므로 코드가 지저분해집니다.

2. 우아한 해결사: get() 메서드 심층 분석

get() 메서드는 딕셔너리 접근 시 에러를 방지하는 가장 표준적이고 안전한 방법입니다. 이 메서드의 진정한 가치는 '기본값(Default Value)' 설정에 있습니다.

2.1 기본 작동 원리

get(key[, default])는 첫 번째 인자로 키를 받고, 두 번째 인자로 키가 없을 때 반환할 값을 받습니다. 두 번째 인자를 생략하면 기본적으로 None을 반환합니다.

비교 항목 대괄호 참조 (dict[key]) get() 메서드 (dict.get(key))
키 존재 시 해당 값을 반환 해당 값을 반환
키 부재 시 KeyError 발생 (프로그램 중단) None 또는 설정한 기본값 반환
코드 간결성 조건문이 필요하여 다소 복잡함 한 줄로 안전하게 처리 가능
권장 용도 키의 존재가 확실하거나 필수적인 경우 데이터가 누락될 가능성이 있는 외부 API 호출 등

3. 실전 예제 (Sample Examples)

예제 1: 기본값 활용으로 에러 처리하기

사용자의 프로필 정보가 담긴 딕셔너리에서 설정되지 않은 '테마' 정보를 가져오는 상황입니다.

user_profile = {"username": "python_coder", "level": 10}

# 1. 직접 참조 시 에러 발생
# theme = user_profile["theme"]  # KeyError: 'theme'

# 2. get() 메서드로 안전하게 가져오기
theme = user_profile.get("theme", "light_mode")
print(f"현재 테마: {theme}") # 출력: 현재 테마: light_mode

예제 2: 중첩 딕셔너리에서의 안전한 접근

복잡한 JSON 데이터를 다룰 때 get()을 연쇄적으로 사용하여 방어적인 코드를 작성할 수 있습니다.

data = {"meta": {"code": 200}}

# 중첩된 데이터도 안전하게 탐색
status_message = data.get("meta", {}).get("message", "No message found")
print(status_message) # 출력: No message found

4. 더 나아가기: defaultdict와 setdefault

단순히 값을 읽는 것을 넘어, 존재하지 않는 키에 대해 자동으로 초기값을 생성하고 싶다면 다음 도구들이 유용합니다.

  • collections.defaultdict: 딕셔너리 생성 시 공장 함수(Factory function)를 지정하여, 키가 없으면 자동으로 초기값을 생성합니다. 빈도수 측정(Counter) 시 유용합니다.
  • dict.setdefault(key, default): 키가 있으면 값을 반환하고, 없으면 기본값을 딕셔너리에 '삽입'한 후 그 값을 반환합니다.

5. 전문 개발자의 결론 및 제언

파이썬의 get() 메서드는 단순히 에러를 피하는 수단이 아닙니다. 이는 '실패를 우아하게 허용하는(Fail Gracefully)' 프로그래밍 철학의 실현입니다. 데이터의 불확실성이 높은 웹 크롤링, 데이터 분석, API 통신 등의 환경에서는 반드시 get()을 생활화하십시오. 다만, 로직상 반드시 존재해야만 하는 데이터라면 대괄호 참조를 사용하여 에러를 일찍 발견(Fail Fast)하는 것이 유지보수에 더 유리할 수도 있다는 점을 기억해야 합니다.


내용 출처 및 참고 자료

  • Python Software Foundation. "Built-in Types - Mapping Types — dict". Python.org Documentation.
  • Beazley, D., & Jones, B. K. "Python Cookbook: Recipes for Mastering Python 3". O'Reilly Media.
  • Real Python Team. "Python Dictionary Methods". realpython.com.
728x90