1장 에러가 왜 무서울까?

사람들이 에러 메시지를 보고도 넘어가거나 에러를 무서워 하는 이유가 뭘까?

코드가 작동하지 않는 상황에 발생하는 에러는 크게 두 가지로 나눌 수 있다. 에러를 읽는 것만으로도 해결할 수 있는 문제와 원인 파악이 필요한 문제다.

1. 에러를 읽지 않게 되는 이유

01. 이유 1 : 에러가 영어라서

에러에 대해서는 자신이 없는 사람도 많다. 에러를 대하는 마음가짐을 바꾸는 것이다. 에러를 읽지 않게 되는 이유는 가장 큰 것이 에러가 영어로 표기되기 때문

편하게 에러를 읽을 수 있는 포인트를 찾기!

  • 코드 양이 적은 것은 바로바로 읽자

1) 간단한 문법 지식만 있으면 OK

영어가 능숙하지 않은 사람이라면 일상 회화 수준의 영어를 당장 익히는 것은 어렵지만 에러 내용을 읽는 것은 그렇게 어렵지 않다는 것!

에러는 문장의 형식이 정해져 있으므로 사용하는 단어도 한정적이다.

X is not definded

define =정의하다라는 의미 이며, is not defied는 be동사 + not(부정) + 과거분사인 수동태의 부정문으로 정의되어 있지 않은 상태를 의미

기본적으로 문장을 읽을 때는 주어와 술어를 확인해야 한다.

먼저, 문법에 집중하여 메시지와 의미를 확인하쟈

2) 주어가 생략된 케이스

Cannot read properties of null

null 속성을 읽을 수 없다.

  1. 술어 : Cannot read

  2. 주어 : The program

대부분 에러의 주체는 해당 프로그래밍 자체를 의미 즉, The programm을 붙일 것

The programm cannot read properties of null.

이와 같이 에러의 주어가 프로그램 자체와 시스템을 의미하는 것이 분명할 때는 주어가 생략되며, 영어 문법의 특징상 주어를 제일 앞에 추가하면 된다.

3) 간단한 표현을 사용하는 케이스(명사구만을 사용)

에러 메시지에는 주어와 술어가 모두 생략된 표현도 있다.

Invalid array length
  • Invalid = 유효하지 않은

  • array length = 배열의 길이

명사구만 존재하고, 주어와 술어만 있어서 불친절하게 보일 수 있으나 이와 같은 표현이 많다는 것..

유효하지 않은 배열의 길이를 사용하고 있으므로 사용할 수 없다.

Unexpected token '['- 예상하지 못한 토큰 '['missing ) after argument list- 인수 리스트 뒤에 )가 없음

4) 자주 사용하는 단어와 프로그래밍 특유의 의미를 갖는 단어

에러 메시지에는 일반적인 단어 이외에도 프로그래밍에서 고유의 의미를 갖는 단어가 존재한다. 이 단어들은 사전적 의미를 찾아봐도 일반적인 의미만으로 이해하기 어려운 부분이 있다. 이들은 프로그래밍 용어로 의미를 이해해야 함

자주 나오는 단어의미

valid/invalid

유효한/유효하지 않은

expected/unexpected

기대한/기대하지 않은

defined/undefined

정의된/정의되지 않은

declared/undeclared

선언된/선언되지 않은

reference

참조

require

필요한

deprecated

사용되지 않는

expired

만료된

apply

적용하다

deny

거부하다

permission

허가

range

범위

missing

보이지 않는(빠진)

단어프로그래밍 고유의 의미

function/argument

함수/인수

variable/constant

변수/상수

object/property/method

객체/속성/메서드

expression/statement

식/문

operator/operand

연산자/피연산자

token

토큰

initializer

이니셜라이저

mutable/immutable

변할 수 있는/불변의

iteration/iterable

반복/반복할 수 있는

assignment

할당

02. 이유 2 : 길어서 읽기가 어려움

ReferenceError; nickname is not defined  at fn3 (/Users/naera/section-1/app.js:14:3)  at fn2 (/Users/naera/section-1/app.js:10:3)  at fn1 (/Users/naera/section-1/app.js:6:3)  at /Users/naera/section-1/app.js:18:16  at Layer.handle [as handle.request] (/Users/naera/section-1/p  nodejnodules/express/lib/router/layer.js:95:5)  at next (/Users/naera/section-l/node.modules/express/lib/p  router/route.j s:144:13)  at Route.dispatch (/Users/naera/section-1/node_modules/p  express/lib/router/route.js:114:3)  at Layer.handle [as handle.request] (/Users/naera/section-1/p  node_modules/express/lib/router/layer.js:95:5)  at /Users/naera/section-1/node_modules/express/lib/router/p  index.js:284:15  at Function.process_params (/Users/naera/section-1/p  nodejnodules/express/lib/router/index.js:346:12)

긴 에러 메시지에서 주의해서 읽어야 할 부분은 대략 2~3행 정도다.

에러를 구성하는 세 가지 요소

  1. 에러의 종류 : Uncaught ReferenceError

  2. 에러 메시지 : nickname is not defined

  3. 스택 트레이스

위 사진에서는 단 두 행의 메시지만 읽으면 된다.

ReferenceError : nickname is not definedat fn3 (/Users/naera/section-1/app.js:14:3)

참조 에러 : nickname이 정의되어 있지 않다.

즉, 에러는 전부 읽을 필요가 없다는 것을 기억하자. 중요한 포인트만 알면 읽기 쉬워진다.

03. 이유 3 : 읽어도 바로 원인을 파악 할 수 없음

에러는 발생한 위치와 근본적인 원인이 다를 때도 있다.

에러는 확인했지만 해결 방법이 도무지 떠오르지 않을 때도 있을 것이다.

이러한 경험이 방법되면서 에러에 자신이 없어지고 에러를 읽지 않게 되는 사람이 많을 것

1) 에러의 발생 위치와 근본적인 원인이 다를 때

function hello(user) { |   console.log('안녕하세요 ${user.nickname} 님'); .------ 여기서 에러 발생}

에러의 내용 : null 속성을 읽을 수 없다.(nickname을 읽으려고 함)

Cannot read properties of null (reading 'nickname')

이 에러는 null은 nickname 속성을 읽을 때 에러가 발생하는 것을 알 수 있다. 코드에서 nickname 속성을 읽는 부분은 ${user.nickname}이다.

즉, user가 null이 되어버리는 것이 문제이다.

user는 hello() 함수의 인수로 전달되므로 수정해야 할 부 분은 hello() 함수를 호출하는 부분 다양한 위치에서 호출을 하고 있다면, hello(user1), hello(user2) 등 실제 원인이 되는 부분을 찾아야 하는데 바로 해결을 할 수 는 없지만, 에러를 자세히 읽어보면 효율적인 근본 원인을 찾을 수 있다.

2) 라이브러리 등의 코드에서 에러가 발생했을 때

라이브러리는 편리한 기능을 모아둔 코드이다. 다른 사람이 작성한 라이브러리 코드에서 원인이 발생하면 난이도가 올라간다.

const { Client } = require("pg");const client = new Client({  user: "alice",  password: "password",  database: "myDb",});const connectClient = async () => {  await client.connect();};connectClient();

에러

error: password authentication failed for user "alice"  at Parser.parseErrorMessage (/Users/naera/project/司node_niodules/pg-protocol/dist/parser.js:287:98)  at Parser.handlePacket (/Users/naera/project/node_modules/ppg-protocol/dist/parser.js:126:29)  at Parser,parse (/Users/naera/project/node.modules/ppg-protocol/dist/parser.js:39:38)  at Socket.<anonynious> (/Users/naera/project/node_modules/ppg-protocol/dist/index.js:11:42)  at Socket.emit (node:events:513:28)  at addChunk (node:internal/streanis/readable:324:12)  at readableAddChunk (nodezinternal/streams/readable:297:9)  at Readable.push (node:internal/streams/readable:234:10)  at TCP.onStreamRead (node:internal/strean)_base_coniinons:190:23)

실제로 이 에러는 자신이 작성한 코드에서 어디에 원인이 있는지를 나타내는 부분이 없다.

에러가 발생한 부분은 2행의 어떤 파일이지만, 라이브러리의 코드에 문제가 있는 것이 아닌 데이터베이스에 접속하기 위한 유저 정보와 패스워드가 틀린 것이 에러의 원인이다.

프로그램을 작성하다 보면 해결하기 어려운 에러를 만날 때가 있다. 그렇다고 해서 에러를 읽을 필요가 없는 것은 아니다. 에러를 읽으면 조금씩 문제를 해결할 수 있는 힌트를 얻을 수 있다. 조금씩 발전한다는 생각으로 에러를 대하도록 하자

2. 에러를 향한 마음가짐

1) 간단하게 생각하자

바로 해결할 수는 없더라도 힌트를 발견할 수 있다.

에러가 발생하는 영역과 난이도가 다양하지만, 에러를 제대로 확인하기만 해도 간단하게 해결할 수 있는 문제도 많다.

2) 어려운 에러는 좋은 학습의 기회

에러를 만날 때마다 새로운 것을 배울 수 있다는 마음가짐을 갖는 것이 중요

3) 에러를 읽는 스킬은 항상 도움이 된다.

에러는 포맷이 정해져 있고 종류도 정해져 있다. 에러 메시지를 한 번만 자세히 읽고 내용을 이해해두면 이후에는 개발이 편해진다. 에러는 개발자가 효율적으로 디버깅 할 수 있게 해주는 아군이다.

Last updated