- 제로초 <Node.js 교과서 - 기본부터 프로젝트 실습까지>
- Node.js는 그 자체로 서버인 게 아니라, 실행 환경인 '런타임'이다. 서버 기능을 코드를 작성해서 Node.js로 실행하면 서버 역할을 해주는 거고, 데스크톱 제어 코드를 작성해서 Node.js로 실행하면 데스크톱 앱, 모바일이면 모바일처럼 된다. Node.js 자체는 웹 브라우저 이외의 곳에서 자바스크립트를 실행할 수 있도록 해준 실행기이다.
- 노드에서도 멀티 스레드를 구현은 가능하다(14버전부터 지원은 가능하다). 하지만, 구현이 가능하다 뿐이지, 효율적인 개발을 위해 기본적으로 싱글 스레드로 동작하는 걸 기본으로 한다.
- 싱글 스레드로 메인으로 동작하기 때문에 컴퓨터 자원을 효율적으로 사용할 수 있지만, 컴퓨터 자원을 다 돌려서 빠르게 작업을 처리하는 건 노드로 구현하는 게 쉽지 않다.
- 자바스크립트에서 호출 스택과 백그라운드는 멀티 스레드와 같이 동시에 두 개 이상 작업을 돌릴 수 있다. 예를 들어 호출 스택의 코드를 실행하면서
setTimeout
으로 정의한 시간 경과를 확인하는 동작이 동시에 되는 건 백그라운드로 간setTimeout
함수와 호출 함수가 동시에 실행되는 것이다. - 백그라운드를 잘 사용하면 멀티스레드로 작업을 처리하는 것 같은 효과를 낼 수 있지만, 백그라운드로 보낼 수 있는 호출은 몇 가지로 정해져 있고, 그 이외의 작업을 백그라운드로 보내는 것은 제어하는 게 어렵다.
- REPL(Read, Evaluate, Print, Loop). 코드를 읽고, 평가하고, 출력하고, 이 과정을 반복한다. 언어가 입력한 코드를 분석해서 처리해 주는 것을 반복해 주는 환경을 의미하며, Node는 REPL 환경을 제공한다. REPL은 터미널에서
node
를 실행하면 실행되는데, 라인 바이 라인으로 작성하기 때문에 사용이 불편하다는 문제가 있다. 보통은 Visual Studio Code 같은 에디터에 필요한 자바스크립트 코드를 작성한 후node {자바스크립트 파일 경로}
형태로 실행한다. - Node.js는 모듈 시스템으로 CommonJS를 사용하며,
module.exports
와require
를 지원한다. 특정 값이나 함수 등을 외부에 공개하고 싶을 때module.exports
에 해당 값을 등록하고, 값을 사용해야 하는 곳에서는require
메서드의 인자로 값을 export한 모듈의 경로를 넣어주면 해당 모듈에서module.exports
에 등록한 값을 외부에서 접근할 수 있다. 모듈에서 두 개 이상의 값을 내보낼 땐 보통 객체로 묶어서 내보낸다. module.exports
는 파일에서 한 번만 사용해야 한다.module.exports === exports === {}
이다. 이 참조가 끊기는 동작이 발생하지 않도록 주의하자.exports.odd
exports.even
과 같이 객체 점 표기법으로 값을 지정하는 게 가능하지만, 한번 저렇게 값을 지정한 이후module.exports = { odd, even }
이런 식으로module.exports
에 새로운 값을 주면exports
와의 동일 관계가 깨지게 된다(이 부분에 대해 좀 더 자료 찾아보고 공부해 봐야겠다).module.exports
와exports
를 같이 쓸 수 없다.- Node 모듈에서 전역의
this
는global
이 아니다. 일반 함수 내부의this
는 전역 객체인global
이 된다. 이렇게 되는 이유는, 전역에서 호출한this
는module.exports
를 가리키기 때문이다. require
를 써서 다른 모듈을 받아오지만 결과를 변수에 받아오지 않으면 다른 모듈을 실행만 하고 값은 받아오지 않을 수 있다(console.log(require)
해서require
의 정체에 대해 한번 뜯어보자).require
는 한 번 불러온 모듈을 캐싱(Caching)한다. 같은 모듈에서exports
한 값을 한번 받아왔다면, 다음에 다시 같은 모듈에서 값을 받아오고 싶을 때 한번 가져온 캐시에서 정보를 가져온다.require
를 두 개 이상 모듈에서 순환 참조 된다면 모듈에서module.exports
한 값을 빈 객체로 바꿔버린다. 무한 순환 참조를 방지하기 위함이다. 가능하면 순환 참조를 사용하지 않는 게 좀 더 안전하다.- Node에서 ES Module도 사용 가능하며, 점점 더 ES Module이 최신 문법을 많이 활용하는 추세이기 때문에, 잘 알아두는 게 필요하다.
- ES Module은 모듈의 Top Level에서
async
없이도await
를 쓸 수 있다.
- Udemy <The Web Developer 부트캠프 2024>
- Node는 브라우저 밖에서 자바스크립트 코드를 실행하는 실행 환경이다.
- Node를 설치하고 터미널에
node
명령어를 실행하면 라인 바인 라인으로 코드를 실행할 수 있는 REPL 환경을 사용할 수 있다. - Node는 브라우저 환경이 아니기 때문에
document
객체나window
객체 등이 없다. Node 환경에서 전역 객체는global
이다. 브라우저와 마찬가지로 Node 환경에서 모든 객체의 최상위 객체는global
이다. - 자바스크립트 파일을 터미널에서
node {파일명}.js
로 실행해도 코드를 실행할 수 있다. - Node의 전역 객체가 제공하는
process
객체가 있다. 현재의 작업 환경을 확인할 수 있다(process.version
,process.release
,process.cwd
등). process.argv
를 호출하면node
를 실행할 수 있는 경로,process.argv
가 호출된 모듈의 경로 등을 값으로 활용할 수 있다. 또한,process.argv
가 호출된 모듈을node {모듈명}.js {...args}
형태로 터미널에서 실행하면 모듈 환경에 변수를 전달할 수 있다. 예를 들어node example.js hello
라고 터미널에서 실행하면process.argv
배열에hello
가 추가된다.- 이런 식으로
process.argv
결과 배열을 활용해 외부 터미널 환경에서 특정 자바스크립트 파일 모듈에 변수를 주입할 수 있다. 아래와 같이 코드를 작성하고 실행하면hi
와hello
가 각각arg
의 값으로 출력된다.
// example.js const args = process.argv.slice(2) // 처음 두 값은 경로를 나타냄 for (let arg of args) { console.log(arg) }
node example.js hi hello
- 하지만, 일반적으로 사용되는 방식은 아니고, 그냥 '이런 것도 된다'라는 걸 알고 있으면 된다.
- Node의 전역 객체인
global
이 제공하는 또 다른 객체인fs
는 폴더(디렉토리)-파일 시스템을 관리하는 데 사용된다.const fs = require('fs');
형태로 객체를 모듈에서 불러와 사용할 수 있다. fs
를 사용한 파일 시스템 관리는 동기-비동기를 전부 지원하며, 필요에 맞게 필요한 메서드를 선택해서 쓰면 된다. 보통은 동기 동작을 나타내는 파일 시스템 관리 메서드에는sync
가 붙는다.
'TIL' 카테고리의 다른 글
241219 TIL (1) | 2024.12.19 |
---|---|
241217 TIL (0) | 2024.12.19 |
241212 TIL (0) | 2024.12.13 |
241210 TIL (0) | 2024.12.11 |
241209 TIL (0) | 2024.12.10 |