터미널에 빨간 글씨가 촥 뜨면 심장이 덜컥 내려앉나요? "아, 또 망했네. AI한테 고쳐달라고 해야지." 하고 읽지도 않고 바로 복사하시나요?
개발자들도 에러를 매일 만나요. 다만 대처법이 다를 뿐이죠. 초보자는 에러를 **"실패 성적표"**라고 생각하고 두려워하지만, 개발자는 에러를 **"친절한 안내판"**이라고 생각해요.
"야, 너 15번째 줄에서 오타 냈어." 이걸 알려주는 거거든요. 얼마나 고마워요?
이 글을 읽고 나면:
- 빨간 글씨가 떠도 당황하지 않고 "음, 어디 보자" 할 수 있어요.
- 에러 메시지의 3요소를 찾을 수 있어요.
- 스택 트레이스라는 복잡한 지도를 읽는 법을 알게 돼요.
1. 에러 해부학: 3가지만 찾아라
에러 메시지가 영어로 길게 나와도 쫄지 마세요. 우리는 딱 3가지만 찾으면 돼요.
- WHAT (뭐가 문제야?): 에러의 이름 (Error Type)
- WHY (왜 문제야?): 상세 설명 (Message)
- WHERE (어디가 문제야?): 파일 위치와 줄 번호 (Stack Trace)

예시 상황
ReferenceError: 'kimchi' is not defined
at makeStew (index.js:5:10)
at main (index.js:10:5)
- WHAT:
ReferenceError(참조 에러) - WHY:
'kimchi' is not defined(김치라는 변수가 없어) - WHERE:
index.js:5:10(index.js 파일의 5번째 줄, 10번째 칸)
해석: "5번째 줄에서 'kimchi'를 쓰려고 했는데, 선언된 적이 없어서 못 찾겠어."
→ 해결: 5번째 줄 위에 const kimchi = ... 가 있는지 확인한다.
2. 자주 만나는 에러 친구들
개발하다 보면 맨날 보는 녀석들이 있어요. 이름만 알아도 반은 해결한 거예요.
① ReferenceError (이름표가 없어)
"너 아까 '철수'한테 돈 주라며? 근데 철수가 누군데?"
- 원인: 변수 선언(const/let)을 안 했거나, 오타가 났을 때.
- 해결: 오타 확인하기 (
usre->user), 선언 확인하기.
② SyntaxError (문법이 틀렸어)
"아버지 가방에 들어가신다."
- 원인: 괄호
()나 중괄호{}를 안 닫았을 때, 오타가 났을 때. - 특징: 코드가 아예 실행조차 안 됨.
- 해결: 빨간 줄 그어진 곳 앞뒤로 괄호 짝 맞추기.
③ TypeError (그건 그렇게 쓰는 거 아냐)
"냉장고한테 '달려'라고 명령하지 마."
- 원인: 숫자를 함수처럼 호출했거나,
null값에서 속성을 찾으려 할 때. - 예:
undefined.map is not a function(빈 데이터 가지고 반복문 돌리지 마)
3. 스택 트레이스(Stack Trace): 범인의 발자국
에러 메시지 밑에 at ... 하면서 줄줄이 나오는 거 있죠?
이게 바로 **범인의 발자국(Stack Trace)**이에요. 탐정처럼 발자국을 역추적해야 합니다.
Error: Something went wrong
at thirdFunction (app.js:30) <-- 💥 사고 현장 (가장 중요!)
at secondFunction (app.js:20) <-- 👣 발자국 2 (여기서 불렀고)
at firstFunction (app.js:10) <-- 👣 발자국 1 (여기서 시작됨)
- 제일 윗줄이 사고가 난 **'진짜 현장'**입니다.
- 밑으로 갈수록 시간 역순으로 "누가 얘를 불렀는지" 보여줍니다.
🕵️♂️ 수사 팁:
node_modules/... 라고 적힌 줄은 무시하세요.
그건 우리가 짠 코드가 아니라 외부 라이브러리(남의 코드)입니다.
거긴 죄가 없어요. **내 파일 이름(app.js, page.tsx)**이 나올 때까지 눈을 크게 뜨고 찾으세요.
4. 실전: 에러 읽기 연습 (상황극)
AI한테 무조건 "고쳐줘" 하기 전에, 먼저 읽어보고 "아, 이거구나" 한 뒤에 시켜보세요.
┌───────────────────────────────────────────────────────────────┐
│ 상황: 코드를 돌렸는데 이런 게 떴다. │
│ TypeError: Cannot read properties of null (reading 'name') │
│ at Dashboard (page.tsx:15:20) │
├───────────────────────────────────────────────────────────────┤
│ │
│ [초보자 반응] │
│ "으악! 영어다! 망했다! AI야 도와줘!" │
│ │
│ [Vibe Coder 반응] │
│ 1. WHAT: TypeError네. │
│ 2. WHERE: page.tsx 15번째 줄이네. │
│ 3. WHY: null의 name을 읽으려 했대. │
│ (아, 데이터가 아직 안 왔는데 화면에 이름을 찍으려 했구나!) │
│ │
│ 나: (AI에게) "야, page.tsx 15번째 줄에서 에러 났어. │
│ 데이터 로딩 중일 때는 로딩 표시(Spinner) 보여주게 고쳐줘." │
│ │
└───────────────────────────────────────────────────────────────┘
여러분이 이렇게 원인을 짚어서 말해주면, AI는 "와, 이 사람 뭘 좀 아네?" 하면서 훨씬 정확한 코드를 줍니다.
오늘의 핵심 정리
✅ 에러 메시지는 실패가 아니라 친절한 안내판이다. ✅ 3가지만 찾자: 무엇이(Type), 왜(Message), 어디서(Location). ✅ 스택 트레이스의 맨 윗줄(내 파일)이 범인이다.
✅ AI한테 요청할 때: (무지성 복붙 대신) "ReferecneError가 났어. 변수 이름 오타인 것 같은데 찾아줄래?"
셀프체크
이 글을 이해했다면 답할 수 있어요:
□ SyntaxError는 주로 언제 발생하나요? → (오타, 괄호 짝 안 맞음)
□ 에러 메시지에서 at index.js:10:5가 뜻하는 것은? → (index.js 파일 10번째 줄)
□ 스택 트레이스(발자국)가 여러 줄 나올 때, 가장 먼저 봐야 할 곳은? → (맨 윗줄 / 사고 현장)
□ node_modules가 포함된 에러 줄은 어떻게 해야 하나요? → (무시한다 / 내 파일이 아니므로)
다음 글 예고
에러 메시지가 이제 좀 덜 무섭게 느껴지나요? 에러를 읽을 줄 안다면, 이제 고칠 줄도 알아야겠죠?
다음 글에서는 **[AI와 디버깅하기]**를 다룰 거예요. AI를 "코드 짜주는 기계"가 아니라, "같이 머리 맞대고 고민하는 동료"로 활용해서 버그를 잡는 법을 배워봅시다.
이 시리즈 로드맵
PART 8: 독립 성장 [33편] 에러 메시지 읽는 법 (지금 여기!) ↓ [34편] AI와 디버깅하기 ↓ [35편] 기술 문서 읽기
최근에 만난 가장 황당했던 에러는 무엇이었나요? 댓글로 썰을 풀어주세요! 🤣