본문 바로가기

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

[2024 Node.js 스터디] 김수아 #4주차 "Node.js 3장~5장"

반응형

●ch3

▶3.1_REPL 사용하기

입력한 코드를 Read(읽고), Eval(해석하고), Print(결과물 반환하고), Loop(종료까지 반복한다)

입력 코드를 REPL / REPL 종료하려면 [ctrl + C] *2 or [.exit]

*) REPL은 여러 줄 코드를 실행하기엔 불편해서, 긴 코드의 경우는 자바스크립트 파일을 만들어 파일 실행

 

▶3.2_JS파일 실행하기

test.js라는 파일을 만들어 코드를 작성하고, 이를 콘솔에서 실행해본다.

 

▶3.3_모듈로 만들기

모듈이란? 특정 기능을 하는 함수는 변수들의 집합/ 모듈로 만들어두면 여러 프로그램에서 해당 모듈 재사용 가능

모듈과 프로그램
같은 폴더에 var.js, func.js, index.js를 만든다. require함수를 통해 불러올 모듈의 경로를 적어 값들을 불러올 수 있다.
index.js를 실행해본 결과

*) ES2015 모듈

ES2015도입으로 자바스크립트에 자체 모듈 시스템 문법이 생겼다. 

 

 

require함수를 import로, module.exports를 export default로 바꾼다. 

 

require함수나 module객체는 따로 선언하지 않았음에도 노드에서 제공하는 내장 객체이기에 사용 가능

 

*) 파일의 확정자를 mjs로 지정해야 한다는 제한이 있다.

 

 

 

 

 

▶3.4_노드 내장객체 알아보기

  • global_브라우저의 window같은 전역 객체로 모든 파일에 접근 가능

 

window.open 매서드를 그냥 open으로 호출할 수  있듯이, global도 생략 가능

(global.require => require)

 

노드 버전에 따라 콘솔 내용 다를 수 있다

global 객체 안에는 수십 가지의 속성이 담김

 

 

 

 

 

 

 

 

 

 

 

 

 

  • console_window대신 global객체 안에 들어있음/ 브라우저의 console과 거의 비슷

이 객체는 보통 디버깅을 위해 사용, 개발하면서 변수에 값이 제대로 들어있는지 확인하거나 에러 내용을 콘솔에 표시하는 등에 씀

-console.time(레이블) : console.timeEnd(레이블)과 대응되어 같은 레이블 가진 time과 timeEnd사이의 시간 측정

-console.log(내용) : 평범한 로그를 콘솔에 표시

-console.error(에러 내용) : 에러를 콘솔에 표시

-console.table(배열) : 객체 리터럴을 넣으면 객체의 속성들이 테이블 형식으로 표현됨

-console.dir(객체, 옵션) : 객체를 콘솔에 표시할 때 사용/ 첫번째 인수는 표시할 객체, 두번째 인수는 옵션

-console.trace(레이블) : 에러가 어디서 발생했는지 추적할 수 있게 함

  • 타이머

타이머 기능을 제공하는 함수인 setTimeout, setInterval, setImmediate는 global 객체 안에 들어 있음

-setTimeout(콜백 함수, 밀리초) : 주어진 밀리초 이후에 콜백 함수 실행(밀리초: 1/1000초)

-setInterval(콜백 함수, 밀리초) : 주어진 밀리초마다 콜백 함수 반복 실행

-setImmediate(콜백 함수) : 콜백 함수를 즉시 실행

-clearTimeout(아이디) : setTimeout을 취소

-clearInterval(아이디) : setInterval을 취소

-clearImmediate(아이디) : setImmediate을 취소

  • __filename, __dirname

노드에서는 파일 사이에 모듈 관계가 있는 경우가 많아서 현재 파일의 경로나 파일명 알아야함

파일에 __filename과 __dirname을 넣어두면 실행 시 현재 파일명과 파일 경로로 바뀐다

  • module, exports, require

module.exports 대신에 각각의 변수를 exports객체에 하나씩 넣어도 동일하게 동작

=> module.exports와 exports는 같은 객체를 참조한다 

  • process

현재 실행되고 있는 노드 프로세스에 대한 정보를 담고 있음

 

▶3.5_노드 내장모듈 사용하기

  • 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() : 사용 가능한 메모리를 보여줌

-os.totalmem() : 전체 메모리 용량을 보여줌

 

 

 

  • path_폴더와 파일의 경로 쉽게 조작하도록 도와줌

-path.sep: 경로의 구분자,

윈도는 \이고, POSIX는 /

-path.delimiter: 환경 변수의 구분자,

윈도는 세미콜론(;)이고, 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()과 비슷하지만 차이가 있다

 

  • URL_인터넷 주소를 쉽게 조작하도록 도와주는 모듈

 

  • querystring_WHATWG방식의 url대신 기존 노드url사용할 때 search부분을 사용하기 쉽게 객체로 만드는 모듈

  • crypto_다양한 방식의 암호화 도와주는 모듈

단방향 암호화
양방향 암호화

  • util_각종 편의 기능 모아둔 모듈

=util.deprecate: 함수가 deprecated 처리되었음을 알림. 첫 번째 인수로 넣은 함수를 사용했을 때 경고 메시지가 출력, 두 번째 인수로 경고 메시지 내용을 넣기

 

=util.promisify: 콜백 패턴을 프로미스 패턴으로 바꿈. 바꿀 함수를 인수로 제공하기    

 

  • worker_threads 

- 멀티 스레드 방식으로 작업 가능

- isMainThread로 현재 코드가 메인 스레드나 워커 스레드에서 실행되는지 구분

- 워커에서 on 메서드를 사용할 때는 직접 워커를 종료

  • child_process

- 노드에서 다른 프로그램을 실행하고 싶거나 명령어를 수행하고 싶을 때 사용하는 모듈

- 다른언어의 코드를 실행하고 결괏값을 받을 수 있음

- 현재 프로세스 외에 새로운 프로세스를 띄어서 명령을 수행하고 결과를 알려줌

 

▶3.6_파일 시스템 접근하기

fs모듈은 파일을 생성하거나 삭제하고 읽거나 쓸 수 있는, 파일 시스템에 접근하는 모듈

  • 동기와 비동기: 백그라운드 작업 완료 확인 여부
  • 블로킹과 논 블로킹: 함수가 바로 return되는지 여부

''동기-블로킹 방식에서는 백그라운드 작업 완료 여부 게속 확인하며 호출한 함수 바로 return되지 않고 작업이 끝나야 return됨"

  • 버퍼와 스트림(파일을 읽거나 쓰는 방식)
  • 버퍼: 노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간 마련해두고 파일 데이터를 메모리에 저장한 후 사용자가 조작할 수 있도록 하는데, 이때 메모리에 저장된 데이터가 버퍼이다. (버퍼링: 영상 재생까지 데이터 모으는 동작)
  • 스트림: 버퍼의 크기를 작게 만든 후 여러 번으로 나눠 보내는 방식이다. (스트리밍: 영상 실시간 송출)

▶3.7_이벤트 이해하기

on(이벤트명, 콜백): 이벤트 이름과 이벤트 발생 시의 콜백을 연결

addListener(이벤트명, 콜백): on과 기능이 같다

emit(이벤트명): 이벤트를 호출하는 메서드

once(이벤트명, 콜백): 한 번만 실행되는 이벤트

removeAllListeners(이벤트명): 이벤트에 연결된 모든 이벤트 리스너를 제거

removeListener(이벤트명, 리스너): 이벤트에 연결된 리스너를 하나씩 제거

off(이벤트명, 콜백): 노드 10 버전에서 추가된 메서드로, removeListener와 기능이 같다

listenerCount(이벤트명): 현재 리스너가 몇 개 연결되어 있는지 확인

 

▶3.8_예외 처리하기

node: command not found: 환경 변수가 제대로 설정되어 있지 않은 것

ReferenceError: 모듈 is not defined: 모듈을 require했는지 확인

Error: Cannot find module 모듈명: 해당 모듈을 require했지만 설치하지 않음 npm i 명령어로 설치하기Error [ERR_MODULE_NOT_FOUND]: 존재하지 않는 모듈을 불러오려 할 때 발생Error: Can't set headers after they are sent: 요청에 대한 응답을 보낼 때 응답을 두 번 이상 보냄FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed- JavaScript heap out of memory: 코드를 실행할 때 메모리가 부족해서 스크립트가 정상적으로 작동하지 않는 경우UnhandledPromiseRejectionWarning: Unhandled promise rejection: 프로미스 사용 시 catch 메서드를 붙이지 않으면 발생EADDRINUSE 포트 번호: 해당 포트 번호에 이미 다른 프로세스가 연결

EACCES 또는 EPERM: 노드가 작업을 수행하는 데 권한이 충분하지 않음

EJSONPARSE: package.json 등의 JSON 파일에 문법 오류가 있을 때 발생

ECONNREFUSED: 요청을 보냈으나 연결이 성립하지 않을 때 발생

ETARGET: package.json에 기록한 패키지 버전이 존재하지 않을 때 발생

ETIMEOUT: 요청을 보냈으나 응답이 시간 내에 오지 않을 때 발생

ENOENT: no such file or directory: 지정한 폴더나 파일이 존재하지 않는 경우

 

●ch4

▶4.1_ 요청과 응답 이해하기

 

 

=localhost? 현재 컴퓨터의 내부 주소/ 외부에서 접근할 수 없고 자신의 컴퓨터에서만 접근 가능/ 서버 개발 시 테스트용으로 사용됨

=포트? 서버 내 프로세스를 구분하는 번호/ 다른 서비스가 사용하고 있는 포트를 사용하게 되면 ERROR

 

▶4.2_ REST와 라우팅 사용하기

서버에 요청을 보낼 땐 주소를 통해 요청의 내용을 표현하는데, 서버가 쉬운 주소를 사용하는 것이 좋다

이때 REST는 REpresentational State Transfer의 줄임말로 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법이다

 

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

 

▶4.3_ 쿠키와 세션 이해하기

-쿠키

내가 누구인지 기억하기 위해서 서버는 요청에 대한 응답을 할 때 쿠키라는 것을 같이 보낸다

쿠키는 유효기간 있고, '키-값'의 쌍이다서버로부터 쿠키가 오면 웹 브라우저는 쿠키를 저장해두었다가 다음에 요청할 때마다 쿠키를 동봉해서 보낸다서버는 요청에 들어있는 쿠키를 읽어서 사용자가 누군지 파악한다쿠키는 요청의 헤더에 담겨 전송된다

  • 쿠키명=쿠키값: 기본적인 쿠키의 값, mycookie=test 또는 name=zerocho와 같이 설정
  • Expires=날짜: 만료 기한
  • Max-age=초: Expires와 비슷하지만 날짜 대신 초를 입력가능
  • Domain=도메인명: 쿠키가 전송될 도메인을 특정 가능
  • Path=URL: 쿠키가 전송될 URL을 특정 가능
  • Secure: HTTPS일 경우에만 쿠키가 전송
  • HttpOnly: 설정 시 자바스크립트에서 쿠키에 접근할 수 없음

-세션

서버에 사용자 정보를 저장하고 클라이언트와는 세션 아이디로만 소통한다 

세션 아이디는 꼭 쿠키를 사용해서 주고받지 않아도 되지만, 쿠키를 사용하는 것이 가장 간단하여 주로 쿠키 사용세션을 위해 사용하는 쿠키를 '세션쿠키'라 한다

 

▶4.4_ https와 http2

 

https모듈은 웹 서버에  SSL암호화한다 => 중간에 다른 사람이 요청 가로채도 내용 확인 못함

 

But...아무나 사용할 수 있는게 아니라서 Let's Encrypt와 같은 인증 기관에서 인증서를 발급받아야 한다...

 

http2모듈은 SSL암호화와 더불어 최신 HTTP프로토콜인 http/2사용할 수 있게 한다http/2방식이 기존보다 개선되어 훨씬 효율적으로 요청 보낸다

 

 

 

▶4.5_ cluster

cluster모듈은 기본적으로 싱글 프로세스로 동작하는 노드가 CPU코어를 모두 사용할 수 있게 해준다

포트를 공유하는 노드 프로세스를 여러 개 둘 수도 있기에 요청 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산되게 하여 서버에 무리가 덜 가게 한다

 

●ch5

▶5.1_ npm알아보기

 

 

npm이란?

Node Package Manager의 약어로 노드와 자바스크립트를 더욱 견고하게 만들어 준다

 

대부분 오픈소스여서 노드를 통해 웹 개발할 때 많은 도움이 된다

npm에 업로드된 노드 모듈을 패키지라고 부른다

 

*) npm의 대체자로 yarn이 있는데 이는 페이스북이 내놓은 패키지 매니저이다. 

npm서버가 너무 느릴 경우에 yarn으로 대신 설치

 

▶5.2_ package.json으로 패키지 관리하기

패키지는 저마다 고유한 버전이 있기에 어딘가에 기록해둬야 한다

또한, 같은 패키지더라도 버전별로 기능이 다르므로 프로젝트 설치할 때 패키지도 동일한 버전 설치해야 한다이때 설치한 패키지를 관리하는 파일이 package.json이다노드 프로젝트 시작 전에 폴더 내부에  package.json을 만들고 시작한다

  • package name: 패키지의 이름
  • version: 패키지의 버전
  • entry point: 자바스크립트 실행 파일 진입점
  • test command: 코드를 테스트할 때 입력할 명령어를 의미
  • git repository: 코드를 저장해둔 깃(Git) 저장소 주소를 의미
  • keywords: 키워드는 npm 공식 홈페이지(https://npmjs.com)에서 패키지를 쉽게 찾을 수 있게 한다
  • license: 해당 패키지의 라이선스를 넣기

*) 라이선스? 오픈 소스라해도 라이선스별로 제한 사항이 있으므로 설치 전에 라이선스를 확인한다

 

▶5.3_ 패키지 버전 이해하기

노드 패키지들의 버전은 항상 세자리로 이루어짐이는 SemVer방식의 버전 넘버링을 따르기 때문

 

major버전_ 첫번째 자리

-> 0이면 초기 개발 중

-> 1이면 정식 버전

-> 하위 호환 안 될 정도로 패키지 내용 수정

minor버전_ 두번째 자리

->하위 호환되는 기능 업데이트 할 때

patc버전_ 세번째 자리

-> new < 기존 기능에 문제를 수정

배포 후에는 버전 내용을 절대 수정하면 안된다

수정 사항이 생기면 세 버전 중 하나를 의미에 맞게 올려서 새로운 버전으로 배포한다

 

 

▶5.4_ 기타 npm명령어

npm uninstall [패키지 이름] : 해당 패키지를 제거하는 명령어

npm search [검색어] : npm의 패키지를 검색가능

npm info [패키지 이름] : 패키지의 세부 정보를 파악하고자 할 때 사용하는 명령어

npm login : npm 로그인을 위한 명령어

npm whoami : 로그인한 사용자가 누구인지 알림

npm logout : npm login으로 로그인한 계정을 로그아웃할 때 사용

npm version [버전] : package.json의 버전을 올림

npm deprecate [패키지 이름] [버전] [메시지] : 해당 패키지를 설치할 때 경고 메시지를 띄우게 하는 명령어

npm publish : 자신이 만든 패키지를 배포할 때 사용

npm unpublish : 배포한 패키지를 제거할 때 사용

 

▶5.5_ 패키지 배포하기

1) npm 웹 사이트 우측 상단의 Sign Up 회원가입

2) 회원 가입 confirm 메일을 확인

3) 콘솔에서 npm login 명령어를 입력해 생성한 계정으로 로그인

4) 패키지로 만들 코드 작성 (package.json의 main 부분의 파일명과 일치해야 함)

 

 

 

 

반응형