# 이벤트를 사용하여 게임 만들기
버튼을 클릭하거나 텍스트 상자에 입력할 때 웹사이트가 어떻게 그 사실을 아는지 궁금해 본 적 있나요? 그것이 바로 이벤트 기반 프로그래밍의 마법입니다! 이 필수 기술을 배우는 가장 좋은 방법은 유용한 무언가를 만들어 보는 것입니다 — 여러분이 누르는 모든 키에 반응하는 타자 속도 게임을 만드는 것이죠.
웹 브라우저가 여러분의 자바스크립트 코드와 어떻게 "대화"하는지 직접 보게 될 겁니다. 클릭, 입력, 마우스 이동이 있을 때마다 브라우저가 코드에 작은 메시지(우리가 이벤트라고 부릅니다)를 보내고, 여러분은 어떻게 반응할지 결정할 수 있습니다!
여기까지 배우면 속도와 정확도를 추적하는 진짜 타자 게임을 만들게 될 것입니다. 더 중요하게는, 여러분이 지금까지 사용해본 모든 인터랙티브한 웹사이트를 작동시키는 기본 개념을 이해하게 될 것입니다. 함께 시작해 봅시다!
## 강의 전 퀴즈
[강의 전 퀴즈](https://ff-quizzes.netlify.app/web/quiz/21)
## 이벤트 기반 프로그래밍
가장 좋아하는 앱이나 웹사이트를 생각해 보세요 — 무엇이 그것을 살아 있고 반응형으로 느끼게 하나요? 여러분이 하는 행동에 어떻게 반응하느냐가 전부입니다! 탭, 클릭, 스와이프 또는 키 입력 한 번마다 우리는 그것을 "이벤트"라고 부르며, 웹 개발의 진짜 마법이 바로 그 순간 일어납니다.
웹 프로그래밍이 흥미로운 이유는 이렇습니다: 누군가가 버튼을 클릭하거나 텍스트 상자에 타이핑을 언제 시작할지 알 수 없습니다. 즉시 클릭할 수도, 5분 후에 클릭할 수도, 아예 클릭하지 않을 수도 있기 때문입니다! 이 예측 불가능성 때문에 우리는 코드를 작성하는 방식을 다르게 생각해야 합니다.
처방전처럼 위에서 아래로 순서대로 실행되는 코드를 쓰는 대신, 무언가 발생하기를 인내심 있게 기다리는 코드를 작성해야 합니다. 1800년대 전신 기사들이 메신저가 신호를 보내는 순간 바로 대응하기 위해 기계 옆에서 대기하던 것과 비슷합니다.
그렇다면 “이벤트”란 정확히 무엇일까요? 간단히 말해, 일어나는 어떤 일입니다! 버튼을 클릭하면 — 그게 이벤트입니다. 글자를 입력하면 — 역시 이벤트입니다. 마우스를 움직이면 — 또 다른 이벤트입니다.
이벤트 기반 프로그래밍은 우리 코드를 듣고 반응하도록 설정할 수 있게 해줍니다. 우리는 **이벤트 리스너**라는 특별한 함수를 만들어 특정 일이 일어나길 인내심 있게 기다리다가 발생하면 즉시 작동하게 합니다.
이벤트 리스너는 여러분 코드의 초인종과 같습니다. 초인종(`addEventListener()`)을 설치하고, 어떤 소리(예: ‘click’ 또는 ‘keypress’)에 반응할지 지정하며, 누군가 벨을 누르면 어떤 일이 벌어져야 하는지(사용자 정의 함수)를 말합니다.
**이벤트 리스너 작동 방식은 다음과 같습니다:**
- 사용자 클릭, 키 입력, 마우스 이동 같은 특정 행동을 **감지**
- 지정한 이벤트가 발생하면 사용자 정의 코드를 **실행**
- 사용자 상호작용에 즉시 **반응**하여 매끄러운 경험 제공
- 동일 엘리먼트에서 여러 이벤트를 **다양한 리스너로 처리**
> **NOTE:** 이벤트 리스너를 만드는 방법은 매우 다양합니다. 익명 함수나 이름 있는 함수를 사용할 수 있고, `click` 프로퍼티를 설정하는 단축법이나 `addEventListener()`를 사용해도 됩니다. 이번 실습에서는 웹 개발자가 가장 흔히 쓰는 방법인 `addEventListener()`와 익명 함수에 집중할 것입니다. 이 방법은 모든 이벤트에 대해 활용 가능하고 이벤트 이름을 파라미터로 제공할 수 있어 매우 유연합니다.
### 자주 사용하는 이벤트
웹 브라우저는 수십 가지 이벤트를 제공하지만 대부분의 인터랙티브 애플리케이션은 몇 가지 필수 이벤트에 주로 의존합니다. 이 핵심 이벤트를 이해하면 복잡한 사용자 상호작용을 구현할 수 있는 기반이 됩니다.
애플리케이션을 만들 때 들을 수 있는 [수십 가지 이벤트](https://developer.mozilla.org/docs/Web/Events)가 있습니다. 기본적으로 사용자가 페이지에서 행하는 거의 모든 행동이 이벤트를 발생시키므로 원하는 경험을 제공할 수 있는 강력한 도구를 얻게 됩니다. 다행히도 일반적으로는 몇 가지 이벤트만 알면 충분합니다. 다음은 몇 가지 흔한 이벤트들입니다 (우리 게임에서 사용할 두 가지도 포함):
| 이벤트 | 설명 | 일반적 사용 사례 |
|-------|-------------|------------------|
| `click` | 사용자가 무언가를 클릭함 | 버튼, 링크, 인터랙티브 요소 |
| `contextmenu` | 사용자가 마우스 오른쪽 버튼 클릭 | 사용자 정의 우클릭 메뉴 |
| `select` | 사용자가 텍스트를 강조 표시함 | 텍스트 편집, 복사 작업 |
| `input` | 사용자가 텍스트 입력함 | 폼 검증, 실시간 검색 |
**이벤트 유형 이해하기:**
- 사용자가 페이지 특정 요소와 상호작용할 때 **발생**
- 이벤트 객체를 통해 사용자의 행동에 대한 상세 정보 **제공**
- 반응형 웹 애플리케이션을 만들 수 있게 **지원**
- 다양한 브라우저와 기기에서 일관성 있게 **동작**
## 게임 만들기
이제 이벤트가 어떻게 작동하는지 알았으니, 그 지식을 활용해 유용한 무언가를 만들어 봅시다. 이벤트 처리 방식을 보여주며 중요한 개발자 기술을 익히는 타자 속도 게임을 만들 것입니다.
자바스크립트에서 이벤트가 어떻게 작동하는지 탐구하기 위해 게임을 만들어 봅시다. 게임은 플레이어의 타자 실력을 테스트하는데, 이는 모든 개발자가 갖춰야 할 가장 과소평가된 기술 중 하나입니다. 재미있는 사실은, 우리가 오늘날 사용하는 QWERTY 키보드 배열이 사실 1870년대 타자기용으로 설계되었다는 점이며, 좋은 타자 실력은 여전히 프로그래머에게 매우 중요합니다! 게임의 전반적인 흐름은 다음과 같습니다:
```mermaid
flowchart TD
A[플레이어가 시작을 클릭함] --> B[무작위 인용문 표시]
B --> C[플레이어가 텍스트박스에 입력함]
C --> D{단어 완료?}
D -->|예| E[다음 단어 강조 표시]
D -->|아니오| F{지금까지 올바름?}
F -->|예| G[일반 스타일 유지]
F -->|아니오| H[오류 스타일 표시]
E --> I{인용문 완료?}
I -->|아니오| C
I -->|예| J[시간과 함께 성공 메시지 표시]
G --> C
H --> C
```
**우리 게임 작동 방식:**
- 플레이어가 시작 버튼을 클릭하면 게임이 시작되고 랜덤 인용문을 표시
- 플레이어의 타이핑 진행 상황을 단어별로 실시간 추적
- 현재 단어를 하이라이트하여 플레이어 집중 유도
- 오타가 있을 때 즉시 시각적 피드백 제공
- 인용문 완료 시 전체 소요 시간 계산 및 표시
게임을 만들어 보고 이벤트에 대해 배워 봅시다!
### 파일 구조
코딩 시작 전에 정리부터 합시다! 처음부터 깔끔한 파일 구조를 갖추면 나중에 골치 아픈 일을 줄이고 프로젝트가 더 전문적으로 보입니다. 😊
파일은 단순하게 세 개로 구성할 것입니다: `index.html` — 페이지 구조, `script.js` — 게임 로직 전체, `style.css` — 스타일링. 이것은 웹의 클래식 삼총사입니다!
**터미널이나 콘솔 창을 열고 다음 명령어를 입력하여 새 폴더를 만드세요:**
```bash
# 리눅스 또는 macOS
mkdir typing-game && cd typing-game
# 윈도우즈
md typing-game && cd typing-game
```
**이 명령어들의 역할:**
- 프로젝트 파일을 위한 새 디렉터리 `typing-game` 생성
- 생성된 디렉터리로 자동 이동
- 게임 개발을 위한 깔끔한 작업 공간 준비
**Visual Studio Code 열기:**
```bash
code .
```
**이 명령어는:**
- 현재 디렉터리에서 Visual Studio Code를 실행
- 프로젝트 폴더를 에디터에서 열기
- 개발에 필요한 모든 도구 접근 제공
**Visual Studio Code에서 다음 세 파일을 폴더에 추가하세요:**
- `index.html` — 게임의 구조와 콘텐츠를 담음
- `script.js` — 모든 게임 로직과 이벤트 리스너 담당
- `style.css` — 시각적 디자인과 스타일 지정
## 사용자 인터페이스 만들기
이제 게임의 모든 조작이 이루어질 무대를 만들어 봅시다! 우주선 조종판 디자인하듯, 플레이어가 필요한 모든 것이 기대하는 곳에 있어야 합니다.
게임에 실제로 필요한 것을 생각해 봅시다. 타자 게임을 한다면 화면에 무엇이 보이길 원할까요? 다음과 같이 필요합니다:
| UI 요소 | 용도 | HTML 요소 |
|------------|---------|-------------|
| 인용문 표시 | 타이핑할 텍스트를 보여 줌 | `
` 엘리먼트, `id="quote"` |
| 메시지 영역 | 상태 및 성공 메시지 표시 | `
` 엘리먼트, `id="message"` |
| 텍스트 입력 | 플레이어가 인용문을 타이핑하는 곳 | `` 엘리먼트, `id="typed-value"` |
| 시작 버튼 | 게임 시작 | `