소개
JSON(JavaScript Object Notation) 은 구성 파일과 API 통신에 널리 사용되는 경량 데이터 교환 형식입니다.
셸 도구는 일반 텍스트를 처리하는 데 적합하지만, JSON 과 같은 구조화된 형식은 일반적으로 Python 의 기본 제공 라이브러리를 사용해 더 쉽고 안전하게 다룰 수 있습니다.
이 실습에서는 애플리케이션의 구성을 업데이트해야 하는 개발자 역할을 수행합니다. JSON 구성 파일을 만들고, 파일을 읽어 오는 Python 스크립트를 작성한 다음, 설정을 수정하고 변경 내용을 새 파일에 저장합니다.
샘플 데이터 만들기
이 단계에서는 샘플 JSON 구성 파일을 만듭니다. 이 파일은 애플리케이션 이름, 버전, 디버그 모드, 연결 제한을 나타내는 키를 포함한 일반적인 소프트웨어 애플리케이션 설정 파일을 시뮬레이션합니다.
먼저 올바른 작업 디렉터리에 있는지 확인합니다.
JSON 은 최신 운영 환경에서 가장 많이 사용되는 구조화된 데이터 형식 중 하나입니다. API, 클라우드 도구, 다양한 구성 시스템이 모두 JSON 을 사용하기 때문입니다. JSON 을 일반 텍스트처럼 다루는 것보다 안전하게 읽고 변경하는 방법을 익히는 것이 훨씬 유용합니다.
cd ~/project
이제 nano와 같은 텍스트 편집기를 사용해 config.json 파일을 만듭니다.
nano config.json
다음 내용을 파일에 붙여 넣습니다. 이 JSON 객체에는 불리언 값 (false), 정수 (100), 문자열이 포함되어 있습니다.
{
"appName": "SuperApp",
"version": "1.0.0",
"debug": false,
"maxConnections": 100
}
nano에서 저장하고 종료하려면 다음과 같이 합니다.
변경 내용을 저장하려면 Ctrl + O를 눌러 기록한 다음 Enter를 눌러 파일 이름을 확인합니다. 그런 다음 Ctrl + X를 눌러 편집기를 종료합니다.
cat 명령으로 파일 내용을 확인할 수 있습니다.
cat config.json
터미널에 JSON 내용이 출력되어야 합니다.
JSON 읽기
이 단계에서는 config.json 파일을 읽는 Python 스크립트를 작성합니다. Python 의 json 모듈은 JSON 데이터를 Python 딕셔너리로 변환합니다.
이 작업에서는 기본 셸 스크립팅보다 Python 이 분명한 장점을 가집니다. 정규 표현식으로 텍스트를 검색하면서 구조가 단순하게 유지되기를 기대하는 대신, Python 은 JSON 규칙에 따라 파일을 파싱하고 코드에서 쉽게 사용할 수 있는 실제 데이터 형식으로 변환합니다.
json.load()를 배송 상자의 포장을 푸는 작업이라고 생각할 수 있습니다. 이 함수는 파일에 저장된 텍스트 (상자) 를 Python 딕셔너리 (내용물) 로 변환하므로 코드에서 쉽게 사용하고 수정할 수 있습니다.
parse_json.py라는 새 Python 스크립트를 만듭니다.
nano parse_json.py
다음 코드를 파일에 추가합니다. 이 스크립트는 json 모듈을 가져오고, 구성 파일을 연 다음, 데이터를 읽어 옵니다.
import json
## Open the JSON file
with open('config.json', 'r') as file:
## Load the data into a Python dictionary
data = json.load(file)
## Print the data to verify it was loaded correctly
print("Current Configuration:")
print(data)
print(f"Type of data: {type(data)}")
nano에서 저장하고 종료합니다 (Ctrl+O, Enter, Ctrl+X).
이제 스크립트를 실행해 출력을 확인합니다.
python3 parse_json.py
콘솔에 딕셔너리가 출력되어야 합니다. 이는 Python 이 JSON 파일을 성공적으로 파싱했다는 의미입니다.
데이터 수정하기
이 단계에서는 Python 스크립트에서 읽어 온 데이터를 수정합니다. json.load()가 데이터를 표준 Python 딕셔너리로 변환하므로 다른 딕셔너리와 같은 방식으로 값을 수정할 수 있습니다.
여기서 데이터 형식이 변환되는 과정을 확인할 수 있습니다. JSON 의 true와 false는 Python 의 True와 False가 됩니다. 숫자는 일반 문자열로 변환되지 않고 숫자 형식으로 유지됩니다. 따라서 이후의 비교와 계산을 더 안전하게 수행할 수 있습니다.
편집을 위해 parse_json.py를 다시 엽니다.
nano parse_json.py
debug 키의 값을 False(JSON 의 false에 해당) 에서 True로 변경하도록 스크립트를 수정합니다. 데이터를 읽어 온 후 출력하기 전에 수정 로직을 추가합니다.
코드를 다음과 같이 수정합니다.
import json
with open('config.json', 'r') as file:
data = json.load(file)
print("Original Debug Status:", data['debug'])
## Modify the value
data['debug'] = True
print("Updated Debug Status:", data['debug'])
nano에서 저장하고 종료합니다.
다시 스크립트를 실행해 메모리에서 변경되었는지 확인합니다.
python3 parse_json.py
출력에 원래 상태가 False, 변경된 상태가 True로 표시되어야 합니다. 단, 이 변경 내용은 현재 Python 프로그램의 메모리에만 존재하며 아직 파일에 저장되지 않았습니다.
변경 내용 저장하기
이 단계에서는 수정한 딕셔너리를 새 JSON 파일에 저장합니다. 이 작업에는 json.dump() 함수를 사용합니다.
읽기 - 수정 - 쓰기 과정은 자동화에서 매우 흔히 사용하는 패턴입니다. 스크립트는 구조화된 데이터를 읽고, 지정한 필드만 변경한 다음, 올바른 JSON 형식으로 다시 기록합니다. 파일 구조가 더 복잡해질수록 이 방식은 줄 단위 편집보다 훨씬 안정적입니다.
json.dump()를 상자를 다시 포장하는 작업이라고 생각할 수 있습니다. 이 함수는 Python 딕셔너리 (내용물) 를 다시 텍스트 형식 (밀봉된 상자) 으로 변환해 파일에 저장할 수 있게 합니다. 테스트 중 원본 구성을 덮어쓰지 않도록 new_config.json과 같은 새 파일에 저장하는 것이 좋습니다.
마지막으로 parse_json.py를 다시 엽니다.
nano parse_json.py
data 딕셔너리를 new_config.json 파일에 기록하는 코드를 추가합니다. indent=4 매개변수를 사용해 출력 파일을 사람이 읽기 쉬운 형식으로 만듭니다 (pretty-print).
최종 스크립트는 다음과 같아야 합니다.
import json
## 1. Read the original file
with open('config.json', 'r') as file:
data = json.load(file)
## 2. Modify the data
data['debug'] = True
## 3. Write to a new file
with open('new_config.json', 'w') as file:
json.dump(data, file, indent=4)
print("Configuration updated and saved to new_config.json")
nano에서 저장하고 종료합니다.
스크립트를 실행해 읽기 - 수정 - 쓰기 작업을 수행합니다.
python3 parse_json.py
성공하면 스크립트가 확인 메시지를 출력합니다.
결과 확인하기
이 단계에서는 새 구성 파일이 생성되었고 수정된 값이 포함되어 있는지 확인합니다.
구조화된 파일에서는 특히 검증이 중요합니다. 스크립트가 문법적으로는 성공했더라도 논리적으로 잘못된 내용을 생성할 수 있기 때문입니다. 출력 파일을 다시 읽으면 파일이 생성되었는지와 데이터 변경이 올바른지 모두 확인할 수 있습니다.
디렉터리의 파일을 나열해 new_config.json이 있는지 확인합니다.
ls -l
이제 새 파일의 내용을 표시합니다.
cat new_config.json
다음과 비슷한 출력이 표시되어야 합니다.
{
"appName": "SuperApp",
"version": "1.0.0",
"debug": true,
"maxConnections": 100
}
이제 "debug"가 true로 변경된 것을 확인할 수 있습니다.
diff 명령으로 원본 파일과 새 파일을 비교해 정확히 무엇이 변경되었는지도 확인할 수 있습니다.
diff config.json new_config.json
출력에는 debug 줄의 차이가 표시됩니다.
요약
이 실습에서는 Python 을 사용해 JSON 데이터를 다루는 방법을 배웠습니다. 먼저 원시 JSON 구성 파일을 만든 다음, 해당 파일을 딕셔너리로 파싱하는 Python 스크립트를 작성했습니다. 이후 프로그래밍 방식으로 데이터를 수정하고, 업데이트된 구조를 새 JSON 파일에 저장했습니다.
이러한 읽기 - 수정 - 쓰기 작업 흐름은 자동화와 DevOps 스크립팅의 기본 패턴입니다. Bash 는 명령을 실행하는 데 유용하지만, Python 은 JSON 과 같은 구조화된 데이터를 처리할 수 있으므로 복잡한 구성과 API 데이터를 관리하는 강력한 도구입니다.



