Node.js 강의 3장 - [개정 3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

남경민·2023년 3월 30일
0

📗 3장 노드 기능 알아보기

  • this

    • 자바스크립트 : function마다 this 다름, 화살표하면서 쓰면 부모의 this 물려받음
    • function 외의 최상위 스코프에 존재하는 this는 module.exports(또는 exports 객체) 가리킴
  • require

    • require가 제일 위에 올 필요 X, import 는 첫번째 와야함
    • require.cache에 한번 require한 모듈에 대한 캐쉬 정보 들어있음
    • require.main은 노드 실행 시 첫 모듈을 가리킴
  • 순환참조

    • 노드 자체적으로 순환 참조 막아줌 → dep1의 module.exports가 함수가 아니라 빈 객체로 표시

      //dep1.js
      const dep2 = require('./dep2');
      
      module.exports = () => {
        console.log('dep2', dep2);
      };
      //dep2.js
      const dep1 = require('./dep1');
      
      module.exports = () => {
        console.log('dep1', dep1);
      };
  • 3.3.2 ECMAScript 모듈

    • 공식적인 자바스크립트 모듈 형식

      //var.mjs
      export const odd = 'MJS 홀수입니다';
      export const even = 'MJS 짝수입니다';
      //func.mjs
      import { odd, even } from './var.mjs';
      
      function checkOddOrEven(num) {
        if (num % 2) { // 홀수이면
          return odd;
        }
        return even;
      }
      
      export default checkOddOrEven;
      //index.mjs
      import { odd, even } from './var.mjs';
      import checkNumber from './func.mjs'; //이름 달라도 상관없음!
      
      function checkStringOddOrEven(str) {
        if (str.length % 2) { // 홀수이면
          return odd;
        }
        return even;
      }
      
      console.log(checkNumber(10));
      console.log(checkStringOddOrEven('hello'));
    • 콘솔에 $ node index.mjs 로 실행

    • js 확장자에서 import 사용하면 SyntaxError: Cannot use import statement outside a module 에러 발생
      - 해결방법 : mjs 확장자 대신 js 확장자를 사용하면서 ES 모듈 사용하려면 package.json에 type: “module” 속성 추가

      Untitled

      Untitled

  • 3.3.3 다이나믹 임포트

    • CommonJS 모듈에서는 가능, ES 모듈에서는 불가능

    • 조건부로 모듈을 불러오는 것

      //dynamic.js
      const a = false;
      if (a) {
          require('./func');
      }
      console.log('성공');
    • ES 모듈에서 사용하는 방법!
      - ES모듈은 async 함수 없이도 await 가능

      //dynamic.mjs
      const a = false;
      if (a) {
          import './func.mjs';
      }
      console.log('성공');
      //=> 위의 코드는 에러남
      
      //수정후
      const a = true;
      if (a) {
          const m1 = await import('./func.mjs'); //import는 Promise를 반환하기에 await이나 then을 붙여야함
          console.log(m1);
          const m2 = await import('./var.mjs'); 
          console.log(m2);
      }
  • 3.3.4 filename, dirname

    • 노드는 filename, dirname이라는 키워드로 경로에 대한 정보 제공
    • 파일에 filename과 dirname을 넣어두면 실행 시 현재 파일 명과 현재 파일 경로로 변경됨
    • ES모듈에서는 둘다 사용 불가능
      • import.meta.url로 경로 가져오기 가능
  • 3.4 노드 내장 객체

    • 1) console
      • console.time(레이블): console.timeEnd(레이블)과 대응되어 같은 레이블을 가진 time과 timeEnd 사이의 시간을 측정합니다.
      • console.log(내용): 평범한 로그를 콘솔에 표시합니다. console.log(내용, 내용, …)처럼 여러 내용을 동시에 표시할 수도 있습니다.
      • console.error(에러 내용): 에러를 콘솔에 표시합니다.
      • console.table(배열): 배열의 요소로 객체 리터럴을 넣으면, 객체의 속성들이 테이블 형식으로 표현됩니다. 아래 결과를 확인해보세요.
      • console.dir(객체, 옵션): 객체를 콘솔에 표시할 때 사용합니다. 첫 번째 인수로 표시할 객체를 넣고, 두 번째 인수로 옵션을 넣습니다. 옵션의 colors를 true로 하면 콘솔에 색이 추가되어 보기가 한결 편해집니다. depth는 객체 안의 객체를 몇 단계까지 보여줄지를 결정합니다. 기본값은 2입니다.
      • console.trace(레이블): 에러가 어디서 발생했는지 추적할 수 있게 합니다. 보통은 에러 발생 시 에러 위치를 알려주므로 자주 사용하지 않지만, 위치가 나오지 않는다면 사용할 만합니다.
    • 2) 타이머
      • setTimeout(콜백 함수, 밀리초): 주어진 밀리초(1,000분의 1초) 이후에 콜백 함수를 실행합니다.
      • setInterval(콜백 함수, 밀리초): 주어진 밀리초마다 콜백 함수를 반복 실행합니다.
      • setImmediate(콜백 함수): 콜백 함수를 즉시 실행합니다.
      • clearTimeout(아이디): setTimeout을 취소합니다.
      • clearInterval(아이디): setInterval을 취소합니다.
      • clearImmediate(아이디): setImmediate를 취소합니다.
    • 3) process
      • process.env : 시스템 환경변수 출력, 임의로 환경 변수 저장 가능, 서비스의 중요한 키 저장 공간으로도 사용
      • process.nextTick(콜백): 이벤트 루프가 다른 콜백 함수들보다 nextTick의 콜백 함수를 우선으로 처리하도록 만듦
      • process.exti(코드) : 실행중인 노드 프로세스 종료
        • 인수를 주지 않거나 0을 주면 정상 종료를 뜻하고, 1을 주면 비정상 종료를 뜻함
    • 4) URL, URLSearchParams
    • 5) AbortController, FormData, fetch, Headers, Request, Response, Event, EventTarget: 브라우저에서 사용하던 API가 노드에도 동일하게 생성
    • 6) TextDecoder: Buffer를 문자열로 바꿉니다.
    • 7) TextEncoder: 문자열을 Buffer로 바꿉니다.
    • 8) WebAssembly: 웹어셈블리 처리를 담당합니다.
  • 3.5 노드 내장 모듈 사용하기

    • 1) os : require('os') 또는 require('node:os'), 사용자 컴퓨터의 운영체제 정보
      • ex) const os=require(’os’);
      • os.arch(): process.arch와 동일합니다.
      • os.platform(): process.platform과 동일합니다.
      • os.type(): 운영체제의 종류를 보여줍니다.
      • os.uptime(): 운영체제 부팅 이후 흐른 시간(초)을 보여줍니다. process.uptime()은 노드의 실행 시간이었습니다.
      • os.hostname(): 컴퓨터의 이름을 보여줍니다.
      • os.release(): 운영체제의 버전을 보여줍니다.
      • os.homedir(): 홈 디렉터리 경로를 보여줍니다.
      • os.tmpdir(): 임시 파일 저장 경로를 보여줍니다.
      • os.cpus(): 컴퓨터의 코어 정보를 보여줍니다.
      • os.freemem(): 사용 가능한 메모리(RAM)를 보여줍니다.
      • os.totalmem(): 전체 메모리 용량을 보여줍니다.
    • 2) path : 폴더와 파일의 경로 쉽게 조작 가능한 모듈
      • ex) const path =require(’path’);
      • path.sep: 경로의 구분자입니다. 윈도는 \, POSIX는 /입니다.
      • path.delimiter: 환경 변수의 구분자입니다. process.env.PATH를 입력하면 여러 개의 경로가 이 구분자로 구분되어 있습니다. 윈도는 세미콜론(;)이고, POSIX는 콜론(:)입니다.
      • path.dirname(경로): 파일이 위치한 폴더 경로를 보여줍니다.
      • path.extname(경로): 파일의 확장자를 보여줍니다.
      • path.basename(경로, 확장자): 파일의 이름(확장자 포함)을 표시합니다. 파일의 이름만 표시하고 싶다면 basename의 두 번째 인수로 파일의 확장자를 넣으면 됩니다.
      • path.parse(경로): 파일 경로를 root, dir, base, ext, name으로 분리합니다.
      • path.format(객체): path.parse()한 객체를 파일 경로로 합칩니다.
      • path.normalize(경로): /나 \를 실수로 여러 번 사용했거나 혼용했을 때 정상적인 경로로 변환합니다.
      • path.isAbsolute(경로): 파일의 경로가 절대경로인지 상대경로인지를 true나 false로 알립니다.
      • path.relative(기준경로, 비교경로): 경로를 두 개 넣으면 첫 번째 경로에서 두 번째 경로로 가는 방법을 알립니다.
      • path.join(경로, …): 여러 인수를 넣으면 하나의 경로로 합칩니다. 상대경로인 ..(부모 디렉터리)과 .(현 위치)도 알아서 처리합니다.
      • path.resolve(경로, …): path.join()과 비슷하지만 차이가 있습니다. 차이점은 다음에 나오는 Note에서 설명합니다.
profile
백엔드 개발을 좋아하고 공부하고 있습니다. 코드 작성 뿐만 아니라 쿼리 성능 고려, 클린 코드, 테스트 케이스 작성에 주력해 모든 에러 상황을 대비하는 개발자로 성장하고 싶습니다.

0개의 댓글