TIL

241216 TIL

GoJay 2024. 12. 17. 02:59
  • 제로초 <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.exportsrequire를 지원한다. 특정 값이나 함수 등을 외부에 공개하고 싶을 때 module.exports에 해당 값을 등록하고, 값을 사용해야 하는 곳에서는 require 메서드의 인자로 값을 export한 모듈의 경로를 넣어주면 해당 모듈에서 module.exports에 등록한 값을 외부에서 접근할 수 있다. 모듈에서 두 개 이상의 값을 내보낼 땐 보통 객체로 묶어서 내보낸다.
    • module.exports는 파일에서 한 번만 사용해야 한다.
    • module.exports === exports === {}이다. 이 참조가 끊기는 동작이 발생하지 않도록 주의하자. exports.odd exports.even과 같이 객체 점 표기법으로 값을 지정하는 게 가능하지만, 한번 저렇게 값을 지정한 이후 module.exports = { odd, even } 이런 식으로 module.exports에 새로운 값을 주면 exports와의 동일 관계가 깨지게 된다(이 부분에 대해 좀 더 자료 찾아보고 공부해 봐야겠다). module.exportsexports를 같이 쓸 수 없다.
    • Node 모듈에서 전역의 thisglobal이 아니다. 일반 함수 내부의 this는 전역 객체인 global이 된다. 이렇게 되는 이유는, 전역에서 호출한 thismodule.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 결과 배열을 활용해 외부 터미널 환경에서 특정 자바스크립트 파일 모듈에 변수를 주입할 수 있다. 아래와 같이 코드를 작성하고 실행하면 hihello가 각각 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