[EXT-004][기초] 없는 값과 빈 값을 구분하기
페이지 정보

본문
[이번 수업]
`없음`, 빈 문자열, 0, 거짓은 서로 다른 값입니다. 한꺼번에 빈 값으로 처리하면 오류가 생깁니다. JSON을 읽는 Python 실습으로 키 없음, null, 빈 문자열, 0을 구분합니다.
[선수지식]
PY-002의 자료형, PY-003의 딕셔너리, DATA-002의 JSON을 알면 좋습니다. Python 파일을 만들고 실행할 수 있으면 충분합니다.
[학습목표]
1. 키 없음, `None`, 빈 문자열, 0, `False`의 뜻을 구분합니다.
2. 값이 없음을 `is None`으로 검사합니다.
3. API와 데이터베이스에서 null의 의미를 계약으로 정합니다.
[핵심개념]
Python의 `None`은 값이 없음을 나타내는 하나뿐인 객체이며 `value is None`으로 확인합니다. 빈 문자열 `""`, 숫자 `0`, 불리언 `False`, 빈 목록 `[]`은 각각 자료형과 의미가 다릅니다.
Python 조건식에서는 이 값들이 모두 거짓처럼 평가됩니다. `if not value:`는 차이를 지우므로 점수 0과 미입력을 구분할 때는 `is None`을 먼저 검사합니다. 공백 입력을 `strip()` 뒤 검사할지도 정하세요.
JSON의 `null`, `""`, `0`, `false`, `[]`는 서로 다르고, Python은 null을 `None`으로 바꿉니다. 키가 아예 없는 상태도 null과 다릅니다. 수정 API에서 키 없음과 null의 동작을 요청 계약에 기록하세요.
SQL의 NULL은 알 수 없거나 없는 값입니다. `column = NULL`이 아니라 `column IS NULL`로 찾습니다. `NOT NULL` 제약은 NULL만 막으므로 빈 문자열은 별도 제약이나 입력 검증으로 막아야 합니다.
[따라하기]
빈 폴더에 missing_values.py를 만들고 다음 코드를 저장합니다. 외부 패키지는 필요 없습니다.
```python
import json
text = """[
{"nickname": null, "points": 0},
{"nickname": "", "points": 5},
{"points": 7}
]"""
rows = json.loads(text)
def describe(row):
if "nickname" not in row:
return "키 없음"
if row["nickname"] is None:
return "없음"
if row["nickname"] == "":
return "빈 문자열"
return row["nickname"]
for number, row in enumerate(rows, 1):
print(f"{number}: nickname={describe(row)}, points={row['points']}")
```
macOS와 Linux에서는 `python3 missing_values.py`, Windows에서는 `py missing_values.py`로 실행합니다. 예상 결과는 다음과 같습니다.
```text
1: nickname=없음, points=0
2: nickname=빈 문자열, points=5
3: nickname=키 없음, points=7
```
첫 행의 점수 0은 그대로 보존됩니다. `if not row["points"]`로 검사했다면 0을 미입력으로 오해했을 것입니다. 이 코드는 운영체제에 따른 차이가 없습니다.
[흔한 실수]
`value or 기본값`은 0과 빈 문자열도 바꿉니다. `get()` 결과가 None이어도 키가 존재할 수 있으므로 `key in data`로 구분하세요. `COUNT(column)`은 NULL을 세지 않지만 `COUNT(*)`는 행을 셉니다.
[보안 주의]
권한 플래그의 `False`, `None`, 키 없음을 명시적으로 검증하고 알 수 없는 값은 거부합니다. 외부 JSON의 크기·문자열 길이와 자료형을 확인하세요. 로그에는 비밀번호나 토큰을 남기지 말고 로컬 가짜 데이터만 사용합니다.
[직접 해볼 과제]
네 번째 행에 `nickname: false`를 넣고 잘못된 자료형으로 거부하세요. `nickname` 키 없음은 `변경하지 않음`, null은 `삭제`, 빈 문자열은 `입력 오류`로 분류하는 함수를 만들고 각 경우를 테스트합니다.
[확인문제]
1. Python에서 0과 None을 `if not value`로만 검사하면 어떤 문제가 생기나요?
2. JSON 객체의 키 없음과 명시적인 null은 어떻게 다른가요?
3. SQL에서 NULL을 찾을 때 `= NULL` 대신 `IS NULL`을 쓰는 이유는 무엇인가요?
[다음 학습]
다음 확장 수업에서는 KB와 KiB, Mbps와 MB/s처럼 비슷해 보이는 데이터 단위를 구분합니다. 저장공간과 전송시간 계산을 로컬 코드로 확인합니다.
[공식 참고 자료]
Python 내장 상수 None
https://docs.python.org/3/library/constants.html#None
Python 참·거짓 판정 공식 문서
https://docs.python.org/3/library/stdtypes.html#truth-value-testing
RFC 8259 JSON 표준
https://www.rfc-editor.org/rfc/rfc8259.html
PostgreSQL 비교와 NULL 조건
https://www.postgresql.org/docs/current/functions-comparison.html
PostgreSQL NOT NULL 제약
https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-NOT-NULL
JSON Schema null 자료형
https://json-schema.org/understanding-json-schema/reference/null
`없음`, 빈 문자열, 0, 거짓은 서로 다른 값입니다. 한꺼번에 빈 값으로 처리하면 오류가 생깁니다. JSON을 읽는 Python 실습으로 키 없음, null, 빈 문자열, 0을 구분합니다.
[선수지식]
PY-002의 자료형, PY-003의 딕셔너리, DATA-002의 JSON을 알면 좋습니다. Python 파일을 만들고 실행할 수 있으면 충분합니다.
[학습목표]
1. 키 없음, `None`, 빈 문자열, 0, `False`의 뜻을 구분합니다.
2. 값이 없음을 `is None`으로 검사합니다.
3. API와 데이터베이스에서 null의 의미를 계약으로 정합니다.
[핵심개념]
Python의 `None`은 값이 없음을 나타내는 하나뿐인 객체이며 `value is None`으로 확인합니다. 빈 문자열 `""`, 숫자 `0`, 불리언 `False`, 빈 목록 `[]`은 각각 자료형과 의미가 다릅니다.
Python 조건식에서는 이 값들이 모두 거짓처럼 평가됩니다. `if not value:`는 차이를 지우므로 점수 0과 미입력을 구분할 때는 `is None`을 먼저 검사합니다. 공백 입력을 `strip()` 뒤 검사할지도 정하세요.
JSON의 `null`, `""`, `0`, `false`, `[]`는 서로 다르고, Python은 null을 `None`으로 바꿉니다. 키가 아예 없는 상태도 null과 다릅니다. 수정 API에서 키 없음과 null의 동작을 요청 계약에 기록하세요.
SQL의 NULL은 알 수 없거나 없는 값입니다. `column = NULL`이 아니라 `column IS NULL`로 찾습니다. `NOT NULL` 제약은 NULL만 막으므로 빈 문자열은 별도 제약이나 입력 검증으로 막아야 합니다.
[따라하기]
빈 폴더에 missing_values.py를 만들고 다음 코드를 저장합니다. 외부 패키지는 필요 없습니다.
```python
import json
text = """[
{"nickname": null, "points": 0},
{"nickname": "", "points": 5},
{"points": 7}
]"""
rows = json.loads(text)
def describe(row):
if "nickname" not in row:
return "키 없음"
if row["nickname"] is None:
return "없음"
if row["nickname"] == "":
return "빈 문자열"
return row["nickname"]
for number, row in enumerate(rows, 1):
print(f"{number}: nickname={describe(row)}, points={row['points']}")
```
macOS와 Linux에서는 `python3 missing_values.py`, Windows에서는 `py missing_values.py`로 실행합니다. 예상 결과는 다음과 같습니다.
```text
1: nickname=없음, points=0
2: nickname=빈 문자열, points=5
3: nickname=키 없음, points=7
```
첫 행의 점수 0은 그대로 보존됩니다. `if not row["points"]`로 검사했다면 0을 미입력으로 오해했을 것입니다. 이 코드는 운영체제에 따른 차이가 없습니다.
[흔한 실수]
`value or 기본값`은 0과 빈 문자열도 바꿉니다. `get()` 결과가 None이어도 키가 존재할 수 있으므로 `key in data`로 구분하세요. `COUNT(column)`은 NULL을 세지 않지만 `COUNT(*)`는 행을 셉니다.
[보안 주의]
권한 플래그의 `False`, `None`, 키 없음을 명시적으로 검증하고 알 수 없는 값은 거부합니다. 외부 JSON의 크기·문자열 길이와 자료형을 확인하세요. 로그에는 비밀번호나 토큰을 남기지 말고 로컬 가짜 데이터만 사용합니다.
[직접 해볼 과제]
네 번째 행에 `nickname: false`를 넣고 잘못된 자료형으로 거부하세요. `nickname` 키 없음은 `변경하지 않음`, null은 `삭제`, 빈 문자열은 `입력 오류`로 분류하는 함수를 만들고 각 경우를 테스트합니다.
[확인문제]
1. Python에서 0과 None을 `if not value`로만 검사하면 어떤 문제가 생기나요?
2. JSON 객체의 키 없음과 명시적인 null은 어떻게 다른가요?
3. SQL에서 NULL을 찾을 때 `= NULL` 대신 `IS NULL`을 쓰는 이유는 무엇인가요?
[다음 학습]
다음 확장 수업에서는 KB와 KiB, Mbps와 MB/s처럼 비슷해 보이는 데이터 단위를 구분합니다. 저장공간과 전송시간 계산을 로컬 코드로 확인합니다.
[공식 참고 자료]
Python 내장 상수 None
https://docs.python.org/3/library/constants.html#None
Python 참·거짓 판정 공식 문서
https://docs.python.org/3/library/stdtypes.html#truth-value-testing
RFC 8259 JSON 표준
https://www.rfc-editor.org/rfc/rfc8259.html
PostgreSQL 비교와 NULL 조건
https://www.postgresql.org/docs/current/functions-comparison.html
PostgreSQL NOT NULL 제약
https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-NOT-NULL
JSON Schema null 자료형
https://json-schema.org/understanding-json-schema/reference/null
- 이전글[EXT-005][기초] KB와 KiB, Mbps와 MB/s 구분하기 26.09.07
- 다음글[EXT-003][입문] 문자열 모양을 정규식으로 확인하기 26.09.07
댓글목록
등록된 댓글이 없습니다.
