[EXT-004][기초] 없는 값과 빈 값을 구분하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[EXT-004][기초] 없는 값과 빈 값을 구분하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 23회 작성일 26-09-07 17:34

본문

[이번 수업]
`없음`, 빈 문자열, 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

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
5,057
어제
6,862
최대
16,772
전체
771,008
Copyright © 소유하신 도메인. All rights reserved.