오류
고친 사람 github-actions[bot]
오류는 일이 약속한 대로 끝나지 못했음을 알리는 말입니다. 서비스를 지켜볼 때는 실패로 끝난 요청을 셉니다. 서버를 점검할 때는 디스크나 네트워크가 낸 실패를 셉니다. 신뢰성 공학은 아직 밖으로 안 보이는 틀어진 내부 상태를, 코드는 실행 중 난 문제를 알리는 값을 오류라고 부릅니다.
쉽고 빠른 이해
무슨 일을 하는 말인가 — 무언가가 제대로 안 됐다는 것을 셀 때 붙이는 이름입니다. 주문 요청에 서버가 500 응답을 돌려줬다면 그 요청 하나가 오류 하나입니다.
왜 따로 세나 — 걸린 시간과 요청 양만 보면 서비스가 잘 도는 것처럼 보일 수 있습니다. 그 사이 요청 일부가 실패해도 두 값에는 안 보입니다.
어떻게 세나
- 요청마다 성공인지 실패인지 판정합니다
- 실패로 판정된 요청을 셉니다
- 전체 요청 가운데 몇이 실패했는지 비율로 봅니다
대가 — 무엇을 실패로 볼지는 사람이 정해야 합니다. 성공이라고 답한 응답에 틀린 내용이 실리면 상태 코드만 봐서는 안 잡힙니다.
뜻이 갈린다 — 같은 낱말이 맥락마다 다른 것을 셉니다. 시스템이 얼마나 믿을 만한지 다루는 신뢰성 공학에서 오류는 아직 밖으로 안 보이는 틀어진 상태입니다. 모니터링의 오류는 그 한 단계 뒤, 사용자에게 보인 실패입니다. 신뢰성 공학 글은 앞의 뜻으로, 모니터링 화면은 뒤의 뜻으로 읽습니다.
상세
이 절은 「오류」가 맥락마다 무엇을 세는지 가릅니다. 그중 백엔드 개발자가 가장 자주 만나는 실패한 요청을 길게 봅니다.
오류가 가리키는 것들
맥락은 넷입니다. 서비스가 잘 도는지 숫자로 계속 재는 일을 모니터링이라고 합니다. 서버의 디스크·네트워크 카드·메모리를 하나씩 살피는 일은 자원 점검입니다.
시스템이 얼마나 믿을 만하게 도는지를 다루는 분야는 신뢰성 공학입니다. 마지막 맥락은 코드가 실행되는 동안입니다.
| 맥락 | 오류가 가리키는 것 | 예 |
|---|---|---|
| 서비스 모니터링 | 실패로 끝난 요청 | 서버가 실패라고 답한 응답 · 틀린 내용을 실은 응답 |
| 서버 자원 점검 | 자원이 낸 실패 사건 | 디스크 읽기 실패 · 버려진 패킷 |
| 신뢰성 공학 | 결함 때문에 틀어진 내부 상태 | 잘못 계산된 채 메모리에 남은 합계 |
| 코드 실행 | 실행 중 난 문제를 알리는 값이나 객체 | 함수가 돌려준 오류 값 · 던져진 예외 |
네 뜻이 함께 가진 것은 하나입니다. 무언가가 기대한 대로 되지 않았다는 점입니다. 갈리는 것은 누가 무엇을 기대했느냐입니다.
통계에서 쓰는 영어 error 는 잰 값과 참값의 차이입니다. 우리말로는 대개 오류가 아니라 오차라고 부릅니다.
서비스 모니터링의 오류
요청을 받는 서비스를 지켜볼 때 흔히 네 값을 봅니다. 이 넷을 묶어 골든 시그널이라고 부릅니다.
지연과 트래픽만 보면 서비스가 요청을 많이 받으며 제때 답하는 것처럼 보일 수 있습니다. 그 사이 요청 일부가 실패하고 있어도 두 값에는 안 나타납니다. 오류는 이 빈틈을 따로 세는 신호입니다.
실패로 세는 세 갈래
웹 서비스의 응답에는 HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜) 상태 코드라는 세 자리 숫자가 붙습니다. 200번대는 성공을 뜻합니다. 500번대는 서버 쪽에서 실패했다는 뜻입니다.
상태 코드만으로 실패를 다 가리지는 못합니다. 요청이 실패했는지는 세 갈래로 판정합니다.
| 갈래 | 무엇인가 | 예 |
|---|---|---|
| 명시적 실패 | 응답이 스스로 실패라고 알린다 | 500번대 응답 |
| 암묵적 실패 | 성공이라고 알렸는데 내용이 틀렸다 | 주문 목록 요청에 200 과 함께 빈 목록이 실림 |
| 정책상 실패 | 내용은 맞지만 약속한 선을 넘겼다 | 1초 안에 답하기로 했는데 2초 걸림 |
명시적 실패는 세기 쉽습니다. 상태 코드만 보면 되기 때문입니다. 암묵적 실패는 응답 내용을 검사해야 드러납니다. 정책상 실패는 서비스가 무엇을 약속했느냐에 따라 달라집니다.
사용자가 잘못 보낸 요청에는 400번대 응답이 나갑니다. 이것을 서비스의 실패로 셀지는 서비스마다 정합니다. 서버가 약속을 못 지킨 정도를 재려는 것이라면 빼고 세는 경우가 많습니다.
오류는 개수보다 비율로 볼 때가 많습니다. 요청이 열 배로 늘면 실패 수도 따라 늘기 때문입니다. 전체 요청 가운데 실패한 요청의 비율이 오류율입니다.
지연 계산에 섞인 실패
실패한 요청은 성공한 요청보다 빨리 끝날 때가 있습니다. 데이터베이스 연결이 끊기면 서버는 기다리지 않고 곧바로 500 응답을 돌려줄 수 있습니다.
이렇게 일찍 끝난 실패를 지연 계산에 섞으면 평균 지연이 오히려 내려갑니다. 서비스는 나빠졌습니다. 그런데 지연 그래프는 좋아진 것처럼 보입니다.
느리게 실패하는 요청도 있습니다. 기다림을 끊는 타임아웃이 길게 잡혀 있으면 사용자는 오래 기다린 끝에 실패를 받습니다. 이런 실패는 반대로 평균 지연을 부풀립니다. 그래서 지연은 성공한 요청과 실패한 요청을 나눠 잽니다.
서버 자원 점검의 오류
USE 방법은 서버의 자원을 하나씩 점검하는 방법입니다. 이름은 Utilization Saturation Errors, 곧 사용률·포화·오류의 머리글자입니다. 자원마다 이 세 값을 확인합니다.
사용률은 자원이 일하느라 바빴던 시간의 비율입니다. 포화는 자원이 감당하지 못한 일이 밀려 기다리는 정도입니다.
앞의 골든 시그널 표에 나온 포화와 이름도 뜻의 뿌리도 같습니다. 둘 다 자원이 한계에 얼마나 가까운지를 봅니다. USE 방법은 그중 한계를 넘어 밀린 일에 초점을 둡니다.
이 점검에서 오류는 요청이 아니라 자원이 낸 실패 사건의 수입니다. 디스크가 읽기에 실패한 횟수가 한 예입니다. 네트워크 카드가 버린 패킷 수와 메모리를 받지 못한 할당 횟수도 여기 듭니다.
자원의 오류는 사용률과 포화로는 안 보입니다. 한가한 디스크도 읽기에 실패할 수 있기 때문입니다.
자원의 실패가 요청의 실패로 이어질 수 있습니다. 반대로 다시 시도해 성공하면 요청 쪽에는 흔적이 남지 않습니다. 그래서 자원의 오류 수와 요청의 오류 수를 한 값으로 섞지 않습니다.
신뢰성 공학의 오류
신뢰성 공학은 무언가가 잘못되는 과정을 세 단계로 나눠 부릅니다. 결함과 오류와 고장입니다.
| 단계 | 무엇인가 | 예 |
|---|---|---|
| 결함 (fault) | 코드나 부품에 숨은 잘못 그 자체 | <= 를 < 로 잘못 쓴 코드 한 줄 |
| 오류 (error) | 결함이 실행되어 틀어진 내부 상태 | 틀린 합계가 변수에 담김 |
| 고장 (failure) | 틀어진 상태가 밖으로 드러나 약속한 결과를 못 냄 | 사용자에게 틀린 금액이 나감 |
세 단계는 이어지지만 끝까지 가지 않을 수도 있습니다. 결함이 든 줄이 한 번도 실행되지 않으면 오류가 생기지 않습니다. 틀어진 상태가 검사에 걸려 바로잡히면 고장으로 번지지 않습니다.
오류가 고장으로 번지기 전에 막도록 시스템을 짓는 것이 결함 허용입니다. 틀어진 상태를 알아채 되돌리거나 다른 부품이 대신 일하게 합니다.
이 체계로 보면 모니터링이 세는 오류는 오류가 아니라 고장입니다. 사용자에게 드러난 실패이기 때문입니다. 신뢰성 공학 문서의 「오류」를 모니터링 화면의 「오류」로 읽으면 한 단계 어긋난 이야기를 하게 됩니다.
flowchart TD
A["결함 · 코드에 숨은 잘못"] -->|그 줄이 실행된다| B["오류 · 틀어진 내부 상태"]
A -->|실행되지 않는다| X["아무 일도 없다"]
B -->|검사에 걸려 바로잡힌다| Y["고장 없이 끝난다"]
B -->|밖으로 드러난다| C["고장 · 약속한 결과를 못 냄<br>모니터링은 이것을 오류라 센다"]
코드가 나르는 오류
프로그래밍 언어에서 오류는 실행 중에 난 문제를 알리는 값이나 객체입니다. Go 처럼 함수가 결과와 함께 오류 값을 돌려주는 언어가 있습니다. 문제가 나면 예외를 던지는 언어도 있습니다. 예외는 하던 일을 멈추고 문제를 호출한 쪽으로 올려 보내는 객체입니다.
자바는 던지는 문제를 두 이름으로 가릅니다. Error 는 프로그램이 잡으려 들지 말아야 할 심각한 문제입니다. 메모리가 바닥났을 때 나는 OutOfMemoryError 가 한 예입니다. 파일을 못 찾았을 때처럼 프로그램이 받아서 처리할 만한 문제는 Exception 입니다.
이 맥락에서 「오류를 잡는다」는 그 값이나 객체를 받아 처리한다는 뜻입니다. 잡힌 오류는 사용자에게 드러나지 않을 수 있습니다. 모니터링의 오류 수에 안 잡히는 까닭입니다.
어느 뜻인지 가르는 단서
문서나 대화에서 「오류」가 나오면 곁에 붙은 낱말을 봅니다. 대개 그것만으로 뜻이 갈립니다.
| 함께 나오는 말 | 뜻 |
|---|---|
| 모니터링 화면 · 500 응답 · 오류율 · 알림 | 실패한 요청 |
| 디스크 · 네트워크 카드 · 사용률 · 포화 | 자원이 낸 실패 |
| 결함 · 고장 · 결함 허용 | 틀어진 내부 상태 |
| 던진다 · 잡는다 · 스택 트레이스 | 코드가 나르는 오류 값 |
관련 항목
오류를 바탕으로 재는 지표
오류율 · 오류 예산 · 요청 성공률 · 가용성 · 서비스 수준 지표 · 서비스 수준 목표
오류와 나란히 서비스 상태를 재는 신호
골든 시그널 · 지연 · 트래픽 · 포화 · 사용률 · USE 방법 · RED 방법
요청을 실패로 판정하는 응답과 조건
HTTP · 상태 코드 · 500 Internal Server Error · 400 Bad Request · 타임아웃 · 응답 시간
신뢰성 공학에서 오류의 앞뒤에 서는 단계
결함 · 고장 · 장애 · 결함 허용 · 신뢰성 공학 · 부분 실패 · 연쇄 장애
자원 점검에서 세는 실패 사건
패킷 손실 · 재전송 · 오류 검출 · 체크섬 · ECC 메모리
코드가 오류를 알리고 받는 수단
예외 · 예외 처리 · 스택 트레이스 · Java · Go · OutOfMemoryError
오류를 보고 대응하는 운영 수단
모니터링 · 관측성 · 알림 · 온콜 · 사고 대응 · 재시도
오류와 헷갈리는 이웃 낱말
오차 · 버그 · 실패 · 경고
다른 이름: error · errors · 에러