일상과 잡동사니

컴퓨터 전원을 발로 껐다 켜면 생기는 코드 버그

조제복 2025. 6. 6. 22:04
반응형

컴퓨터 전원을 발로 껐다 켜는 식의 비정상적인 전원 차단은 소프트웨어 코드 차원에서 버그로 이어지는 여러 간접적인 원인이 될 수 있습니다. 여기서 말하는 '코드 버그'란, 단순히 전원 꺼짐 그 자체가 아니라, 이로 인해 운영체제, 파일 시스템, 메모리 상태, 혹은 캐시 정보가 손상되면서 발생하는 버그를 의미합니다. 다음은 그 구체적인 내용입니다.


비정상 전원 종료가 코드 버그를 유발하는 메커니즘

1. 메모리 캐시/버퍼 미반영 → 데이터 손상

  • 많은 프로그램은 데이터를 처리하면서 메모리에 임시 저장한 후, 일정 시간이 지나거나 이벤트가 발생할 때 디스크에 씁니다.
  • 이 상태에서 강제로 전원이 차단되면, 디스크에 기록되지 않은 데이터가 유실되고, 다음 실행 시 **이상한 상태(inconsistent state)**로 진입합니다.

💡 예: 설정 파일이 중간에 끊겨서 JSON 파싱 에러, SQLite 파일이 손상되어 쿼리 실패 등


2. 파일 시스템 손상 → 코드 불안정

  • ext4, NTFS, APFS 등 파일 시스템은 복잡한 트리 구조와 메타데이터를 갖고 있습니다. 전원 차단 시 이 구조가 망가질 수 있고,
    • 파일이 존재하지만 읽을 수 없음
    • 파일 사이즈 mismatch
    • 파일이 있지만 내부 데이터는 0으로 초기화됨
  • 이로 인해 코드 내 파일 열기 / 파싱 단계에서 예기치 못한 예외가 발생합니다.

3. DB 트랜잭션 미완료 → 데이터 무결성 위반

  • SQLite, MySQL, PostgreSQL 같은 DB는 트랜잭션 도중 디스크 쓰기 중단되면, 무결성이 깨질 수 있습니다.
  • 전원이 꺼지면서 COMMIT이 완료되지 못하고, WAL 파일만 남는 경우, 다음 실행 시 어플리케이션이 DB 일관성 오류로 중단됩니다.

예:

sqlite3.DatabaseError: database disk image is malformed

4. 코드 캐시 또는 컴파일 캐시 손상

  • Python의 .pyc, Node.js의 캐시 파일, Java의 .class 파일 등이 컴파일 도중 중단되면,
    • 다음 실행 시 캐시 파일이 존재하지만 손상되어 실행 실패
    • 모듈 임포트 중단, 예외 발생

예:

ImportError: bad magic number in .pyc file

5. 상태 기반 애플리케이션의 상태 불일치

  • 상태를 저장하는 앱 (예: IDE, 게임, 크롬, VSCode 등)은 종료 시 last session을 저장합니다.
  • 전원 차단으로 상태 저장이 누락되면,
    • 다음 실행 시 ‘예상치 못한 종료’ 경고
    • 프로젝트 로딩 실패
    • 비정상 동작 (열리지 않는 탭, 깨진 설정 등)

6. 저수준 OS 또는 라이브러리 단 에러

  • 특히 리눅스에서 journal이 손상되거나 systemd 서비스 설정이 꼬이면, 부팅조차 되지 않거나 다음과 같은 오류가 발생할 수 있습니다.
Failed to start Journal Service
Systemd: Unit xyz.service entered failed state

실무에서 발생하는 사례 정리

상황 발생 버그 예시 원인

JSON 설정파일 저장 중 전원 차단 파싱 오류로 앱 실행 안됨 파일이 중간에 끊김
DB 작업 중 전원 차단 데이터 중복/누락, 무결성 위반 트랜잭션 미완료
웹 서버 중단 후 재기동 안됨 포트 점유, lock file 남음 소켓/세션이 미정리 상태
파이썬 모듈 실행 실패 bad magic number .pyc 손상
캐시가 깨져 웹페이지 비정상 동작 스타일, JS 동작 오류 캐시된 리소스 불완전

예방법 및 해결 팁

  1. 코드 상의 방어적 프로그래밍
    • JSON, YAML, XML 등 파싱 시 예외 처리 철저히
    • 설정파일 저장 시 atomic write 방식 사용 (임시파일 → rename)
  2. DB 사용 시
    • 트랜잭션 처리 시 WAL 모드 활성화
    • 정기적 백업 및 복구 스크립트 마련
  3. 파일 시스템 보호
    • journaling 파일시스템 사용 (ext4, NTFS 등)
    • 정기적으로 chkdsk, fsck 수행
  4. 전원보호 장치 활용
    • 데스크탑은 UPS 장착 시 예기치 않은 종료 예방
  5. 코드 빌드시 캐시 클리어 자동화
    • 파이썬 등은 실행 전 .pyc 삭제 스크립트 포함

코드를 아무리 잘 짜도, 물리적 충격(발로 끄기, 정전) 앞에서는 무방비입니다. 그러나 이와 같은 불안정 상황을 코드적으로 감지하고, 복구하며, 재시도 로직을 마련해두는 것이 진정한 백엔드 실력이라 할 수 있습니다.

단순히 버그를 잡는 것이 아니라, 시스템이 망가져도 버틸 수 있는 코드를 짜는 습관이 필요합니다. 그 첫걸음이 바로 ‘비정상 종료를 가정한 설계’입니다.


반응형