IT's 우

[Node, 3주차-3] 모듈 프로그래밍, Node 내장 객체 본문

카카오 클라우드 스쿨 2기/node

[Node, 3주차-3] 모듈 프로그래밍, Node 내장 객체

디우 2022. 11. 16. 19:41
728x90

1) Module

  • 독립적으로 실행 가능한 작업의 단위
  • 노드에서는 하나의 파일이 모듈
  • 모듈화는 중요한 작업 중의 하나
    하나의 모듈에 모든 내용을 전부 작성하면 가독성이 떨어지고 재사용성이 떨어지게 됩니다.
    역할별로 나누는 작업이 중요

    Controller : 클라이언트의 요청을 받아서 필요한 서비스 로직을 호출하고 응답을 클라이언트에게 전송하는 역할

    Service: 사용자의 로직(Business Logic)을 처리하는 역할

    Repository(DAO- Data Access Object): 데이터 저장소와 연결해서 작업을 수행하는 역할

    VO(Variable Object)- 여러 개의 속성을 묶어서 하나로 표현하기 위한 역할
    DTO(Data Transfer Object) - 서로 다른 계층 사이에 전달을 위한 역할

    Entity - ORM(객체와 데이블의 행을 매핑시켜주는 프레임워크)에서 테이블과 연결되는 역할

    View - 화면 출력하는 역할

2) 모듈의 내용을 내보내고 가져와서 사용

  • 내용을 내보낼 파일을 생성
var.js
const odd = "홀수";
const even = "짝수";

// 다른 곳에서 사용할 수 있도록 내보내기
module.exports = {
    odd,
    even
}
  • var.js 파일의 내용을 가져와서 사용할 파일을 생성
func.js
// var에서 내보낸 내용 가져오기
const {odd , even}= require('./var');

const ckeckOddOrEven = (num)=>{
    if(num %2){
        return odd;
    }else{
        return even;
    }
}

// 이렇게 내보내면 가져올 때는 아무이름이나 사용해서 받으면 됩니다.
module.exports=ckeckOddOrEven;
  • 실행할 파일을 생성
app.js
// { }로 묶어서 내보낸 것은 이름을 맞추어서 받아야 합니다.
const {odd, even}=require('./var');
// 하나를 내보냈을 때는 이름을 바꿔서 받을 수 있습니다.
// func의 내용을 가져와서 checkNumber라는 이름을 붙이는 것입니다.
const checkNumber= require('./func');

console.log(checkNumber(5));

4. Node 내장 객체

  • node가 제공하는 객체

1) global

  • 노드의 전역 객체
  • 이 객체는 노드 프로그램 전체에서 1개만 생성
  • 이 객체는 하나만 만들어서 노드 프로그램 전체가 공유
  • 사용하는 것을 권장하지는 않지만 모든 곳에서 사용해야 할 데이터가 있는 경우 사용
    ex) 현재 접속자 수나 대기자 수 또는 로고 등은 모든 사용자에게 동일하게 보입니다. 이런 데이터를 global을 이용해서 사용합니다.

    global.countUser = 10;

 

2) console 객체

  • 현재 보여지는 터미널 화면
  • 로직이 복잡해지거나 여러 모듈을 거쳐가면서 수행되는 코드가 있다면 중간중간 로그를 출력해서 확인을 하는 것이 좋습니다.
    로그를 출력하는 작업을 한 것을 배포할 때 모두 제거해야 합니다.
    필요하다면 로그는 파일이나 데이터베이스에 기록하는 것이 좋습니다.
    로그를 콘솔에 출력하는 것은 개발과정에서만 해야 합니다.
console.log(메세지) //메세지 로깅  

console.error(메시지) // 에러 형태로 로깅  

console.trace(메시지) //호출 스택 로깅 - 함수나 //메서드를 호출하는 순서를 역순으로 출력  
호출하는 메서드의 순서를 확인하고자 할 때 사용  

console.table(배열) // 테이블 형태로 출력

console.time(메세지)
console.timeEnd(메세지) // 동일한 메세지를 사용하면 2개 호출 사이의 시간을 출력

console.dir(객체, 옵션) // 객체를 로깅할 때 옵션을 설정하는 것이 가능

 

3) 경로 관련 속성

__filename: 현재 파일의 경로
__dirname: 현재 디렉터리의 경로

  • 최근에 등장하는 언어나 프레임워크에서는 _를 이용해서 예약어를 만드는 경우가 많으므로 이제는 사용자 정의 이름을 만들 때 _로 시작하는 이름을 사용하는 것을 추천하지 않습니다.

 

4) module.exports

  • 모듈의 내용을 다른 곳에서 사용할 수 있도록 하고자 할 때 사용하는 속성
module.exports = 내보낼 내용

exports.내보내고자하는 이름 = 내용 // 으로 해도 동일한 기능

 

5) this

  • 함수나 클래스 외부에서는 module.exports
  • 함수 안에서는 global
  • 클래스의 메서드 안에서는 인스턴스

6) require 함수

  • 외부 모듈의 내용을 가져올 때 사용하는 함수
  • import도 외부 모듈을 가져오는 데 사용할 수 있지만 require는 caching을 합니다.
    한 번 사용한 모듈을 메모리에 적재해두었다가 다음에 require를 하게 되면 캐싱된 모듈을 가져옵니다.
  • .js 는 생략 가능

 

7) process 객체

  • 노드 프로세스에 대한 정보를 가지는 객체
  • 노드 버전이나 CPU 사용량 등을 확인할 수 있는 속성과 메서드를 제공

  • process.nextTick(콜백 함수): 다른 콜백 함수보다 우선해서 처리
    Promise.resolve().then으로 작성 가능

  • process.exit(코드) : 노드 프로세스 종료
    : 서버에서는 사용하지 않는 것이 일반적이며 일반 애플리케이션을 만들었을 때 사용 코드는 운영체제에게 알려주는 종료 이유

 

8) os 객체

  • 운영체제에 대한 정보를 가진 객체
  • 운영체제에 대한 종류나 CPU 또는 메모리 사용량 등을 확인할 수 있는 속성과 메서드를 제공
  • 실제 서비스를 운영할 때는 메모리 사용량은 확인해보는 것이 좋습니다.
    서버를 운영할 때 메모리 사용량을 주기적을 모니터링해서 서버를 물리적으로 늘릴 것인지 여부를 판단

9) path 객체

  • 디렉터리와 파일의 경로를 쉽게 조작하도록 도와주는 모듈
  • 속성과 함수
path.sep // 경로 구분자(windows는 \이고 나머지는 /)
// 서버를 만들 때는 운영체제를 확정짓고 만들기 때문에 잘 사용하지 않지만 일반 애플리케이션을 만들 때는 경로 지정 시 이 속성을 이용해서 지정해야 윈도우나 Mac에서 코드 수정없이 동작하는 애플리케이션을 만들 수 있습니다.
//os 모듈을 이용해서 운영체제를 확인해서 별도로 코딩을 하는 방법도 있습니다.

path.dirname(경로)  // 경로에 해당하는 파일이 위치하는 디렉토리
path.extname(경로) // 경로에 해당하는 파일의 확장자

path.join(경로를 나열) //경로를 합쳐서 하나의 경로를 리턴
  • 현재 작업 디렉터리와 프로젝트 내의 public 디렉토리 경로 확인
const path=require('path');
// 현재 디렉토리 확인
console.log(__dirname);
// 현재 디렉토리 내의 public 디렉토리의 경로
console.log(path.join(__dirname,"public"));

 

10) url 모듈

  • url과 관련된 모듈
    parse 함수: url 분해
    format 함수: 분해된 url을 하나로 복원
  • URL 분해
const url=require('url');
const addr="https://www.naver.com/login?id=kjk04021";
// url 분해
const p=url.parse(addr);
// pathname에는 서버 URL을 제외한 경로를 저장하고 있고
// query는 query string 을 저장하고 있습니다.
console.log(p);

 

11) searchParams 모듈

  • query string(parameter라고 하는데 클라이언트가 서버에게 get 방식으로 요청을 할 때 전송하는 데이터)을 위한 모듈
  • 읽어오는 함수
getAll(key)        // key에 해당하는 모든 데이터를 가져옵니다. 체크 박스나 파일의 경우는 다중 선택이 가능
get(key)           // key에 해당하는 데이터 1개만 가져옵니다. 체크박스나 파일이 아니면 하나의 값만 전달

 

//   addr에서 파라미터 부부만 가져오기
// searchParams 속성을 호출하면 파라미터 부분에 해당하는 객체를 리턴
const address =new URL("https://www.naver.com/login?id=kjk04021");
console.log(address.searchParams);
//id의 값 추출하기
console.log(address.searchParams.get("id"));
  • 파라미터를 추가하는 함수
append(키, 값) // 추가 
set(키, 값) // 수정

 

12) util 모듈

  • 여러 가지 편의 기능을 모아둔 모듈
  • util.promisify: 콜백 패턴을 Promise 패턴으로 변경

13) worker_threads 모듈

  • html5에서 Web Worker라는 스레드 관련 API가 추가됨
    Web Worker를 사용하기 쉽도록 해주는 모듈
  • Node는 14 버전까지는 싱글 스레드 기반 - 하나의 스레드만 만들어서 사용자의 요청을 순서대로 처리
    14 버전 이후에 멀티 스레드를 지원
  • express 모듈로 웹 서버를 만들면 멀티 스레드 형식으로 사용자의 요청을 처리해줍니다.

 

14) child_process 모듈

  • 다른 프로세스(명령어)를 실행하는 모듈
  • 이 모듈을 사용하고자 하면 운영체제 별로 분기를 해서 명령어를 사용해야 합니다.
const os = require("os");
const exec = require('child_process').exec;
let position = os.type().toLowerCase().indexOf("windows");
let process;
if (position >= 0) {
    console.log("windows");
    process = exec('dir');
} else {
    console.log("windows 아님");
    process = exec('ls');
}
//console.log(os.platform());
// 프로세스가 정상적으로 수행되면
process.stdout.on('data', function (data) {
    console.log(data.toString());
});

//수행되지 않으면
process.stderr.on('data', function (data) {
    console.log(data.toString());
});

-> 2개를 조합해서 windows 일 때는 dir 명령어를 그렇지 않은 경우에는 ls 명령을 수행하도록 작성


-> 문자열 비교할 때는 일치하는 것을 찾는 경우보다는 포함된 경우를 찾는 경우가 많습니다.
이런 경우네는 indexOf를 이용할 수 있는 indexOf는 포함된 경우에는 시작 위치를 그렇지 않은 경우는 음수를 리턴 -> 문자열 비교할 때는 대소문자를 구분하는 것인지 아닌 지를 판단해서 작성해야 합니다.

728x90
반응형