본문 바로가기
시작/TIL(Today I Learned)

221206 - Node.js 내장 객체, 내장 모듈, 외장 모듈, Express

by 백씨네 2022. 12. 7.
터미널에 내가 호출한 내용을 '<'
반환받은 값을 '>' 로  표현할 예정이다.

오늘 내가 배운 것

1. 내장 객체

  • global
  • console
  • module
  • __filename과 __dirname
  • process

2. 내장 모듈

3. 외장 모듈

4. Express로 간단한 서버 만들어보기

 

Node.js

Node.js에서 내장 객체, 내장 모듈, 외장 모듈을 사용할 수 있고, 설치하면서 기본적으로 NPM이라는 것이 설치된다.

 

내장 객체

브라우저에서 window 전역객체 브라우저의 내장 객체로 대표적인 document, location 등등...
자주 쓰는 것을 미리 만들어둔 두었는데 그것을 우리가 사용했었다. 마찬가지로 Node.js도 내장 객체가 있다.

1. global

node.js의 전역 객체는 `global`이다.(브라우저의 전역 객체 window와 같다.) window처럼 생략 가능하다.


노드는 DOM, BOM이 없기 때문에 window나 document를 사용할 수 없다. 사용하게 되면 `에러 발생`

 

//global을 객체로 표현하면

const global = {
    AbortController:class{

    },
    buffer:class{

    },
    __dirname : '',
    __filename:'',
    console:class{
        log:function(){

        }
    },
    process
}

2. console

repl로 global.console 확인하기

// 터미널에 node를 치면 repl 모드로 들어가고 
// global.console 콘솔에 대해 확인한다.
> global.console

//console.table은 객체를 확인하기 좋다.
console.table(['name'])
// 객체 값을 넣어 확인해보기
console.table([{name:'baek', age:234}])

 

3. module

module.exports ={
    name:'baek',
    age: 29
}
console.log(module.exports)

//global -> module -> exports -> { name : 'baek', age:29}  
//global 안에 module안에 exports 안에 객체를 담은 상태

module에 대해서 알아보려면 global.module로 타고 들어가면서 확인해야 한다.

 

   3-1. 'module.exports' 'require'을 이용하여 내보내고 불러오기

//1.js
const a = 100

module.exports ={
    name:'a'
}

module.exports ={
    name:'baek',
    age: 29
}
console.log(module.exports)

//2.js
const a = require('./1.js')
console.log(a)
어떻게 출력될까?
< node 2
# 1.js의 console.log(module.exports)
> { name: 'baek', age: 29 } 
# 2.js의 console.log(a)
> { name: 'baek', age: 29 }

 

   3-2. 변수는 공유되지 않는다.  global 객체는 공유가 된다.

//1.js
const a = 100
const b = 100

module.exports = {
    name : 'baek',
    age : 29,
    b:b
}
//2.js
const a = require('./1.js') // {name : 'baek', age: 29}
const b = 200
console.log(a)
어떻게 출력될까?
< node 2
> { name: 'baek', age: 29, b: 100 }

2번을 실행하면서 a에는 객체가 대입된다. 중요한 부분은 b 이다.

변수가 공유되지 않기 때문에 변수 b를 다시 할당한 형태로 보이지만 global 객체만 공유가 되므로 값이 출력이 된다.

일반적인 자바스크립트 상황에서는 b를 const로 할당했는데 재할당한 형태라 에러가 발생했을 것이다.

 

 

   3-3. 순환 참조와 require cache

     - 순환참조 : 서로가 서로를 참조할 경우를 말한다.

//1.js
const b = require('./2.js')

module.exprots = {
    name : 'baek',
    age : 29,
    b:b
}

//2.js
const a = require('./1.js')
console.log(a)

//무한루프 형태가 됨.
//경고는 뜨지만, 출력은됨.

 

캐싱

- require cache
한번 require 된 모듈은 require.cache 객체 안에 캐싱된다. key 값으로 해당 모듈 파일의 경로를 갖게 되는데 key 값이 삭제되면 다음 require 요청 시 다시 require 하여 require.cache안에 캐싱된다.

 

피보나치수열 할 때, 메모이제이션(한번 실행했던 내용을 메모리에 저장시켜준다.)과 비슷한 느낌이다.

https://baekspace.tistory.com/51

 

221103 JavaScript - 메서드, this, 생성자함수, getter, setter, 피보나치 수열, 메모이제이션

오늘 내가 배운 것 1. 메모이제이션(Memoization) - 피보나치 수열 메모이제이션 2. 객체 메서드(method) this 메서드의 종류 3. Getter 와 Setter 4. 생성자 함수 생성자 함수 `new`를 이용한 생성자 함수 1. 메

baekspace.tistory.com

 

   3-4. exports는 참조의 개념이다.

const exports = module.exports //{}
console.log(exports === module.exports) //true

// 기존에 알고 있었던 참조의 내용과 같다.
const a = {}
const b = a
console.log(a===b) // true

 

   3-5. module.exports는 기본값이 빈 객체이기 때문에 값을 할당을 하면서 넘길 수 있다.

module.exports = {
    a :1,
    b :2,
}

// 빈 객체에 바로 할당을 하여서 exports로 넘길 수 있다.
exports.a =1
exports.b =2


//함수나 변수를 바로 전달하고 싶을 때 코드를 효율적으로 줄일 수 있다.
module.exports= {
    a:a,
    b:b,
}
const a = (a,b) => a+b
const b = (a,b) => a-b

//를 아래의 방법으로 줄일 수 있다.
export.a = (a,b) => a+b
export.b = (a,b) => a-b

 

   3-6.  module.exports 와 exports 객체

module.exports에는 어떤 값을 넣어도 되지만, exports에는 반드시 객체처럼 속성명과 속성 값을 대입해야 한다.
module.exports에 함수를 대입한 경우에는 exports 객체와 참조 관계가 끊기기 때문에 모듈로 기능하지 못한다.

 

//module.exports = {}  (기본값)
console.log(module.exports === exports)//true

module.exports = {name : 'baek'}
module.exports.name = 'baek'
exports.name = 'baek'
//다 같은 말

//exports.(key)처럼 줄여서 쓰는 경우는 함수를 넘길 때 많이 사용한다.
exports.name = () =>{
    return 'hello world!'
}

 

4.   __filename과 __dirname

//프로세스 상태일 때(실행을 시켰을 때) 변수를 선언하지 않고 사용가능하다.

//실행한 파일의 절대경로+파일명까지 출력
console.log(__filename)  
//실행한 파일의 절대경로만 출력
console.llog(__dirname)

 

5. process

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

console.log(process)

//많이 쓰이는 것

//시스템변수, os변수
console.log(process.env)
//process id를 출력해준다.
console.log(process.pid)
//process 아키텍처 정보
console.log(process.arch)
//운영체제 플랫폼 정보
console.log(process.platform)
process.env

리눅스의 echo $path와 같다.

소스코드에 남기지 않지만 암호화, aws, 개인키 등등 중요한 부분을 환경변수에 담아두고 필요시에 환경변수의 값을 가져온다.

NODE_ENV

NODE_ENV 환경변수를 만들어서 product모드, development모드, test모드를 판단해서 실행하게 한다.

//예시
const ip = process.env.NODE_ENV === development ? 'a':'b'

 

내장 모듈

node.js가 미리 만들어둔 모듈, 일반적으로 개발자가 많이 쓰는 메서드를 모아 두었다.
대표적인 내장 모듈은 Buffer, Stream, fs, path가 있다.

내장 모듈 : path

폴더와 파일의 경로를 쉽게 조작하도록 도와주는 모듈이다.

require('내장모듈이름')
require('path')
const path = require ('path')

 

Q. '내가 실행한 위치 + 9.js' 를 출력하고 싶다.
if(process.platform === "win32"){
    //내가 윈도우라면
    console.log(__dirname + '\\9.js')
}else{
    console.log(__dirname + '/9.js')
}
//일반적으론 개발 환경이 다르기 때문에 운영체제마다 경로를 기입하는 방법을 정해줘야하지만

// path를 이용하면 아래방법처럼 간단하기 출력할 수 있다.
const newPath = path.join(__dirname, '9.js')
console.log(newPath)

path.join을 이용하면 운영체제에 관계없이 사용할 수 있다.

 

외장 모듈

 

외장 모듈은 내장 모듈이 지원하지 않는 기능을, 다른 사람이 만들어서 인터넷에 업로드해 놓은 모듈(오픈소스)
ex) apt,brew
인터넷을 이용하여 패키지를 다운로드한다.
Node는 npm이라는 것이 있다. 기본적으로 node를 설치할 때 제공된다.


Node Package Manager  : node.js를 위한 패키지 매니저, 오픈소스 생태계 node.js에서 사용하는 모듈들을 패키지로 만들어 관리하고 배포

 

< npm init

> package name  #프로젝트 이름을 적는 곳
> version  #설치시 필요없음
> description # 내용을 적어달라 (이것도 사이트 올릴 때 필요한 정보)
> entry point # 시작할 파일
> test command # 설치시 필요없음
> git repository # 설치시 필요없음
> keywords # 설치시 필요없음
> author : # 제작자
> license : #설치시 필요없음

설치 시 필요 없는 부분은 enter로 넘어갈 수 있다.

설치를 하고 나면 package.json이 생성된다.
node로 작업이 된 프로젝트의 경우에는 package.json이 반드시 필요하다.
npm install을 할 때 어떤 파일을 만들었는지 목록을 볼 수 있기 때문이다.

외장 모듈 :  Express

node.js에서 웹서버를 만들 수 있는 마이크로 프레임워크

# npm install [패키지명]

< npm install express

최초에 설치하면 node_modules라는 디렉토리가 생긴다.
node_modules > express 디렉토리에  express github에 올라온 내용들이 설치되어있다.

내가 익스프레스로 작업을 했으면 node_modules에 익스프레스가 있어야 열 수 있다.

 

깃허브에. gitignore에 반드시 node_modules를 적고 깃허브에 올린다.
파일이 크기 때문에 같이 올릴 필요 없고, 파일을 열고 npm init을 하면, package.json 에 express가 있으면 여는 곳에 설치가 된다.

 

 

 

 

Express를 이용하여 서버 만들어보기

//server.js

//express 프레임워크를 사용하겠다.
const express = require('express')
const app = express()

app.get('/',(req,res) => {
    console.log(req.query)
    res.send('hello server!!!!!')
})

//3000 포트를 사용하겠다.
app.listen(3000, ()=>{
    console.log('express server!')
})
#server.js 실행

< node server

서버를 하나 생성한 것임.
확인하기 위해서 브라우저에 localhost:3000 을 적으면 서버로 진입 가능하다.
주소창에 쿼리스트링으로 `localhost:3000?name=baek`을 기입하면 콘솔에 객체로 값이 뜬다..

 

서버가 실행상태

 

댓글