모듈 , NPM - Codeflow 
 모듈 , NPM 
 모듈 의 개념 과 Node . js 의 모듈 에 대해서 알아보 고 , NPM 에 대해서 알아봅니다 . 
 모듈 , NPM , 패키지 매니저 
 Node . js 주요 내장 모듈 
 Node . js 주요 전역 객체 
 npm 사용법 
 … 모듈 은 여러 가지 로 정의 될 수 있 지만 , 일반 적 으로 큰 체계 의 구성 요소 이 고 , 다른 구성 요소 와 독립 적 으로 운영 된다 … 프로그램 에서 임의 의 두 부분 이 직접 적 인 상호 관계 가 많 아 지 면 , … 모듈 성 이 떨어진다 … ( 위키백과 ) 
 특정 기능 을 하 는 재 사용 가능 한 , 독립 적 인 코드 를 모듈 ( Module ) 이 라고 합니다 . 모듈 을 작성 할 때 는 다른 모듈 과 의 직접 적 인 상관 관계 를 최소 화 하 며 , 상호 간 에 느슨 한 인터페이스 를 노출 하 는 것 이 스파게티 코드 를 방지 하 고 , 짜임 새 있 는 프로그램 을 작성 하 는 지름길 입니다 . 
 Node . js 에서 는 파일 하나 를 하나 의 모듈 로 인식 합니다 . 코드 상 에서 모듈 의 실체 는 값 이나 객체 ( Object ) 입니다 . 
 ./ gugu . js 
 print : printGugu , 
 printAll : printGuguAll 
 . / some - module . js 
 위 처럼 module . exports 라는 객체 에 값 을 덮 어 씌우 거나 속성 을 할당 함 으로써 모듈 의 내부 는 숨기 고 , 모듈 밖 으로 제공 하 고 싶 은 인터페이스 를 노출 할 수 있 습니다 . module 객체 는 Node . js 에서 파일 ( 모듈 ) 스코프 내 에 존재 하 는 모듈 에 대한 정보 가 담긴 객체 입니다 . 
 타 모듈 을 사용 할 때 는 require 라는 내장 함수 를 이용 합니다 . Node . js 의 require 함수 는 아래 와 같 은 흐름 으로 요청 된 경로 의 모듈 을 로드 합니다 . 
 require ( ‘ some - module ’) 
 some - module 이 내장 모듈 ( Core Module ) 이 면 그 바이너리 파일 을 로드 한다 . 
 그렇 지 않 다면 . / node _ modules 폴더 가 있 는지 확인 하 고 . / node _ modules / some - module 폴더 를 찾 는다 . 
 폴더 를 찾 으면 some - module 폴더 를 로드 하 고 없 으면 상위 디렉 토리 로 이동하 여 다시 위 작업 을 반복 한다 . 
 / node _ modules 에서 도 some - module 폴더 를 찾 지 못하 면 오류 
 require ( ‘…/ path / some - module ’) 
 절대 경로 나 상대 경로 가 주어질 때 그 경로 가 폴더 라면 폴더 를 로드 한다 . 
 그렇 지 않 다면 경로 뒤 에 . js . json . node 를 붙혀 가 면서 찾아보 고 파일 을 로드 한다 . 
 그래도 찾 지 못하 면 오류 
 경로 가 파일 인 경우 
 파일 을 실행 하 고 module . exports 값 을 리턴 
 경로 가 폴더 인 경우 
 폴더 에 package . json 파일 이 있 다면 main 파일 의 경로 를 찾 아 그 main 파일 을 로드 한다 . 
 package . json 이 없 다면 폴더 의 index . js 파일 을 로드 한다 . 
 이미 로드 된 모듈 을 로드 하 는 경우 
 처음 로드 하 는 모듈 의 경우 , 모듈 의 코드 를 실행 하 고 module . exports 값 을 리턴 하 는 동시 에 메모리 에 module . exports 값 을 기억 해 둔다 . 
 다시 모듈 을 로드 하 는 경우 , 모듈 의 코드 를 실행 하 지 않 고 메모리 에 있 는 해당 모듈 의 module . exports 값 을 참조 한다 . 
 package . json 은 Node . js 의 패키지 의 메타 정보 를 담 고 있 는 텍스트 파일 입니다 . 뒤 에서 다시 다룹니다 . 
 " main ": " server / server . js ", / / main 파일 의 경로 
 " dev ": " nodemon . ", 
 JSON ( JavaScript Object Notation ) 은 속성 - 값 쌍 으로 이루어진 … 포맷 이 다 … 인터넷 에서 자료 를 주 고 받 을 때 그 자료 를 표현 하 는 방법 으로 알려져 있 다 . … 본래 는 자바 스크립트 언어 로부터 파생 되 어 자바 스크립트 의 구문 형식 을 따르 지만 언어 독립 형 데이터 포맷 이 다 . 즉 , 프로그래밍 언어 나 플랫폼 에 독립 적 이 므로 , 구문 분석 및 JSON 데이터 생성 을 위한 코드 는 C , C ++, C #, 자바 , 자바 스크립트 , 펄 , 파이썬 등 수많 은 프로그래밍 언어 에서 쉽 게 이용 할 수 있 다 . … ( 위키백과 ) 
 os OS 운영 체제 및 하드웨어 정보 관련 
 fs File System 파일 시스템 관련 
 path Path 운영 체제 별 경로 관련 
 child _ process Child Processes ( 자식 ) 프로세스 실행 관련 
 events Events 이벤트 시스템 관련 
 cluster Cluster 멀티 코어 CPU 를 위한 병렬 처리 관련 
 crypto Crypto 데이터 암호 화 관련 
 http HTTP HTTP 프로토콜 관련 
 https HTTPS HTTPS 프로토콜 관련 
 net Net TCP 관련 
 dgram UDP / Datagram UDP 관련 
 tls TLS / SSL TCP / IP 암호 화 프로토콜 관련 
 dns DNS 도메인 과 IP 관련 
 url URL URL 관련 
 querystring Query String URL 중 query string 관련 
 readline Readline CLI 에서 사용 자 입력 관련 
 repl REPL 대화 형 CLI 를 만드 는 관련 
 buffer Buffer 바이너리 관련 
 string _ decoder String Decoder 바이너리 를 인코딩 에 따라 해석 
 util Utilities 잡다 한 도우미 함수 관련 
 Node . js 의 공식 API 문서 에 는 전체 내장 모듈 들 의 인터페이스 에 대한 설명 과 예제 코드 들 이 잘 정리 되 어 있 습니다 . 위 표 에서 강조 된 모듈 은 뒤따르 는 강의 에서 주요 하 게 사용 하 게 될 내장 모듈 들 입니다 . 
 process . env / / 시스템 의 환경 변수 를 담 은 객체 
 __ dirname 현재 모듈 이 위치 한 디렉 토리 의 절대 경로 / Users / dehypnosis / benzene / workshop 
 __ filename 현재 모듈 의 절대 경로 / Users / dehypnosis / benzene / workshop / test . js 
 전역 객체 는 console . log 의 console 이나 require 또는 표준 내장 객체 ( Array , String 등 ) 처럼 따로 require 하 지 않 고서 도 바로 이용 할 수 있 는 객체 , 값 들 을 의미 합니다 . 특히 global 객체 에 값 을 설정 하 면 한 프로세스 내 의 모듈 사이 에 그 값 이 공유 됩니다 . 물론 global 객체 에 쓰 고 읽 는 것 은 지양 할 안티 패턴 입니다 . 
 어떤 프로그램 을 만들 때 수 많 은 부품 이 필요 할 수 있 습니다 . 모든 부품 을 장인 정신 으로 만들 수 도 있 지만 , 생산 성 을 위해 타인 이 만들 어 둔 부품 들 을 이용 할 수 있 습니다 . Node . js 에서 는 인터넷 에 공개 된 패키지 ( 모듈 ) 를 설치 하 고 관리 하 는 도구 로 NPM ( Node Package Manager ) 을 제공 합니다 . Node . js 를 설치 할 때 같이 CLI 프로그램 npm 이 설치 됩니다 . 
 웹 서버 를 만들 때 Express . js , 웹 소켓 을 구현 할 때 Socket . io 등 개발 에 도움 이 되 는 오픈 소스 패키지 들 이 많 습니다 . 유명 한 패키지 에 대해서 모르 더라도 필요 한 기능 에 대한 공개 패키지 를 구글링 해 보 면 많 은 시간 을 줄일 수 도 있 습니다 . 또는 패키지 를 만들 고 인터넷 에 공개 하 여 오픈 소스 생태 계 에 도움 을 줄 수 도 있 습니다 . 
 이렇게 프로그램 에서 다른 독립 적 인 모듈 을 이용 하 는 것 을 의존 성 ( Dependency ) 을 갖 는다고 합니다 . npm 은 이러 한 의존 성 을 관리 하 기 위해서 모듈 의 . / package . json 파일 에 모듈 이 의존 하 고 있 는 모든 모듈 의 이름 과 버전 을 기록 해 둡니다 . 이후 에 모듈 을 배포 할 때 는 타 모듈 들 이 설치 된 . / node _ modules 폴더 를 제외 하 고 package . json 을 포함 한 모듈 의 코드 를 배포 하 면 충분 합니다 . 
 " name ": " workshop ", / / 패키지 에 대한 설명 
 " async ": "^ 2 . 0 . 1 ", / / 의존 모듈 들 
 ~$ mkdir package 
 ~$ cd package 
 # 현재 폴더 에 package . json 파일 을 생 성 
 ~/ package $ npm init 
 # nodemon 모듈 을 전역 으로 설치 
 ~/ package $ npm install nodemon - g 
 # express 모듈 을 . / node _ modules 에 설치 하 고 package . json 에 기록 
 ~/ package $ npm install express -- save 
 # express 모듈 을 제거 
 ~/ package $ npm remove express 
 # 현재 패키지 의 의존 성 트리 를 출력 
 ~/ package $ npm list 
 # package . json 에 기록 된 의존 모듈 들 을 모두 . / node _ modules 에 설치 
 ~/ package $ npm install 
 # express 모듈 을 제거 하 고 package . json 에서 지움 
 ~/ package $ npm remove express -- save