실행하며 배우는 Node.js 튜토리얼
페이지에서 바로 실행되는 예제로 배우는 무료 Node.js 튜토리얼입니다. 파일, 모듈, 이벤트 루프, 요청을 보낼 수 있는 Express 서버, MongoDB와 JWT를 다룹니다. 코드를 고치고 다시 실행해 보세요.
코스 시작하기시작하기
- Node.js란Node.js는 브라우저 밖, 즉 서버와 터미널에서 자바스크립트를 실행하는 런타임입니다. 언어도 프레임워크도 아니고, V8에 이벤트 루프와 파일, 네트워크, 프로세스를 다루는 API를 더한 것입니다.
- Node.js vs 자바스크립트자바스크립트는 언어이고, Node.js는 그것을 브라우저 밖에서 실행하는 프로그램입니다. 문법은 똑같지만 코드 주변의 전역 객체와 내장 API가 다릅니다.
- process.argvprocess.argv는 프로그램을 시작한 명령줄을 담은 배열입니다. node 실행 파일, 스크립트 경로, 그리고 입력한 모든 인자가 들어 있습니다. 내 인자만 필요하면 process.argv.slice(2)를 쓰세요.
- process.envprocess.env는 Node.js 프로그램이 시작될 때 받은 환경 변수를 담은 객체입니다. 모든 값이 문자열이거나 undefined이므로, 숫자와 불리언은 직접 변환하고 변수마다 기본값을 주세요.
- 사용자 입력 받기Node.js에는 prompt() 함수가 없습니다. 터미널에서 사용자에게 질문하려면 process.stdin에 readline 인터페이스를 만들어 question()을 호출하거나, readline/promises로 await하세요.
파일과 경로
- fs.readFileNode.js에서 파일을 읽으려면 fs.readFile(콜백), fs.readFileSync, fs/promises의 await readFile을 씁니다. 문자열로 받으려면 'utf8'을 넘기고, 파일이 없으면 ENOENT를 처리하세요.
- fs.writeFileNode.js에서 파일을 쓰려면 fs.writeFile, fs.writeFileSync, fs/promises의 await writeFile을 씁니다. 파일이 없으면 만들고 있으면 덮어씁니다. 끝에 덧붙이려면 appendFile을 쓰세요.
- fs/promisesfs/promises는 Node.js fs 모듈의 Promise 버전입니다. readFile, writeFile, readdir, stat, mkdir, rm, rename이 모두 await할 수 있는 Promise를 반환하고, 에러는 try/catch로 잡습니다.
- path 모듈path 모듈은 운영체제에 맞는 방식으로 파일 경로를 만들고 나눕니다. path.join은 조각을 이어 붙이고, path.resolve는 현재 폴더에서 시작해 절대 경로로 바꿉니다.
비동기 Node
HTTP와 Express
- HTTP 서버`http.createServer()`는 요청마다 `req`와 `res`를 받아 실행되는 함수 하나를 받습니다. `req`에서 메서드와 URL을 읽고, `res`에 상태, 헤더, 본문을 설정한 뒤 `res.end()`를 호출합니다.
- Express 라우팅Express의 라우트는 메서드, 경로, 핸들러의 조합입니다(`app.get('/users/:id', handler)`). 관련 라우트는 `express.Router()`로 묶고 `app.use('/api', router)`로 접두사 아래에 마운트하세요.
- Express 미들웨어Express 미들웨어는 라우트 핸들러보다 먼저 실행되는 `(req, res, next)` 함수입니다. 요청을 읽거나 바꾸고, 응답을 보내 끝내거나, `next()`를 호출해 다음으로 넘길 수 있습니다.
- req.params, query, body`req.params`는 경로의 이름 붙은 부분(`/users/:id`), `req.query`는 쿼리 문자열(`?sort=new`), `req.body`는 파싱된 요청 본문을 담습니다. `req.body`는 `express.json()` 같은 본문 파서를 추가하기 전까지 `undefined`입니다.
- 에러 처리Express 에러 핸들러는 라우트 뒤에 등록하는, 인자가 네 개인 `(err, req, res, next)` 미들웨어입니다. Express 5는 던져진 에러, `next(err)` 호출, async 핸들러에서 reject된 Promise를 그곳으로 보냅니다.
- express.static`app.use(express.static(path.join(__dirname, 'public')))`는 `public` 폴더의 모든 파일을 같은 URL로 제공합니다. `public/style.css`는 `/style.css`에 응답합니다. 접두사 아래에 두려면 마운트 경로를 추가하세요.
- Express CORSCORS 에러는 응답이 페이지의 출처를 허용하지 않아서 브라우저가 페이지가 API 응답을 읽지 못하게 막았다는 뜻입니다. 직접 쓰거나 `cors` 패키지로 `Access-Control-Allow-Origin`을 보내고 프리플라이트 `OPTIONS` 요청에 응답해 서버에서 고치세요.