여행지를 정하기 어려울 때, 단순한 랜덤 선택 대신 직접 제어할 수 있는 작은 시스템을 만들어보는 것은 파이썬 기초를 익히기에 완벽한 실습이다. 이 프로젝트를 통해 리스트와 딕셔너리의 중첩 사용법, 함수 정의, JSON 파일을 이용한 데이터 저장 및 예외 처리까지 핵심 개념을 자연스럽게 익힐 수 있다.
기본 요구 사항
- 여러 성(省)과 그에 속한 도시 정보 저장
- 등록된 성 목록 확인 기능
- 새로운 성 추가 및 기존 성 삭제 기능
- 프로그램 종료 후에도 데이터가 유지되도록 파일에 저장
- 입력 오류나 파일 누락 등의 상황에 대한 예외 처리
데이터 구조 설계
정보를 체계적으로 다루기 위해 리스트 안에 딕셔너리를 담는 중첩 구조를 사용한다. 각 딕셔너리는 하나의 성을 나타내며, 'region_name' 키에는 성의 이름, 'cities' 키에는 해당 도시들의 목록을 리스트 형태로 저장한다.
travel_regions = [
{"region_name": "강원도", "cities": ["춘천", "속초", "평창"]},
{"region_name": "전라북도", "cities": ["전주", "익산", "남원"]},
{"region_name": "경상남도", "cities": ["창원", "통영", "거제"]}
]
정보 조회: 간결한 출력 방식
모든 성의 이름만을 빠르게 확인하기 위해 리스트 컴프리헨션을 활용한다. 각 요소에서 'region_name' 필드만 추출하여 출력용 리스트를 생성한다.
def display_regions(regions):
names = [entry["region_name"] for entry in regions]
print("현재 등록된 지역:", names)
성 추가: 일관된 구조 유지
사용자가 새로운 지역을 입력하면, 미리 정의된 형식에 맞춰 딕셔너리를 생성하고 기존 리스트에 추가한다. 초기 도시 목록은 비워둔다.
def add_region(regions):
name = input("추가할 지역 이름을 입력하세요: ")
regions.append({"region_name": name, "cities": []})
print(f"'{name}' 지역이 성공적으로 추가되었습니다.")
성 삭제: 안전한 제거 로직
삭제 과정에서는 먼저 사용자 입력과 일치하는 항목을 찾고, 존재할 경우 리스트에서 제거한다. 일치하는 항목이 없으면 자동으로 경고 메시지를 출력하여 예외 상황을 방지한다.
def remove_region(regions):
target = input("삭제할 지역 이름을 입력하세요: ")
for item in regions:
if item["region_name"] == target:
regions.remove(item)
print(f"'{target}' 지역이 삭제되었습니다.")
return
print(f"오류: '{target}'에 해당하는 지역을 찾을 수 없습니다.")
데이터 영속화: JSON 파일 활용
프로그램 재시작 시에도 데이터를 유지하려면 내부 상태를 외부 파일에 저장해야 한다. JSON 형식은 파이썬의 기본 자료형과 호환성이 뛰어나며, 사람이 읽기 쉬운 텍스트 기반 포맷이므로 디버깅과 공유가 용이하다.
import json
def load_from_file():
try:
with open("travel_data.json", "r", encoding="utf-8") as file:
return json.load(file)
except FileNotFoundError:
print("저장된 데이터를 찾을 수 없습니다. 기본 데이터를 사용합니다.")
return [
{"region_name": "강원도", "cities": ["춘천", "속초", "평창"]},
{"region_name": "전라북도", "cities": ["전주", "익산", "남원"]}
]
def save_to_file(regions):
with open("travel_data.json", "w", encoding="utf-8") as file:
json.dump(regions, file, ensure_ascii=False, indent=4)
print("데이터가 성공적으로 저장되었습니다.")
최종 애플리케이션은 시작 시 파일에서 데이터를 불러오고, 사용자의 조작 후 변경 사항을 다시 파일에 기록함으로써 전체적인 상태를 지속적으로 관리할 수 있다. 이 방식은 소규모 프로젝트뿐 아니라 실제 서비스에서도 널리 사용되는 패턴이다.