실행 환경과 작은 프로그램
Node.js에서 독서 모임 신청을 실행하고 변수·조건·배열·함수의 역할을 결과와 연결합니다.
독서 모임 진행자는 종이 명단에 두 자리까지만 신청을 받습니다. 같은 사람이 두 번 신청하면 자리 하나를 낭비합니다. 이 규칙을 작은 프로그램으로 옮기면서 교재 전체의 출발점을 만듭니다.
이 문서의 목표는 코드 전부를 외우는 것이 아닙니다. 파일을 실행하고, 어느 조건이 결과를 바꾸었는지 설명할 수 있으면 다음 단계로 갈 수 있습니다. 웹 개발이나 PEIM 교재를 먼저 읽을 필요는 없습니다.
실행할 준비
Node.js는 브라우저 밖에서 JavaScript를 실행하는 프로그램입니다. 이 교재는 Node.js 24 계열과 내장 모듈을 사용하며 외부 패키지를 설치하지 않습니다. 공식 다운로드에서 운영체제에 맞게 설치한 뒤 새 터미널에서 확인합니다.
node --versionv24...처럼 버전이 나오면 준비가 됐습니다. node를 찾을 수 없다는 오류가 나면 설치가 끝났는지 확인하고 터미널을 다시 엽니다. 설치 위치를 코드에 넣을 필요는 없습니다.
원하는 작업 폴더에 reading-lab 폴더를 만들고 텍스트 편집기로 start.mjs를 저장합니다. .mjs는 JavaScript 모듈 파일의 확장자입니다. 실제 이름이 start.mjs.txt가 되지 않도록 확장자를 확인합니다. 터미널이 그 폴더를 가리키는 상태에서 실행합니다.
node start.mjs값과 규칙을 함께 읽기
다음 내용 전체를 start.mjs에 저장합니다. 따옴표와 괄호는 그대로 유지합니다.
const meeting = { title: "함께 읽는 첫 책", capacity: 2, participants: [] };
function join(memberId) {
if (meeting.participants.includes(memberId)) return "ALREADY_REGISTERED";
if (meeting.participants.length >= meeting.capacity) return "FULL";
meeting.participants.push(memberId);
return "REGISTERED";
}
for (const memberId of ["min", "hana", "min", "jun"]) {
console.log(memberId, join(memberId));
}
console.log(meeting.participants);실행 결과의 핵심은 다음 순서입니다. 배열 출력의 따옴표나 공백은 환경에 따라 달라도 값의 순서는 같습니다.
min REGISTERED
hana REGISTERED
min ALREADY_REGISTERED
jun FULL
[ 'min', 'hana' ]객체 meeting은 모임의 관련 값을 이름과 함께 묶습니다. capacity는 정원, 배열 participants는 참가자 목록입니다. const는 변수 이름에 다른 값을 다시 대입하지 못하게 하지만 객체 안의 배열 변경까지 막지는 않습니다. 여기서 push는 원래 배열을 바꿉니다.
함수 join은 한 번의 신청을 처리합니다. 매개변수 memberId는 매 호출의 입력이고 return은 결과를 돌려주면서 그 호출을 끝냅니다. includes는 이미 있는지, length는 몇 명인지 확인합니다. >=는 정원과 같거나 더 많은 경우를 모두 거절합니다. for...of는 목록의 신청을 차례로 전달합니다.
min의 두 번째 신청 시점에는 명단이 이미 가득 찼습니다. 그래도 첫 조건에서 반환하므로 결과는 FULL이 아니라 ALREADY_REGISTERED입니다. 조건의 순서는 구현 세부처럼 보이지만 사용자가 보는 정책을 결정합니다.
입력과 현재 상태가 다음 결과를 결정한다
이미 만석인 모임에 min이 다시 신청한다. 거절 과정에서 명단을 변경하지 않는다. 각 단계의 값과 전환 이유를 비교합니다.
SOFTWARE ENGINEERING · READING CLUB
입력과 현재 상태가 다음 결과를 결정한다
정원은 같아도 기존 참가자와 새 참가자에게 적용되는 조건이 다릅니다.
실패 결과와 명단 보존을 함께 읽습니다. 검사 순서를 바꾸면 상태는 같아도 사용자에게 안내하는 이유가 달라집니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 재신청 입력부터 결과와 상태까지 진행합니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 재신청 입력 이미 만석인 모임에 min이 다시 신청한다. |
|
|
| 중복 판정 첫 조건이 참이라 바로 반환한다. |
|
|
| 결과와 상태 거절 과정에서 명단을 변경하지 않는다. |
|
|
입력과 현재 상태가 다음 결과를 결정한다
이미 만석인 모임에 min이 다시 신청한다. 거절 과정에서 명단을 변경하지 않는다. 각 단계의 값과 전환 이유를 비교합니다.
SOFTWARE ENGINEERING · READING CLUB
입력과 현재 상태가 다음 결과를 결정한다
정원은 같아도 기존 참가자와 새 참가자에게 적용되는 조건이 다릅니다.
실패 결과와 명단 보존을 함께 읽습니다. 검사 순서를 바꾸면 상태는 같아도 사용자에게 안내하는 이유가 달라집니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 재신청 입력부터 결과와 상태까지 진행합니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 재신청 입력 이미 만석인 모임에 min이 다시 신청한다. |
|
|
| 중복 판정 첫 조건이 참이라 바로 반환한다. |
|
|
| 결과와 상태 거절 과정에서 명단을 변경하지 않는다. |
|
|
첫 실험과 한계
정원을 3으로 바꾸어 실행하면 jun도 등록됩니다. 이제 신청 목록에서 두 번째 min을 지워 보세요. 결과 행의 수와 최종 명단을 실행 전에 예상한 다음 확인합니다. 예상을 먼저 적어야 우연히 나온 결과를 규칙으로 착각하지 않습니다.
이 첫 프로그램은 빈 ID도 받고 종료하면 명단을 잃습니다. 다른 사용자가 동시에 신청하는 서버도 아닙니다. 결함을 모두 한 번에 해결하지 않고 요구사항에서 허용 입력과 거절 규칙을 결정한 뒤 확장합니다.
직접 판단할 문제
정원 1이고 신청 순서가 min, min, hana라면 세 결과와 최종 명단은 무엇인가요? 두 if의 순서를 바꾸면 어느 결과가 달라지는지도 설명하세요.
힌트
각 호출 직전 명단을 적습니다. return 뒤의 문장은 그 호출에서 실행되지 않습니다.
해설
원래 순서는 REGISTERED, ALREADY_REGISTERED, FULL이고 명단은 min 한 명입니다. 정원 검사를 먼저 하면 두 번째 신청도 FULL이 됩니다. 명단은 같지만 결과의 의미가 바뀌므로 코드 변경을 정책 변경과 구분하여 검토해야 합니다.
const라서 참가자가 변하지 않는다는 설명은 틀립니다. 변수 재대입과 객체 내부 변경은 다른 일입니다. 다음 문서에서는 이 작은 코드 외에 개발에 필요한 산출물을 살펴봅니다.