Windows 업데이트가 실패했을 때 오류 화면부터 확인하기
Windows 업데이트가 실패하면 같은 오류를 찾기 전에 화면의 단계와 문구를 적어 두세요. 다운로드 37%와 설치 실패는 다르며, 코드가 안 보인 것과 기록을 놓친 것도 구분해야 합니다.
지금 보이는 정보만 남긴 뒤 작업을 저장하고 다음 행동을 정합니다. 진행 중이면 관찰을 이어가고, 코드를 놓쳤다면 같은 대상의 화면·이력을 다시 확인합니다. 문제 해결사 실행과 재시작은 현재 작업과 변경 가능성을 확인한 뒤 별도로 선택합니다.
첫 점검과 기록표 작성은 Python 없이 할 수 있으며 JSON·Python 검산은 말미의 선택 부록입니다.
먼저 현재 화면 한 건을 그대로 옮기기
- 지금 표시된 Windows 업데이트 화면에서 시각·단계·원래 상태 문구를 메모합니다. 새 확인·재시도 버튼을 누르기 전에 현재 기록부터 남깁니다. Windows 11은 설정 → Windows 업데이트, Windows 10은 설정 → 업데이트 및 보안 → Windows 업데이트입니다.
- 업데이트 제목·KB·진행률은 보이는 값만 옮깁니다. 코드는 ‘표시됨 / 표시 안 됨 / 기록 못 함’으로 구분하고, 놓친 코드나 KB를 검색 결과로 채우지 않습니다.
- 작업 저장과 진행 중 전송·설치를 확인합니다. 기록표에 ‘재시작 또는 Get Help: 아직 실행 안 함’을 적어 조회와 실행을 구분합니다.
설명용 입력 ‘다운로드 중 / 37% / 코드 표시 안 됨’의 기대 기록은 ‘관찰 계속’입니다. 한 번 같은 숫자를 봤다는 이유로 실패나 설치 성공으로 적지 않습니다. ‘재시작 필요 / 작업 저장 안 됨’이면 저장부터 확인하고 재시작을 보류합니다.
읽기만 했다면 설정 창을 닫으면 됩니다. 화면을 놓쳤다면 ‘기록 못 함’과 그 이유를 보존하고, 같은 대상의 원래 화면·이력에서 확인 가능한 정보만 보완합니다. 공식 문제 해결사는 자동 수정을 할 수 있으므로 이 첫 과제의 필수 단계가 아닙니다.
확인 화면과 업데이트 기록을 먼저 읽기
Windows 11은 설정 → Windows 업데이트, Windows 10은 설정 → 업데이트 및 보안 → Windows 업데이트에서 현재 상태를 읽습니다. 버전·에디션은 설정 → 시스템 → 정보의 Windows 사양에서 확인합니다. 오류가 뜬 직후라면 같은 화면의 문구·코드·시각을 먼저 보존하고, 새로운 확인 버튼을 누르기 전에 어떤 상태였는지 남깁니다. Microsoft 업데이트 FAQ, 장치 버전 확인
업데이트 기록은 Windows 11의 Windows 업데이트 → 업데이트 기록, Windows 10의 Windows 업데이트 → 업데이트 기록 보기 경로에서 확인합니다. 실제 표시된 업데이트 제목·KB 번호·설치 날짜와 상태를 옮깁니다. KB가 안 보이면 ‘미확인’으로 남깁니다. 비슷한 검색 결과의 KB를 내 실패 기록에 채우지 않습니다. 기록 보기는 업데이트 제거와 별개이며, 이 글에서 제거를 진행하지 않습니다.
네 단계와 세 코드 상태를 나누기
다음 단계 이름은 관찰을 일관되게 적기 위한 이 글의 구분입니다. PC마다 실제 문구와 화면이 다를 수 있으므로 원래 문구도 함께 보관합니다.
| 관찰 단계 | 기록할 내용 | 혼동하기 쉬운 판단 |
|---|---|---|
| 확인 | 확인 중/실패 문구, 대상 제목이 보이는가 | 제목이 없는데 임의 KB를 붙임 |
| 다운로드 | 진행률과 관찰 시각, 화면의 현재 문구 | 같은 숫자를 한 번 봤다고 실패로 확정 |
| 설치 | 설치 중/실패와 코드가 표시된 위치 | 다운로드 코드와 설치 코드를 섞음 |
| 재시작 | 재시작 필요인지, 이미 재시작 뒤 돌아온 상태인지 | 재시작 필요를 설치 성공 완료와 같게 기록 |
코드 칸에는 세 가지 상태를 씁니다. 표시됨은 직접 읽은 문자열을 원문대로 기록한 상태입니다. 표시 안 됨은 그 관찰 화면에 코드가 없음을 확인한 상태이고, 기록 못 함은 봤는지 또는 내용을 놓쳐 값이 없는 상태입니다. 뒤의 둘은 모두 빈 코드지만 다음 행동은 달라집니다. 놓친 기록을 오류 없음으로 바꾸지 마세요.
오류 코드는 원인 전체를 확정하는 문장이 아닙니다. Microsoft의 업데이트 문제 문서에는 코드와 가능한 원인·절차가 제시되어 있습니다. 내 코드·OS·실패 단계가 같은지 확인한 뒤 해당 절차의 조건을 읽어야 합니다. 다른 PC가 같은 코드로 해결됐다고 내 PC에도 같은 원인이라고 기록하지 않습니다. Microsoft 업데이트 문제 안내

저장·전원·연결을 확인하고 공식 경로 선택하기
재시도나 재시작 전에 문서를 저장하고 중요한 개인 파일의 백업을 확인합니다. 전원과 인터넷 연결 상태, 실제 남은 공간을 읽어 두세요. 공간이 부족하다는 화면이 없는데 코드만으로 자료 삭제를 시작하지 않습니다. 회사 관리 PC에서 업데이트가 제한되거나 관리자 권한을 요구하면 담당자에게 정확한 기록을 전달합니다. 방화벽·백신·VPN을 끄거나 정책을 우회해 설치하지 않습니다.
단계·코드·업데이트 이력을 읽어 기록하는 단계는 조회입니다. Get Help의 Windows Update 문제 해결사는 자동 진단과 수정을 시도할 수 있어 별도 실행 판단입니다. 기록표를 완성하기 위해 반드시 시작할 필요는 없습니다. 실행을 검토한다면 먼저 원래 업데이트 상태·진행 중 작업·개인 파일 백업과 허용할 변경 범위를 확인합니다. 자동 수정의 범위를 알 수 없거나 회사 관리 조건이 불명확하면 공식 지원·담당자에게 먼저 확인하고 실행을 보류합니다. 현재 공식 일반 경로는 설정 → 시스템 → 문제 해결 → 다른 문제 해결사 → Windows 업데이트 → 실행입니다. Windows 10의 일반 경로는 설정 → 업데이트 및 보안 → 문제 해결 → 추가 문제 해결사입니다. 제공 화면이 다르거나 Get Help를 열 수 없으면 같은 메뉴가 있다고 가정하지 말고 공식 지원 페이지와 관리 담당자를 이용합니다. Microsoft Windows 업데이트 문제 해결사
실행을 선택한 경우에는 안내하는 대상과 변경을 읽고, 예상 밖 관리자 권한·서비스/설정 변경·자료 삭제나 다른 대상 변경을 요구하면 해당 단계에서 중단합니다. 실행 결과·실제로 확인된 변경·남은 오류·재시작 요구를 기록합니다. ‘실행 완료’만으로 업데이트 설치 성공이라고 쓰지 않습니다. 다음 확인 때 같은 대상의 상태와 코드가 유지되는지 비교하세요. 일반 진단으로 해결되지 않으면 오류 기록을 보존해 지원받습니다. 캐시 폴더 전체 삭제, 서비스 일괄 변경, 레지스트리 명령, OS 재설치는 이 기록법의 기본 조치가 아닙니다.
재시작 필요와 설치 완료를 따로 확인하기
화면에 재시작 필요가 뜬 경우에는 열려 있는 작업을 저장하고 파일 복사·동기화·다른 설치가 진행 중인지 확인합니다. 저장하지 못한 자료가 있으면 재시작을 보류합니다. 정상 메뉴의 재시작 또는 표시된 업데이트 후 다시 시작을 사용하고, 진행 중 전원을 강제로 끄지 않습니다. Microsoft는 설치 적용을 위한 재시작 전 작업 저장과 앱 종료를 안내합니다. 업데이트 문제 안내의 재시작 절차
지금 재시작하기 어렵고 해당 옵션이 제공되면 Windows 업데이트의 다시 시작 예약에서 시간을 정할 수 있습니다. 예약은 오류 원인을 고치는 조치가 아닙니다. 전원 연결과 저장 상태를 다시 확인하고, 완료 뒤 같은 업데이트 제목·KB의 기록과 Windows 업데이트 상태를 읽습니다. 작업 시간이 문제라면 활성 시간 설정을 별도로 확인하되 현재 값을 적어 두고 조정한 항목만 원래 값으로 되돌릴 수 있게 합니다. Microsoft 재시작 예약 설명, 활성 시간 안내
재시작 뒤 바탕화면이 나왔다는 사실만으로 대상 업데이트가 설치됐다고 결론 내리지 않습니다. 반대로 ‘재시작 필요’는 곧바로 실패 코드도 아닙니다. 업데이트가 진행 중일 때 상태가 잠시 그대로라는 이유로 강제 종료하거나 진행률을 임의로 완료로 바꾸지 마세요.
지원 담당자에게 전달할 빈 기록 양식
관찰 시각 / Windows 버전·에디션·빌드:
실패 단계 / 화면의 원래 상태 문구 / 진행률:
업데이트 제목 / 실제 표시된 KB 또는 미확인:
코드 상태(표시됨·표시 안 됨·기록 못 함) / 원문 코드:
전원·인터넷·남은 공간의 관찰 / 작업 저장·백업:
읽기 전용 기록 완료 / Get Help 별도 실행 판단:
실행 전 원래 상태·허용 변경 범위 / 백업·관리 담당자 확인:
문제 해결사 경로 / 실제 결과·변경 / 재시작 요청:
예상 밖 권한·변경 / 중단 지점 / 원복 미확인 항목:
재시작 뒤 같은 대상의 이력·상태 / 남은 오류:
조정한 예약·활성 시간의 원래 값 / 원복한 값:
다음 지원 경로 / 아직 모르는 항목:
공개 문의에는 이름·기기 이름·회사 경로와 개인정보가 드러나는 화면을 가립니다. 알 수 없는 항목을 그대로 남기는 편이 잘못된 KB와 코드를 붙여 다른 절차를 적용하는 것보다 안전합니다.
단계·코드·이력을 읽기만 했다면 이 점검이 만든 설정 변경은 없습니다. Get Help를 별도로 실행했다면 진단이 실제로 무엇을 바꿨는지 결과와 현재 상태를 확인합니다. 변경 내역이 불명확하거나 원래 값과 대조할 수 없으면 ‘원복 완료’라고 확정하지 말고 기록을 보존해 공식 지원·담당자에게 확인합니다. 모든 자동 수정에 공통 실행 취소가 있다고 가정하지 않습니다.
실제로 예약이나 활성 시간을 조정했다면 이전 값을 대조해 확인한 해당 설정만 복원합니다. 설치된 업데이트를 ‘원래 상태 복구’라는 이유로 임의 제거하지 않습니다. 제거 가능 여부와 위험은 별도 지원 절차에서 판단해야 합니다.
공식 공개 이슈는 Windows Release Health에서 자신의 버전 페이지를 확인할 수 있습니다. 비슷한 증상만 보고 그 이슈가 내 PC의 원인이라고 확정하지 않습니다. 텍스트 기록을 칸으로 나누는 연습이 필요하면 로그에서 시각과 코드를 분리하는 실습을 참고하세요. 그 글의 ERR-14 같은 가상 서버 표식은 실제 Windows 업데이트 오류 코드로 사용하지 않습니다.
현재 지원 조건과 검증 한계
Windows 10 일반 22H2의 지원 종료일은 2025-10-14입니다. ESU 등록 조건과 LTSC 수명주기는 별도입니다. Windows 11은 같은 이름이어도 버전·Home/Pro와 Enterprise/Education의 지원 기간이 다르므로 설치된 에디션과 지원 열을 대조합니다. 업데이트 메뉴가 열린다는 것만으로 지원 중이라고 판단하지 않습니다. Microsoft 지원 버전 표, ESU 안내
Linux Python 3.12.14에서 합성 다섯 행, 코드 상태 모순 거부, 정상 사본 복구와 12개 검사를 실제 실행했습니다. 입력 바이트는 유지됐습니다. 실제 Windows 업데이트 상태·오류코드·Get Help 진단/수정·다운로드·설치·재시작 성공과 변경 복원은 측정하지 않았으며, 합성 분류 통과가 Windows 원인 확정이나 해결 증거가 되지 않습니다.
선택 부록 Python과 합성 입력을 따로 검산하기
앞의 작은 점검과 빈 기록표를 완성했다면 이 부록을 실행하지 않아도 됩니다. 아래 코드는 합성 기록의 기대 분류를 검사하며 Windows·기기·서비스를 복구하지 않습니다. 먼저 표의 입력과 기대값을 눈으로 대조하세요. Python이 이미 설치되어 있고 기본 실행 방법을 아는 경우에만 선택해서 재현합니다.
기존 설치에 맞춰 python --version 또는 py --version 등으로 실행 이름과 버전을 확인합니다. Python 3.12가 확인됐다면 python, py -3.12 또는 python3.12 중 실제 설치에서 동작하는 명령을 사용합니다. 본문의 python3.12 표기는 작성 환경의 실행 이름이며 모든 Windows 설치의 명령을 보장하지 않습니다. 실행 이름을 찾지 못하면 이 부록을 멈추고 표를 수동 대조합니다. 이 점검을 위해 새 설치·PATH·보안 설정 변경은 필요하지 않습니다.
독립된 가상 관찰 다섯 개의 기대값
U1~U5는 서로 다른 가상 관찰입니다. 한 PC에서 연속으로 발생한 실제 이력이나 실제 KB 번호가 아닙니다. 가상 업데이트-B~E도 분류 연습용 이름입니다. U3의 0x80070005는 공식 문서에 실재하는 코드 문자열을 빌린 합성 입력이며 실제 PC에서 관찰한 오류가 아닙니다.
| 입력 | 관찰 | 기대하는 다음 행동 |
|---|---|---|
| U1 확인 실패 | 코드 표시 안 됨, 대상 제목 미확인 | 빈 코드 보존 후 공식 진단 실행 여부 검토 |
| U2 다운로드 중 | 37%, 코드 표시 안 됨 | 관찰 계속, 실패로 만들지 않음 |
| U3 설치 실패 | 합성 코드 0x80070005를 표시됨으로 입력 | 단계·코드를 보존하고 공식 진단 실행 여부 검토 |
| U4 재시작 필요 | 작업 저장 안 됨 | 저장부터, 재시작 보류 |
| U5 설치 실패 | 코드 기록 못 함 | 원래 화면·이력에서 정보 보완 |
아래를 synthetic_input.json으로 저장합니다. code가 null인 것은 0이나 0x00000000을 읽었다는 뜻이 아닙니다. percent는 해당 화면에서 기록한 값만 쓰며, elapsed나 성공 여부를 자동 추정하지 않습니다.
[
{
"id": "U1",
"stage": "checking",
"status": "failed",
"update_label": null,
"code_state": "not_shown",
"code": null,
"percent": null,
"saved": true
},
{
"id": "U2",
"stage": "downloading",
"status": "in_progress",
"update_label": "가상 업데이트-B",
"code_state": "not_shown",
"code": null,
"percent": 37,
"saved": true
},
{
"id": "U3",
"stage": "installing",
"status": "failed",
"update_label": "가상 업데이트-C",
"code_state": "shown",
"code": "0x80070005",
"percent": null,
"saved": true
},
{
"id": "U4",
"stage": "restarting",
"status": "restart_required",
"update_label": "가상 업데이트-D",
"code_state": "not_shown",
"code": null,
"percent": null,
"saved": false
},
{
"id": "U5",
"stage": "installing",
"status": "failed",
"update_label": "가상 업데이트-E",
"code_state": "not_captured",
"code": null,
"percent": null,
"saved": true
}
]
아래 전체 코드는 analyze.py로 저장합니다. 상태별 다음 확인을 출력하는 합성 기록 검사입니다. 8자리 16진수 코드의 형식만 검사하며 모든 코드의 실재·의미를 검증하는 데이터베이스가 아닙니다. 실제 기록에는 직접 관찰한 문자열만 넣습니다. cause는 모든 결과에서 null로 남깁니다.
"""Classify synthetic observations, never operate Windows Update."""
import json
import re
import sys
from pathlib import Path
def classify(rows):
if not isinstance(rows, list):
raise ValueError('records must be a list')
out, ids = [], set()
for r in rows:
if not isinstance(r, dict) or set(r) != {'id', 'stage', 'status', 'update_label', 'code_state', 'code', 'percent', 'saved'}:
raise ValueError('invalid record fields')
if not isinstance(r['id'], str) or not r['id'].strip() or r['id'] in ids:
raise ValueError('invalid or duplicate id')
ids.add(r['id'])
if r['stage'] not in ['checking', 'downloading', 'installing', 'restarting']:
raise ValueError('invalid stage')
if r['status'] not in ['failed', 'in_progress', 'restart_required']:
raise ValueError('invalid status')
if r['status'] == 'restart_required' and r['stage'] != 'restarting':
raise ValueError('restart_required needs restarting stage')
if r['update_label'] is not None and (not isinstance(r['update_label'], str) or not r['update_label'].strip()):
raise ValueError('invalid update label')
if r['code_state'] not in ['shown', 'not_shown', 'not_captured']:
raise ValueError('invalid code state')
if r['code_state'] == 'shown':
if not isinstance(r['code'], str) or not re.fullmatch(r'0x[0-9A-Fa-f]{8}', r['code']):
raise ValueError('invalid shown code format')
elif r['code'] is not None:
raise ValueError('unobserved code must be null')
if r['percent'] is not None and (type(r['percent']) is not int or not 0 <= r['percent'] <= 100 or r['stage'] not in ['downloading', 'installing']):
raise ValueError('invalid progress percent')
if type(r['saved']) is not bool:
raise ValueError('saved must be bool')
if r['status'] == 'restart_required':
next_step = 'normal_restart_candidate' if r['saved'] else 'save_before_restart'
elif r['status'] == 'in_progress':
next_step = 'continue_observing'
elif r['code_state'] == 'not_captured':
next_step = 'collect_missing_code'
else:
next_step = 'record_and_consider_diagnostics'
out.append({'id': r['id'], 'stage': r['stage'], 'code': r['code'], 'next': next_step, 'cause': None})
return out
if __name__ == '__main__':
try:
if len(sys.argv) != 2:
raise ValueError('usage: python analyze.py INPUT.json')
print(json.dumps(classify(json.loads(Path(sys.argv[1]).read_text(encoding='utf-8'))), ensure_ascii=False, indent=2))
except (ValueError, OSError, TypeError) as exc:
print('INPUT_ERROR: ' + str(exc), file=sys.stderr)
sys.exit(1)
Python 3에서 python analyze.py synthetic_input.json을 실행하면 next는 순서대로 record_and_consider_diagnostics, continue_observing, record_and_consider_diagnostics, save_before_restart, collect_missing_code입니다. 코드가 남는 것은 U3뿐이고 다섯 cause는 모두 null입니다. record_and_consider_diagnostics는 기록 후 공식 진단 실행 여부를 별도로 검토하라는 뜻입니다. 코드가 변경 허용 범위를 확인하거나 문제 해결사를 실행하지 않습니다. 이 출력으로 설치 성공 건수나 오류 해결률을 계산하지 않습니다.
없는 코드를 넣은 사본을 거부하고 복구하기
U1은 ‘표시 안 됨’인데 사본의 code만 0x80070005로 채우면 unobserved code must be null 오류로 종료 코드 1이 나와야 합니다. 코드의 모양이 맞아도 관찰 상태와 모순되므로 통과시키지 않습니다. 원래 합성 입력을 다시 복사한 synthetic_recovered.json을 검사하면 처음 다섯 결과가 돌아옵니다.
실제 코드가 누락된 경우에는 기대값을 만들기 위해 null을 검색한 숫자로 바꾸지 않습니다. 원래 화면이나 같은 대상의 기록에서 확인됐을 때만 새 관찰 행을 남깁니다. U4의 saved를 true로 바꾸면 normal_restart_candidate가 되지만, 그 값만 바꾼 것이 실제 문서 저장의 증거는 아닙니다. 검사 코드는 사람의 기록을 믿고 분류하므로 작업의 실제 보존 여부는 직접 확인해야 합니다.