01 / 15
SESSION 32 · Part 6 서버/DB
로깅과 에러 처리 —
서비스의 블랙박스
로그 레벨 · try/catch · 스택 트레이스 · Sentry
02 / 15
🎯
이 세션에서
배우는 것
📊
로그 레벨
DEBUG / INFO / WARN / ERROR — 각 레벨의 의미와 사용 시점
🛡️
에러 처리
try/catch로 예상 가능한 오류를 잡아 서비스 중단 방지
🔭
중앙 모니터링
Sentry로 프로덕션 에러를 실시간 수집·알림하는 방법
03 / 15
📋
로그 — 서비스의 일기장
서버가 실행되는 동안 무슨 일이 일어났는지를 기록하는 텍스트 기록.
에러가 발생했을 때 원인을 파악하는 첫 번째 도구이다.
[2026-04-22 14:32:01] INFO 서버 시작됨 (포트: 3000)
[2026-04-22 14:32:45] INFO GET /api/users 200 OK (45ms)
[2026-04-22 14:33:12] WARN DB 응답 지연 감지 (2340ms)
[2026-04-22 14:33:58] ERROR 결제 처리 실패 - 외부 API 연결 불가
[2026-04-22 14:34:02] ERROR 스택 트레이스: PaymentService.charge()
at checkout.js:142
04 / 15
로그 레벨 — 4단계 중요도
상황의 심각도에 따라 적절한 레벨을 선택한다.
DEBUG
디버그
개발 중 상세 정보.
운영 환경에서는 끔
INFO
정보
정상적인 일반 이벤트.
서버 시작, API 호출
WARN
경고
잠재적 문제.
지금은 동작하지만
주의 필요
ERROR
에러
즉시 조치 필요.
기능이 실패한
심각한 오류
운영 환경에서는 보통 INFO 이상만 기록. DEBUG는 성능에 영향을 준다.
05 / 15
🛡️
try-catch 메커니즘 —
더 깊게 이해하기
try-catch가 에러를 처리하는 방식은 단순히 "에러를 잡는다"가 아니다.
1
코드 실행 (try 블록)
정상 흐름의 코드가 실행된다. 에러가 없으면 catch 블록은 건너뛴다.
2
에러 발생
에러 객체가 생성되고 실행이 즉시 중단된다. 에러 타입(TypeError, NetworkError 등)이 담긴다.
3
catch 블록 진입
에러 객체를 받아 처리한다. 로그를 남기고, 사용자에게 친절한 메시지를 보여줄 수 있다.
4
복구 또는 기본값 반환
서비스가 멈추지 않도록 안전한 기본값을 반환하거나 대안 동작을 수행한다.
06 / 15
🛡️
try/catch — 에러 안전망
예상 가능한 오류를 잡아 서비스가 멈추지 않게 보호한다.
async function getUserData(userId) {
try {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
logger.info(`사용자 조회 성공: ${userId}`);
return data;
} catch (error) {
// 오류를 잡아 서비스 중단 방지
logger.error(`사용자 조회 실패: ${error.message}`);
return null; // 안전한 기본값 반환
}
}
catch 블록에서 로그를 남기고, 사용자에게는 친절한 에러 메시지를 보여준다.
07 / 15
📊
로그 레벨 활용 —
실제로는 어떻게?
운영 중인 시스템에서 로그 레벨은 어떻게 구분해서 사용할까?
🔵 DEBUG
개발 중 상세 로그
→
🟢 INFO
정상 운영 이벤트
→
🟡 WARN
주의 필요한 상황
→
🔴 ERROR
즉시 조치 필요
핵심: 운영 환경에서는 DEBUG를 끄고 INFO 이상만 남겨 성능과 가독성을 유지한다.
08 / 15
🔍
스택 트레이스 — 에러의 발자국
에러가 발생했을 때 어떤 함수들이 호출되었는지 보여주는 추적 경로.
Error: 결제 처리 실패
at PaymentService.charge (payment.js:142:7)
at OrderController.submit (order.js:88:23)
at Router.post (router.js:45:11)
at expressApp (app.js:12:3)
1
가장 위 줄이 에러 발생 지점
payment.js 142번 줄 — 여기서 실제로 에러가 발생했다
2
아래로 갈수록 호출한 곳
order.js → router.js → app.js 순서로 호출되어 왔음을 알 수 있다
09 / 15
📱
실생활에서
이렇게 쓰여요
우리가 매일 사용하는 앱과 서비스 속에 로깅과 에러 처리가 녹아 있다.
🛒
쿠팡 결제 오류 메시지
"잠시 후 다시 시도해주세요" — try/catch로 결제 에러를 잡아 서비스를 멈추지 않고 친절하게 안내한다.
💛
카카오 장애 공지
ERROR 레벨 로그가 급증하면 팀에 알림이 가고, 장애를 인지한 즉시 공지를 낼 수 있다.
🔭
Sentry 에러 알림
배포 직후 에러 급증을 Sentry가 감지해 슬랙으로 알림을 보내 빠른 롤백을 가능하게 한다.
💡 이 개념이 없다면 서비스가 에러로 멈춰도 개발자가 한참 뒤에야 인지하게 된다.
10 / 15
💡
자주 하는
오해 바로잡기
이렇게 생각하기 쉽지만, 실제로는 조금 다릅니다.
❌ 흔한 오해
- 에러는 모두 개발자의 버그다
- 로그는 개발자만 보는 것이다
- 에러를 숨기면 사용자가 편하다
✓ 실제로는
- 네트워크 오류, 외부 API 실패 등 예상 가능한 에러도 존재한다
- 운영팀·고객센터도 로그를 분석해 장애 원인을 파악한다
- 에러를 숨기면 나중에 디버깅이 훨씬 어려워진다
11 / 15
🔭
Sentry — 프로덕션 에러 추적
운영 중인 서비스의 에러를 실시간으로 수집하고 팀에 알림을 보내는 서비스.
⚡
실시간 알림
에러 발생 즉시 슬랙, 이메일로 팀에 알림. 사용자 신고 전에 먼저 인지
📊
에러 집계
같은 에러가 몇 번 발생했는지, 어떤 사용자에게 영향을 미쳤는지 대시보드로 확인
🗺️
소스맵 연동
Minify된 배포 코드의 에러를 원본 소스 파일 위치로 변환해 보여줌
👤
사용자 컨텍스트
에러 발생 시 사용자 정보, 브라우저, 수행 중이던 동작까지 기록
12 / 15
🤖
이걸 알면
AI와 이렇게 대화해요
로깅과 에러 처리를 이해하면 Claude나 ChatGPT를 훨씬 잘 활용할 수 있다.
🤖
어떤 에러인지 알려주시면 도와드릴게요. 에러 메시지가 있나요?
👤
TypeError: Cannot read properties of undefined라고 나와요. 에러 메시지와 스택 트레이스를 읽는 방법이랑 원인 찾는 법 알려줘.
🤖
스택 트레이스에서 맨 위 줄이 에러 발생 지점입니다. "Cannot read properties of undefined"는 null/undefined 변수에 접근했다는 뜻으로, 옵셔널 체이닝(?.)을 사용해 방어하면 됩니다.
13 / 15
✅
이렇게
이해하셨나요?
✅
맞게 이해하셨어요
try-catch는 예상 가능한 에러를 잡아 서비스를 보호한다
❌
이렇게는 아니에요
모든 에러는 막을 수 있고 발생해서는 안 된다
✅
맞게 이해하셨어요
로그는 시스템 상태를 기록하는 서비스의 블랙박스다
❌
이렇게는 아니에요
에러는 항상 개발자의 실수로만 발생한다
💪 서비스를 안정적으로 운영하는 눈이 생겼습니다!
14 / 15
✈️
로그는
비행기 블랙박스다
평소엔 아무도 보지 않지만, 사고(에러) 발생 시 원인을 파악하는 결정적 단서가 된다.
✈️ 블랙박스 비유
블랙박스
=
서버 로그 — 모든 이벤트를 기록
비행 데이터
=
INFO 로그 — 정상 운항 기록
이상 신호
=
WARN 로그 — 주의가 필요한 상황
사고 기록
=
ERROR 로그 — 즉시 조치 필요한 장애
항공 관제탑
=
Sentry — 실시간 모니터링 & 알림
15 / 15
🚀
다음 세션
Session 33 · 클라우드 컴퓨팅 개요
완성된 서비스를 전 세계가 접근할 수 있도록 인터넷에 배포하는 방법 —
클라우드와 배포의 세계, Part 7에서 시작한다.
💡 기억할 것: 로그는 블랙박스 — 기록이 없으면 재현하기 매우 어렵다.