2023.06.16 TIL

0

TIL

목록 보기
32/37
post-thumbnail

오늘의 나는 무엇을 잘했을까?

Node.js를 공부하면서 이전에 배운 개념들을 다시 복습했다. 안다고 바로 넘어가지 않고 꼼꼼히 듣고 공부한 결과 내가 잘 모르고 있거나 놓쳤던 부분들을 새로 배우고 복습할 수 있었다.

오늘의 나는 무엇을 배웠을까?

Node.js 기본개념

  • 모듈이란?

    • 전체를 이루는 부품 하나하나를 모듈이라고 한다.

    • 자바스크립트 파일 하나하나를 뜻한다.

    • 모듈 불러오기, 내보내기

      // 모듈 불러오기
      const m = require("[모듈이름]");
      m.[모듈이 내보낸 함수나 변수등등] // 모듈 사용
      
      // 모듈 내보내기
      function add(.){...}
      
      exports.[내보낼 이름] = add;
      // 객체를 내보낼 때
      module.exports = [객체이름];
      
    • Module Wrapper function

      • nodejs가 모듈을 로드할 때는 한 가지 해주는 작업이 있는데, 바로 module wrapper function이라는 것으로 전체 코드를 감싸주는 작업이다.

        // 우리가 작성한 모듈 코드
        function add(a, b) {
          return a + b;
        }
        
        exports.add = add;
        // 실제 nodejs가 모듈을 로드할 때 
        (function (exports, require, module, __filename, __dirname) {
          function add(a, b) {
            return a + b;
          }
          exports.add = add;
        });
      • 모듈 안에서 위의 래퍼 함수의 다섯가지 인자인 exports, require, module, filename, dirname은 항상 자유롭게 접근할 수 있다.

      • 이 중 module 객체를 console.log로 확인한 결과

        exports 객체module 객체의 exports 프로퍼티가 가리키는 객체는 '동일한' 객체이다. 그리고 우리가 모듈 내부의 것들을 외부로 공개하기 위해 exports나 module.exports를 썼던 것은 바로 이 객체에 접근하기 위해서였다.

      • 외부에서 이 모듈을 require함수로 로드하면 이 exports객체(module 객체의 exports프로퍼티가 가리키는 객체)가 리턴된다.

      • 그런데 여기서, 모듈 안의 어떤 객체를 module.exports가 아닌 exports로 내보낸다면 nodejs는 require함수로 모듈을 로드할 때 module.exports객체를 리턴하므로 exports를 아예 새로운 객체를 가리키게 하면 안된다.

    • 서드파티(third-party module) 모듈

      • 외부 패키지를 의미한다. npm install ~로 설치할 수 있다.
      • 패키지를 설치하면 package-lock.json과 package.json이 생성된다.
      • 만약 어떤 서드파티 모듈이 다른 서드파티 모듈에 의존하고 있다면, 그 의존하고 있는 모듈 또한 함께 설치된다.
      • node_modules폴더는 실제로 서드파티 모듈들이 설치되어 저장되는 공간이다.

Node.js의 비동기 실행

  • Node.js는 비동기 실행을 위주로 돌아가야 유리한 환경이다.

  • 비동기 실행의 장점

    • 식당에 비유하면, 동기 실행과 비동기 실행의 차이는 다음과 같다.
      • 동기: 1번 손님 주문 → 1번 손님 음식 나올때까지 기다림 → 2번 손님 주문 →..
      • 비동기: 1번 손님 주문 → 2번 손님 주문 → … (중간에 주문 완료한 손님들 음식이 나오면 주문받기 잠시 멈추고 음식 서빙) → …
    • 각 단계에서 걸리는 시간이 다음과 같다고 가정해보자.
      • 주문 받는시간: 1분
      • 요리시간: 쉬운메뉴 5분, 어려운 메뉴 10분
      • 서빙 시간: 1분
    • 동기 실행
    • 비동기 실행
    • 비동기 실행 중심 프로그래밍을 하면 위와 같이 작업을 효율적으로 할 수 있다.
    • 애초에 Node.js를 만든 Ryan Dahl은 동기 실행 방식으로만 프로그래밍하는 것의 문제점을 제기하고 Node.js를 발표했다. 빠르게 처리할 수 있는 작업은 메인 스레드에서 진행하고, fileRead와 같은 비교적 오래 걸리는 작업들은 다른 스레드에게 맡겨서 비동기 코드를 효율적으로 실행한다.
  • Node.js에서 개발할 때 주의점

    • 메인 스레드는 CPU를 사용하는 수치 계산 작업이나 네트워크로 들어오는 클라이언트의 요청을 받아들이고 응답하는 작업을 한다.
    • 이 때, 고화질의 이미지 처리나 복잡한 수식의 처리는 CPU를 사용해야 하는데, 이런 작업들은 메인 스레드가 처리해야 한다. 그러면 비동기 작업방식이라 해도 메인 스레드가 다른 스레드에게 작업을 넘겨주지 못하게 되고, 작업이 intense하기 때문에 클라이언트 요청에 대한 응답이 느려지게 된다. 따라서 CPU에 부하가 많이 가는 CPU-intense한 작업은 Node.js에서 적절하지 않다.

Node.js의 이벤트

  • Node.js에서 많은 코어 모듈들의 객체들이 대부분 이벤트 기반으로 설계되었기 때문에 이벤트를 이해하고 활용할 줄 아는것이 중요하다.
  • events라는 코어 모듈(내장 모듈)을 사용한다.
     const EventEmitter = require('events');
     
     const myEmitter = new EventEmitter();
     
     // 'test'라는 이벤트 발생 시 콜백함수 실행
     myEmitter.on('test', ()=>{console.log('Success!')});
     
     // 'test'라는 이벤트 발생시키기
     myEmitter.emit('test');
  • EventEmiiter 객체 사용법
    • 항상 event발생 전에 콜백함수를 등록해줘야 한다.
    • 하나의 event에 대해 여러 콜백함수를 등록할 수 있다.
    • 이벤트 발생은 하나의 EventEmitter객체에 대해서만 유효하다.
       const EventEmiiter = require('events');
       
       const myEmmiter = new EventEmiiter();
       const myEmmiter2 = new EventEmiiter();
       
       // 'test'라는 이벤트 발생 시 콜백함수 실행
       myEmitter.on('test', ()=>{console.log(1)});
       myEmiiter2.on('test', ()=>{console.log(2)});
       // 'test'라는 이벤트 발생시키기
       myEmitter.emit('test');
       
       // myEmiiter에서 등록한 test 이벤트만 발생. 
       // myEmiiter2는 위 test 이벤트에 반응하지 않음
    • on메서드: 이벤트 핸들러 등록 메서드(동일한 기능의 addListener메서드도 있음)
    • emit메서드: 인위적으로 특정 이벤트를 발생시키는 메서드
    • once메서드: 특정 이벤트에 대해서 한 번만 반응하는 핸들러를 등록시키는 메서드
       const EventEmitter = require('events');
       
       const myEmitter = new EventEmitter();
       
       myEmitter.once('test', () => {
         console.log('Success!');
       });
       
       myEmitter.emit('test'); // 반응함 (한 번만 반응하므로)
       myEmitter.emit('test'); // 반응하지 않음
       myEmitter.emit('test'); // 반응하지 않음
    • listeners 메서드: 특정 이벤트에 대한 핸들러들을 출력해주는 메서드
    • off 메서드: 핸들러 해제 메서드, 해제할 핸들러의 레퍼런스를 전달해줘야 한다.

오늘의 나는 어떤 어려움이 있었을까?

머릿속에 지식들이 정리가 되지 않는다. next.js, typescript, node.js, 오늘 들은 특강까지. 너무 많은 것들이 들어왔고, 아직 next.js의 렌더링 원리도 정리가 안되어 있는데 다른 개념을 왔다갔다 하면 배우려니 정신이 없다.

내일의 나는 무엇을 해야할까?

  • vanilla javascript 복습하기
  • node.js강의 이어듣기
  • 렌더링 패턴 자료 수집하기(발표준비용)

0개의 댓글