본문 바로가기

WINK-(Web & App)/Express.js (Node.js) 스터디

[2024 Node.js 스터디] 김규현 4주차

반응형

 

REPL 사용하기

Read 읽고 Eval 해석하고 Print 결과물을 반환하고 Loop 종료할 때까지 반복

> const str = 'Hello world, hello wink'; //Read Eval
undefined
> console.log(str);
Hello world, hello wink // Print
undefined
> // Loop?

 

 

CommonJS 모듈

노드 생태계에서 가장 널리 쓰이는 모듈

 

<실습과정>

var.js와 func.js파일 생성
index.js파일 생성후 실행

 

index.js를 실행할 때 var.js와 func,js 모듈 모두 이용

 

require.js 파일 생성후 실행

 

require는 파일 최상단에 위치할 필요없음

속성값으로 각 파일의 모듈값 들어있음

require.main은 노드 실행 시 첫 모듈을 나타냄

순환 참조가 있을 경우에는 순환 참조되는 대상을 빈 객체로 만듭니다. 

-> 에러를 발생시키지 않지만 조용히 순환 참조되는 객체를 빈 객체로 변경하므로 안생기도록하는 것이 중요  

 

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'));

 

 

CommonJS 모듈과 ECMAScript 모듈간 차이점

차이점 CommonJS 모듈 ECMAScript 모듈
문법​ require('./a');
module.exports = A;
const A = require('./a');
exports.C = D;
const E = F; exports.E = E;
const { C, E } = require ('./b');
import './a.mjs';
export default A;
import A from './a.mjs';
export const C = D;
const E = F; export { E };
import { C, E } from './b.mjs';
확장자 js, cjs js(package.json에 type: "module"필요),mjs
확장자 생략 가능 불가능.
다이낵스 임포트 가능 불가능
인덱스(index) 생략 가능(require('./folder')) 불가능(import './folder/index.mjs')
top level await 불가능 가능
서로 간 호출  가능 가능

 

  • CommonJS 모듈과 ES 모듈은 서로 간에 잘 호환되지 않는 케이스가 많으므로 웬만하면 한 가지 형식만 사용하는 것을 권장
  • ES 모듈의 import나 export default는 require나 module처럼 함수나 객체가 아니라 문법 그  자체
  • CommonJS 모듈과는 다르게 import 시 파일 경로에서 js, mjs 같은 확장자는 생략할 수 없음
  • 폴더 내부에서 index.js도 생략할 수 없음

 

다이낵스 임포트

조건부로 모듈을 불러오는 것 (위의 표에서 보듯이 CommonJS모듈에서는 가능하지만 ECMAScript 모듈에서는 불가능)

 

위의 터미널 결과같이 ES묘듈은 if문(조건부에서) 안에서 import불가능

 

 

이때는 CommonJs모듈을 사용해서(?) dyma,ic.mjs를 수정

 

_filename, _dirname

 

노드에서는 파일 사이에 모듈 관계가 있는 경우가 많으므로 위의 키워드를 이용하여 경로에 대한 정보 제공받음

filename.js의 대한 정보 제공

CommonJS 모듈에서 사용했던 require함수나 module객체는 따로 선언하지 않았음에도 노드에서 기본적으로 내장되어있는 내장 객체가 있기 때문에 사용가능

 

노드 내장 객체

global

  • 브라우저의 window와 같은 전역 객체
  • 전역 객체이므로 모든 파일에서 접근가능
  • window.open 메서드를 그냥 open으로 호출할 수 있는 것처럼 global도 생략가능
  • global 객체 내부에는 매우 많은 속성이 존재

globalA 모듈의 함수는 global.message 값을 반환

 

console

  • 디버깅을 위해 사용
  • 개발 중 변수에 값이 제대로 들어 있는지 확인하기 위해 사용
  • 에러 발생 시 에러 내용을 콘솔에 표시하기 위해서도 사용
  • 코드 실행 시간을 알아보려고 할 때도 사용
console.time(레이블) console.timeEnd(레이블)과 대응되어 같은 레이블을 가진 time timeEnd 사이의 시간을 측정
console.log(내용) 평범한 로그를 콘솔에 표시
console.error(에러 내용) 에러를 콘솔에 표시
consonle.table(배열) 배열의 요소로 객체 리터럴을 넣으면, 객체의 속성들이 테이블 형식으로 표현
console.dir(객체, 옵션) 1번째 인수로 표시할 객체를 넣고, 두 번째 인수로 옵션을 삽입
console.trace(레이블) 에러가 어디서 발생했는지 추적

 

타이머 

  • 타이머 기능 제공 함수
setTimeout(콜백 함수, 밀리초) 주어진 밀리초 이후에 콜백 함수를 실행
setinterval(콜백 함수, 밀리초) 주어진 밀리초마다 콜백 함수를 반복
setimmediate(콜백 함수) 콜백 함수를 즉시 실행
clearTimeout(아이디) setTimeout을 취소
clearTimeout(아이디) setInterval을 취소
clearImmediate(아이디) setImmediate를 취소

 

process

  • 현재 실행되고 있는 노드 프로세스 정보
process.version 설치된 노드의 버전
process.arch 프로세서 아키텍처 정보
process.platform 운영체제 플랫폼 정보
process.pid 현재 프로세서의 아이디
process.uptime() 프로세서가 시작된 후 흐른 시간
process.exePath 노드의 경로
process.cwd() 현재 프로세스가 실행되는 위치
process.cpuUsage() 현재 cpu의 사용량

 

노드 내장 모듈

os

  • 사용자 컴퓨터의 운영체제 정보를 가져오는 모듈
os.arch() process.arch과 동일
os.platform() process.platform과 동일
os.type() 운영체제의 종류를 보여줌
os.uptime() 운영체제 부팅 이후 흐린 시간 보내줌
os.hostname() 컴퓨터의 이름을 보여줌
os.release() 운영체제의 버전을 보여줌
os.homdir() 홈 디렉터리 경로를 보여줌
os.tmdir() 임시 파일 경로를 보여줌
os.cpus() 컴퓨터의 코어 정보를 보여줌
os.freemem() 사용 가능한 메모리를 보여줌

 

 

요청과 응답

 

  • 클라이언트에서 서버로 요청을 보내고, 서버에서는 클라이언트에 응답을 보냄
  • 에러가 발생하더라도 응답을 보내어 요청이 마무이 되었음을 알려줘야함(2xx(성공), 3xx, 4xx(요청 오류), 5xx(서버 오류))

 

REST

  • REpresentational State Transfer(서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법)

 

요청 메서드

GET 서버 자원을가져오고자 할 때
POST 서버에 자원을 새로 등록하고자 할 때
PUT 서버의 자원을 요청에 들어 있는 자원으로 치환하고자 할 때 
PATCH 서버 자원의 일부만 수정하고자 할 때
DELETE 서버 자원을 삭제하고자 할 때
OPTIONS 요청전 통신 옵션을 설명하기 위해

 

쿠키와 세션

  • 누가 요청을 보냈는지 확인하기위해 사용
  • 쿠키는 유효기간이 있으며 키-값의 쌍임

 

cluster모듈

  • 기본적으로 싱글 프로세서로 동작하는 노드의 cpu를 모두 사용할 수 있게 해줌
  • 메모리 공유를 못한다는 단점 존재

npm(Node Package Manager)

  • 수많은 패키지들이 등록되어있어 노드와 자바스크립트의 생태계를 더욱 견고하게 만듬

 

package.json

  • 설치한 패키지의 버전을 관리하는 파일
package name 패키지의 이름
version 패키지의 버전
entry point 자바스크립트 실행 파일 진입점
test command 코드를 테스트할 때 입력할 명령어 
get repository 코드를 저장해둔 깃 저장소 주소

 

패키지 버전 이해

  • SemVer 방식의 버전 넘버링을 따르기 때문에 노드 패키지들의 버전은 항상 세자리로 이루어져있음
  • 첫번째 자리(메이저로 하위 호환이 되지 않는 변경 사항) -> 0 : 초기 개발, 1 : 정식버전
  • 두번째 자리(마이너로 하위 호환이 되는 변경 사항)
  • 세번째 자리(패치로 간단한 버그 수정)
  • 새 버전 배포후에는 그 버전의 내용 절대 수정 X

 

npm 명령어

npm update [패키지 이름] 업데이트 가능한 모든 패키지가 Wanted에 적힌 버전으로 업데이트
npm uninstall [패키지 이름] 해당 패키지를 제거하는 명령어
npm search [검색어] npm의 패키지를 검색
npm info [패키지 이름] 패키지의 세부 정보를 파악하고자 할 때 사용하는 명령어
npm login npm 로그인

 

 

반응형