상세 컨텐츠

본문 제목

await를 안쓴다면?

카테고리 없음

by esoesmio 2024. 5. 9. 17:32

본문

JavaScript에서 비동기 작업을 처리할 때 `await`의 사용 여부는 코드의 행동과 결과에 큰 영향을 미칩니다. `await`를 사용하지 않고 프라미스를 반환하는 함수의 결과를 변수에 저장하는 경우의 처리 방식과 문제점을 자세히 설명하겠습니다.

### 프라미스란?

먼저, 프라미스는 JavaScript에서 비동기 작업의 완료를 대표하는 객체입니다. 프라미스는 세 가지 상태 중 하나를 가집니다:
1. **대기(Pending)**: 비동기 작업이 아직 완료되지 않은 상태.
2. **이행(Fulfilled)**: 비동기 작업이 성공적으로 완료되어 결과값을 반환한 상태.
3. **거부(Rejected)**: 비동기 작업이 실패하거나 에러가 발생한 상태.

### `await` 사용하지 않는 경우의 문제

예를 들어, `NestFactory.create(AppModule)`는 NestJS 애플리케이션 인스턴스를 비동기적으로 생성하고, 이 인스턴스를 포함하는 프라미스를 반환합니다. 이를 `await` 없이 다음과 같이 호출할 경우:

```javascript
const app = NestFactory.create(AppModule);
```

여기서 변수 `app`은 비동기 작업의 결과인 애플리케이션 인스턴스가 아니라, 비동기 작업을 대표하는 프라미스 객체를 저장하게 됩니다. 이 프라미스 객체는 작업의 완료 여부에 관계없이 즉시 반환되므로, 작업이 아직 완료되지 않았다면 `app`은 "대기(Pending)" 상태의 프라미스를 참조합니다.

### 문제 발생의 예

이 상태에서 `app.listen(port)` 같은 실제 메소드를 호출하려고 하면 문제가 발생합니다. 왜냐하면 `app` 변수는 실제 NestJS 애플리케이션 인스턴스가 아니라 대기 중인 프라미스를 참조하기 때문입니다. `listen` 메소드는 NestJS 애플리케이션 인스턴스에만 존재하는 메소드이므로, 프라미스 객체에는 이 메소드가 존재하지 않습니다. 결과적으로, 다음과 같은 코드를 실행하면:

```javascript
app.listen(port);
```

JavaScript는 `app` 객체가 `listen` 메소드를 가지고 있지 않다고 에러를 발생시킬 것입니다. 이것은 "TypeError: app.listen is not a function" 같은 메시지로 나타납니다.

### 올바른 접근 방법

이 문제를 해결하기 위해 `await` 키워드를 사용하여 프라미스가 해결될 때까지 기다리고, 해결된 값(즉, 애플리케이션 인스턴스)을 `app` 변수에 저장할 수 있습니다:

```javascript
const app = await NestFactory.create(AppModule);
```

이렇게 하면, `app` 변수는 프라미스가 아닌, 실제 NestJS 애플리케이션 인스턴스를 참조하게 됩니다. 이제 `app.listen(port)`를 호출하면, 해당 메소드는 정상적으로 작동하여 서버를 시작할 수 있습니다.

### 결론

`await`를 사용하지 않고 프라미스를 반환하는 함수의 결과를 변수에 저장하는 것은 프라미스 객체를 변수에 저장한다는 것을 의미합니다. 이는 함수가 반환한 비동기 작업이 아직 완료되지 않았을 수 있으며, 이 상태에서 비동기 작업의 결과나 메소드를 사용하려고 하면 에러가 발생할 수 있습니다. 따라서 비동기 함수를 사용할 때는 `await`를 적

절히 사용하여 비동기 작업이 완료되고 결과를 안전하게 사용할 수 있도록 해야 합니다.

댓글 영역