노드 기능

Haechan Kim·2022년 1월 2일

Node.js

목록 보기
3/15
post-thumbnail

js는 스크립트 언어이기 때문에 컴파일 없이 코드를 바로 실행 가능.
노드도 이와 비슷하게 REPL(read, evaluation, print, loop)이라고 부름.
콘솔에서 > node '파일경로' 와 같은 식으로 실행.

  • 모듈(module)로 만들기
    노드는 코드를 모듈로 만들 수 있다는 점에서 브라우저의 js와 다름.
    Module이란 특정 기능의 함수나 변구들의 집합.
    파일별로 코드를 모듈화 할 수 있어 관리에 용이.

모듈 생성시에 모듈이 될 파일(var.js)과 모듈 불러와 사용할 파일(func.js)이 필요

// var.js
const odd = '홀수입니다'
const even = '짝수입니다'

module.exports = { // 변수들 담은 객체 대입
    odd,
    even,
}

다른 파일에서 module.exports에 대입된 값 사용 가능
func에서 대입된 값들(odd, even) 사용

// func.js
const {odd, even} = require('./var');
// require 함수에 불러올 모듈 경로 적음 (확장자 생략)
function checkOddOrEven(num) {
    if (num%2) {
        return odd;
    }
    return even;
}

module.exports = checkOddOrEven; // 내보낼 값

모듈을 사용하는 파일(func.js)을 다시 모듈로 만들 수 있음
module.exports 에는 객체만 아니라 함수나 변수도 대입 가능

// index.js
// var.js와 func.js를 모두 참조
// 모듈 하나가 여러개의 모듈 사용
const {odd, even} = require('./var');
const checkNumber = require('./func'); // 불러올때 변수 이름 다르게 지정 가능
// func의 checkOddOrEven을 checkNumber라는 이름으로 사용

function checkString(str) {
    if (str.length % 2) {
        return odd;
    }
    return even;
}

console.log(checkNumber(10)); // 짝수입니다
console.log(checkString('hello')); // 홀수입니다

// 콘솔(터미널)에서 > node index 로 실행

require함수나 module객체는 따로 선언하지 않고 사용 사능
노드가 기본적으로 제공하는 내장 객체이기 때문

  • js 자체 모듈 시스템 문법 (react 에서)
    ES2015dptj js의 자체 모듈 시스템 문법 생김.
    but 노드의 모듈 시스템과 조금 다름.
// func.js를 ES2015 모듈 스타일로 바꾼 코드
import { odd, even } from './var'; // requires

function checkOddOrEven(num) {
  if (num % 2) { // 홀수면
    return odd;
  }
  return even;
}

export default checkOddOrEven; // module.exports
  • 노드 내장 객체
    따로 설치 없이 바로 사용 가능
    브라우저의 window 객체와 비슷
  1. global
    브라우저의 window같은 전역 객체
    즉 모든 파일에 접근 가능
    생략 가능. require함수도 global.require에서 생략된것
    console도 global.console

    전역 객체라는 점은 이용해 파일간 간단한 데이터 공유할떄 사용하기도 함
// globalA.js
module.exports = () => global.message;
// globalB.js
const A = require('./globalA');

global.message = '안녕하세요';
console.log(A());

globalA는 global.message값을 반환.
globalB에서는 global객체에 속성명이 message인 값을 대입하고 globalB에서 넣은 globalA의 함수 호출.

B에서 넣은 message값을 A에서도 접근 가능함 보여줌
but 프로그램 커질수록 어떤 파일에서 global객체에 값 대입했는지 찾기 힘들어 유지 보수 어려움
다른 파일 값 사용시에는 모듈 형식으로 만들어서 명시적 값 불러와 사용하는것이 좋다

2. console

3. 타이머
타이머 기능 제공하는 함수는 노드에서 window대신 global 객체 안에 있음
setTimeout과 setInterval은 웹 브라우저에서도 자주 사용

setTimeout(콜백함수, 밀리초): 밀리초 이후에 함수 실행
setInterval(콜백함수, 밀리초): 밀리초마다 함수 반복 실행
setImmediate(콜백함수): 함수 즉시 실행

이 타이머 함수들은 모두 아이디 반환. 아이디 사용해 타이머 취소
clearTimeout(id), clearInterval(id), clearImmediate(id)

  • setImmediate(콜백)과 setTimeout(콜백, 0)의 차이점
    둘의 콜백 함수는 이벤트 루프 거친 뒤 즉시 실행
    특수한 경우에 setImmediate이 먼저 실행 된다
    ㄴ 파일 시스템 접근, 네트워킹 같은 I/O 작업의 콜백 함수 안에서 타이머를 호출하는 경우
    but 항상 먼저 호출되는 것은 아님.
    헷갈리지 않도록 setTimeout(콜백, 0)은 사용하지 않는 것 권장

4. __filename, _dirname

현재 파일의 경로나 파일 명 알 수 있다
파일에 __filename과 _dirname 넣어두면 실행 시 파일명과 형재 파일 경로로 바뀜

console.log(__filename); // C:\Users\blues\Desktop\노드\test.js
console.log(__dirname); // C:\Users\blues\Desktop\노드

5. module, exports, require 지금까지 모듈 만들 때 module.exports 만 사용했는데 module 객체 말고 exports 객체로도 모듈 만들 수 있다.
// var.js

/*const odd = '홀수입니다'
const even = '짝수입니다'

module.exports = { // 변수들 담은 객체 대입
    odd,
    even,
} */

exports.odd = '홀수입니다'
exports.even = '짝수입니다'

module.exports로 한번에 대입하는 대신 각각의 변수를 exports객체에 하나씩 넣었다.
module.exports와 exports가 같은 객체를 참조하기 때문에 동일하게 동작

console.log(module.exports === exports) // true

따라서 exports 객체에 add 함수 넣으면 module.exports에도 add 함수 들어감

exports객체 사용기 module.exports와의 참조 관계 깨지지 않도록 주의해야 함.
module.exports에는 어떤값이든 대입해도 되지만 exports는 반드시 객체 처럼 속성명과 속성값 대입해야 함.

둘 동시에 안쓰는것이 좋다

  • 노드에서의 this

  • require
    모듈을 불러오는 역할
    require는 함수이고 함수는 객체이므로 객체로서 몇가지 속성 갖고있음

    • require.cache
      속성값으로 각 파일의 모듈 객체가 들어있음
      한번 require한 파일은 cache에 저장되므로 다음 require에 새로 불러오지 않고 cache에 있는것 재사용 됨
    • requre.main
      노드 실행 시 첫 모듈 가리킴

0개의 댓글