> For the complete documentation index, see [llms.txt](https://mellona-log.gitbook.io/log/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mellona-log.gitbook.io/log/book/learn-errors/1.md).

# 1장 에러가 왜 무서울까?

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

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

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

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

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

* 코드 양이 적은 것은 바로바로 읽자<br>

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

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

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

```
X is not definded
```

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

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

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

#### 2) 주어가 생략된 케이스

```
Cannot read properties of null
```

null 속성을 읽을 수 없다.<br>

1. 술어 : Cannot read
2. 주어 : The program

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

```
The programm cannot read properties of null.
```

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

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

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

```
Invalid array length
```

* Invalid  = 유효하지 않은
* array length = 배열의 길이

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

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

```
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이 정의되어 있지 않다.<br>

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

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

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

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

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

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

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

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

```
Cannot read properties of null (reading 'nickname')
```

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

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

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

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

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

```
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행의 어떤 파일이지만,  라이브러리의 코드에 문제가 있는 것이 아닌 **데이터베이스에 접속하기 위한 유저 정보와 패스워드가 틀린 것이 에러의 원인**이다.

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

## 2. 에러를 향한 마음가짐

### 1) 간단하게 생각하자

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

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

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

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

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

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