기본적으로 Node.js는 단일 스레드에서 실행되고, 이벤트 루프는 한번에 하나의 프로세스만 발생한다.

따라서 CPU 집약적인 작업 ( 대규모 데이터 처리, 이미지 변환 등 )이 메인 스레드를 차단 할 수 있다.

 

Worker Thread

CPU 집약적인 작업을 실행할 때 메인 스레드의 성능과 응답성을 유지하기 위해 사용하는 백그라운드 스레드다.

Wokrer는 비동기적으로 실행되고, JavaScript의 싱글 스레드 모델을 보완하여 멀티스레드 환경을 제공한다.

 

1. 독립된 스레드

 Woker는 메인 스레드와 별도의 실행 컨텍스트에서 동작하며, 독립적인 global scope를 가진다.

 

2. 메세지 기반 통신

 메인 스레드와 Worker는 postMessage()와 onMessage를 통해 데이터를 교환한다.

 

woker.js

// Worker 내부 코드
onmessage = function(event) {
  const data = event.data; // 메인 스레드에서 받은 데이터
  const result = data * 2; // 작업 처리
  postMessage(result); // 결과 반환
};

 

main.js

// 메인 스레드 코드
const worker = new Worker('worker.js');

// 메시지 보내기
worker.postMessage(10);

// 메시지 받기
worker.onmessage = function(event) {
  console.log('Worker로부터 받은 결과:', event.data); // 20
};

// Worker 종료
worker.terminate();

 

Javscript에서 제공하는 스케줄링 함수는 다음과 같다.

 

 

setTimeout

let id = setTimeout(()=>{
	내용
}, 밀리초);

 

일정시간 ( = 내가 설정한 밀리초 ) 후에 콜백 함수를 실행해준다.

setTimeout 함수를 실행하면 타이머 식별자를 반환해줘서,

해당 타이머 식별자를 통해 예약되어 있는 setTieout 함수 실행을 취소 해 줄 수 있다.

 

clearTimout

clearTimeout(식별자 id);

 

위처럼 clearTimeout을 통해 취소해 줄 수 있다. 단, 취소가 되더라도 해당 식별자의 값은 null이 되지는 않는다.

 

 

setInterval

let id = setInterval(()=>{
	내용
}, 밀리초);

 

일정시간 ( = 내가 설정한 밀리초 ) 마다 콜백 함수를 실행해준다.

setTimeout과 마찬가지로 함수를 실행하면 식별자를 반환해줘서 취소해 줄 수 있다.

 

clearInterval

clearInterval(식별자 아이디);

 

위처럼 clearInterval을 통해 취소해 줄 수 있다.

 


setInterval, 중첩 setTimeout 비교

setInerval 사용

let i=0;
serInterval(function(){
	func(i++);
}, 100);

 

  • setInterval을 사용하면 func 호출 사이의 지연 간격이 실제 명시한 간격(여기서는 100ms)보다 짧아진다.
  • func을 실행하는 데 소모되는 시간도 지연 간격에 포함시키기 때문
  • func 실행 시간이 명시한 간격보다 길어지면 함수 실행이 종료될 때까지 기다리고 종료되면 바로 다음 호출을 시작한다.
  • 따라서 함수 호출에 걸리는 시간이 매번 delay 밀리 초보다 길면, 모든 함수가 한번에 쉼 없이 연속으로 호출된다.

 

중첩 setTimeout 사용

setTimeout을 재귀적으로 호출하면 setInterval을 쓰는 것처럼 사용할 수 있다.

let i = 1;
setTimeout(function run() {
  func(i++);
  setTimeout(run, 100);
}, 100);

 

  • 중첩 setTimeout을 사용하면 명시한 지연( 여기서는 100ms )이 보장된다.
  • 지연 간격이 보장되는 이유는 이전 함수의 실행이 종료(=완료)된 이후에 다음 함수 호출에 대한 계획이 세워지기 때문

패키지 ( Package )

Node.js에서 코드의 재사용성을 높이기 위해 작성된 독립적인 코드 조각을 '모듈'이라고 부르고,

이러한 모듈을 npm이나 yarn과 같은 패키지 매니저를 통해 업도르하여 다른 개발자들과 공유할 때,

이를 패키지라고 한다.

 

 - 모듈은 일반적으로 프로젝트 내에서 사용되는 코드 조각을 의미하며, 패키지는 이러한 모듈을 포함하고 있거나

   다른 패키지에 의존하고 있는 코드의 집합을 의미한다.

 - 패키지는 다른 패키지를 사용할 수 있다. 이런 관계를 의존 관계라고 부른다.

 

패키지 매니저 ( Package Manager )

패키지 매니저 ( 출처 : https://devopedia.org/package-manager )

  • 패키지 매니저는 패키지를 손쉽게 다루는 작업을 안전하고 편리하게 사용하기 위한 툴이다.
  • Node.js 패키지의 설치, 업데이트, 삭제 등을 할 수 있고, 패키지간의 의존성을 관리해준다.
  • Node.js에서 대표적으로 사용하는 패키지 매니저는 npm과 yarn이 존재한다.

 

NPM ( Node Package Manager )

  • npm은 자바스크립트에서 사용할 수 있는 패키지(모듈) 관리자다.
  • Node.js와 관계없이 프론트엔드에서만 사용 가능한 Javascript Package들도 등록되어 있다

 

yarn

  • npm의 대체제로 Facebook이 2016년에 출시한 패키지 매니저로, npm의 대체제로서 등장했다.
  • npm의 부족한 부분을 보완하고 보안 성능이 향상된 패키지 매니저다.
  • yarn은 패키지를 다운로드 하는 과정에서 해당하는 패키지의 보안 검사를 수행한다. 패키지 내부에 위험한 스크립트가 다운로드 되거나, 종속성 문제가 발생하는 것을 방지할 수 있다.
  • yarn은 병렬 처리를 도입해서, 패키지 설치 속도가 npm보다 빠르다는 장점이 있다.

 

package.json

package.json

  • package.json은 Node.js 프로젝트의 가장 핵심적인 파일로 프로젝트에 대한 정보와 설치한 패키지들의 버전을 관리할 때 사용하는 파일이다.
  • package.json 파일에는 프로젝트명, 작성자, 라이센스 정보 등 일반적인 프로젝트의 메타 데이터 뿐만 아니라, 스크립트를 실행할 수 있는 필드도 포함되어 있다.
  • npm과 yarn 모두 동일한 package.json 파일을 참조한다.

 

package-lock.json과 yarn.lock

  • package-lock.json 또는 yarn.lock 파일은 package.json에서 정의한 패키지 외에도 node_modules에 들어있는 패키지들의 버전과 의존 관계가 상사하게 정의되어 있다.
  • 만약, node_modules 폴더가 없더라도, 해당하는 lock 파일이 존재한다면 동일한 패키지 구조를 재설치 할 수 있다.
  • npm으로 패키지를 설치, 수정, 삭제할 때마다 패키지들의 정확한 의존 관계를 package-lock.json 파일에 저장한다.
  • yarn의 경우 패키지들의 상세한 의존 관계를 yarn.lock 파일에 저장한다.
  • 이러한 lock 파일들은 개발 환경 간에 일관된 패키지 버전을 보장해줘서 버전 관리에 매우 중요한 역할을 한다.

 

yarn 설치

글로벌 환경에서 yarn을 설치하기 위해서는 아래 명령어를 터미널에 입력한다.

# npm을 이용하여 전역 환경에 Yarn을 설치합니다!
npm install -g yarn
  • npm install -g yarn은 npm으로 전역 패키지를 설치할 때 사용하는 명령어다
  • yarn 패키지 매니저를 어디서든 사용할 수 있도록 설치한다.
  • 설치가 완료되었는지 확인 하기 위해서는 yarn -v를 입력해 확인한다.

만약, yarn: 이 시스템에서 스크립트를 실행할 수 없으므로... 라는 에러가 난다면,

권한문제로 powershell에서 명령어를 통해 해결할 수 있다.

 

1. powershell 프로그램을 실행한다.

2. get-executionpolicy를 입력해 권한 상태를 확인한다.

3. remotesigned 권한 상태가 아니라면 set-executionpolicy remotesigned를 입력후 y를 눌러 수락한다.

4. get-executionpolicy로 권한 상태가 remotesigned로 변경되었는지 확인한다.

5. npm install -g yarn으로 재설치한다.

 

 

'IT' 카테고리의 다른 글

[IT] Access Token, Refresh Token  (1) 2024.09.09
[IT] 인증, 인가  (0) 2024.09.09
[IT] JWT  (0) 2024.09.08
[IT] 쿠키와 세션  (0) 2024.09.08
[AWS] RDS 구매하고 사용하기  (0) 2024.09.05

+ Recent posts