Image
Image

DAY1-6.Node 주요 공통기능 실습

6.Node  주요 공통기능 실습


1)파일시스템 관리 - fs모듈 

-파일 시스템 접근 모듈
-서버상의 파일을 읽고 쓰고 삭제 제어하는 기능제공
-파일 관리기능을 통해 각종 노드 비동기 프로그래밍 방식을  실습합니다.
- const fs = require('fs'); 내장모듈을 참조 이용한다.

원할한 실습을 위해 readme.txt, readme2.txt파일을 DAY1폴더에 생성합니다.
생성된 파일에는 간단한 텍스트 데이터를 입력 후 저장합니다.

- 코딩실습 : readFile.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- 특정 파일내용을 조회하는 예시를 실습합니다.
- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.


//노드프레임워크의 fs내장모듈을 참조한다.
const fs = require('fs');

fs.readFile('./readme.txt',(err,data)=>{
    //파일을 모두 읽기를 완료하면 호출되는 콜백함수영역

    if(err){
        throw err;
    }

    console.log(data);
    console.log(data.toString());
});




- 코딩실습 : 
fsCreate.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- 폴더를 생성하고 특정 파일을 생성 처리하는 예시를 실습합니다.
- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.

const fs = require('fs');

//지정 폴더에 대한 정보를 조회한다.
fs.access('./folder'fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, (err=> {
  if (err) {
    if (err.code === 'ENOENT') {
      console.log('폴더 없음');
      
      //폴더 생성
      fs.mkdir('./folder', (err=> {
        if (err) {
          throw err;
        }
        console.log('폴더 만들기 성공');

        //파일 오픈 및 생성
        fs.open('./folder/file.js''w', (errfd=> {
          if (err) {
            throw err;
          }
          console.log('빈 파일 만들기 성공'fd);

          //파일명 변경메소드
          fs.rename('./folder/file.js''./folder/newfile.js', (err=> {
            if (err) {
              throw err;
            }
            console.log('이름 바꾸기 성공');
          });
        });
      });
    } else {
      throw err;
    }
  } else {
    console.log('이미 폴더 있음');
  }
});



- 코딩실습 : fsDelete.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- 폴더를 읽고 특정 파일을 삭제 처리하는 예시를 실습합니다.
- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.

const fs = require('fs');

//지정폴더 읽어들이기
fs.readdir('./folder', (errdir=> {
  if (err) {
    throw err;
  }
  console.log('폴더 내용 확인'dir);

  //파일삭제메소드
  fs.unlink('./folder/newFile.js', (err=> {
    if (err) {
      throw err;
    }
    console.log('파일 삭제 성공');

    //폴더삭제: 폴더삭제는 해당 폴더내에 파일이있으면 에러발생
    fs.rmdir('./folder', (err=> {
      if (err) {
        throw err;
      }
      console.log('폴더 삭제 성공');
    });
  });
});


- 코딩실습 : filesync.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- 동기방식으로 파일을 조회하는 예시를 실습합니다.
- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.

const fs = require('fs');

console.log('시작');

//동기방식 파일정보 불러오기-블록킹(워터폴)방식으로 메소드 진행

//동기방식으로 파일정보를 불러와 변수에 할당
let data = fs.readFileSync('./readme2.txt');
console.log('1번',data.toString());


data = fs.readFileSync('./readme2.txt');
console.log('2번',data.toString());


data = fs.readFileSync('./readme2.txt');
console.log('3번',data.toString());


console.log('종료')


- 코딩실습 : fileasync.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- 대부분의 노드 내장모듈의 메소드들은 기본이 비동기방식으로 작동됩니다. fs 내장모듈의 readFile은 기본이 비동기메소드입니다.
- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.

const fs = require('fs');

console.log('시작')

//비동기 방식으로 파일을 읽고 출력하기
fs.readFile('./readme2.txt',(err,data=>{
    if(err){
        //에러 내용을 노드엔진에 전달/노드 쓰레드가 중단됨
        throw err;
    }
    //data는 버퍼 메모리 공간에 저장된 파일 내용 
    console.log('1번',data.toString());
});

//두번쨰 파일읽고 출력하기
fs.readFile('./readme2.txt',(err,data=>{
    if(err){
        //에러 내용을 노드엔진에 전달/노드 쓰레드가 중단됨
        throw err;
    }
    //data는 버퍼 메모리 공간에 저장된 파일 내용 
    console.log('2번',data.toString());
});

//세번쨰 파일읽고 출력하기
fs.readFile('./readme2.txt',(err,data=>{
    if(err){
        //에러 내용을 노드엔진에 전달/노드 쓰레드가 중단됨
        throw err;
    }
    //data는 버퍼 메모리 공간에 저장된 파일 내용 
    console.log('3번',data.toString());
});



- 코딩실습 : promiseAsyncFile.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- promise 문법을 이용한 노드 비동기 프로그래밍 방식을 실습니다.

- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.


const fsPromise = require('fs').promises;

fsPromise.readFile('./readme.txt').then(()=>{
    console.log('1번파일');
    return fsPromise.readFile('./readme.txt');
})
.then(()=>{
    console.log('2번파일');
    return fsPromise.readFile('./readme.txt');
})
.then(()=>{
    console.log('3번파일');
    console.log('끝~~~~');
    return;
})
.catch(err =>{
    console.log(err);
});




- 코딩실습 : async
File.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- 콜백,프라미스,async/await방식을 통한 비동기 프로그래밍 방식으로 파일 처리하는 예시를 실습합니다.
- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.

//콜백방식으로 파일처리시 참조
//const fs = require('fs');

//promise 방식으로 fs모듈 참조하기: promise방식이나 async await방식으로 파일처리시 참조
const fs = require('fs').promises;

console.log('시작~~~~');

//콜백함수를 이용한 순차적 프로그래밍 처리
// fs.readFile('./readme.txt',(err,data)=>{
//         console.log('1번파일:',data.toString());

//         fs.readFile('./readme.txt',(err,data)=>{
//                 console.log('2번파일:',data.toString());

//                 fs.readFile('./readme.txt',(err,data)=>{
//                     console.log('3번파일:',data.toString());
//                 });
//         });

// });


//ES2015부터 지원하는 비동기 방식인 promise방식으로 처리하는 예제
// fs.readFile('./readme.txt').then(()=>{
//     console.log('1번파일');
//     return fs.readFile('./readme.txt');
// })
// .then(()=>{
//     console.log('2번파일');
//     return fs.readFile('./readme.txt');
// })
// .then(()=>{
//     console.log('3번파일');
//     console.log('끝~~~~');
//     return;
// })
// .catch(err =>{
//     console.log(err);
// });

//ES2017 버전에 추가된 최상의 비동기처리 방식인 async/await방식으로 호출
async function readFiles(){
    let fileString1 = await fs.readFile('./readme.txt').toString();
    console.log('1번파일',fileString1);

    let fileString2 = await fs.readFile('./readme.txt').toString();
    console.log('2번파일',fileString2);

    let fileString3 = await fs.readFile('./readme.txt').toString();
    console.log('3번파일',fileString3);

}

readFiles();



2)Event 구조 이해하기

-이벤트는 const  EventEmitter = require('events'); 모듈을 참조하여 생성합니다. -이벤트 발생시 해당 후행 작업을 처리하는 기능을  이벤트 리쓴너 또는 이벤트 핸들러라고 합니다.
-콜백함수 : 특정 작업이 완료되고 자동으로 호출되는 함수 

- 코딩실습 : event.js 파일을 생성하고 하기코드를  코딩 후 저장합니다.
- 개발자 정의 이벤트 정의와 이벤트 리쓰너를 사전 정의하고 이벤트를 발생 시키는 실습을 진행합니다.
- 터미널에서 해당 파일을 실행하고 콘솔창에 출력되는 로깅내용을 확인합니다.


//개발자 정의 이벤트를 만드려면 events내장모듈을 참조한다.
const  EventEmitter = require('events');

//이벤트를 생성한다.
const myEvent = new EventEmitter();

//생성한 이벤트에 대한 처리를 위한 이벤트 리쓰너를 정의한다.

//이벤트 발생예시 1 : 이벤트리쓰너를 추가해 사용하는 방법
myEvent.addListener('event1',()=>{
    console.log('이벤트1');
});

//이벤트 발생예시 2: on를 이용한 이벤트 발생처리
myEvent.on('event2',()=>{
    console.log('이벤트2');
});

//정의된 이벤트를 실행(발생)시킨다.
myEvent.emit('event1');
myEvent.emit('event2');



3)예외처리
-로컬 예외처리 : 개별 기능단위로  try-catch 예외처리 블럭을 통해  예상되는 에러을 잡아내고 처리가 가능하다.
-전역 예외처리기 : 예기치 못한 에러나 로컬에서 잡아낸 에러를 중앙집중적으로 처리하는 기능을 제공한다.

try~catch 블럭을 통한 예외처리 예시
-예외를 next(
error)로 전달하면 최종 app.js파일내 전역예외처리기로 예외정보가 전달된다.

try {
    const exAdmin = await Admin.findOne({ where: { adminID } });
    if (exAdmin) {
      req.flash('joinError''이미 가입된 아이디입니다.');
      return res.redirect('/join');
    }
    const hash = await bcrypt.hash(adminPWD12);
    await Admin.create({
      adminID:adminID,
      adminPWD:hash,
      adminName:adminName,
      adminEmail:adminEmail,
      useYN:0,
      createdUID:1,
      updatedUID:1,
      createdAt:baseDatetime,
      updatedAt:baseDatetime
    });
    return res.redirect('/');
  } catch (error) {
    console.error(error);
    return next(error);
  }



app.js내 전역예외처리기 예시
//에러 이벤트 처리기설정
server.on('error'onError);

//listening 이벤트 처리기 설정
server.on('listening'onListening);


//전역에러처리기
function onError(error) {
  if (error.syscall !== 'listen') {
      throw error;
  }

  var bind = typeof port === 'string'
      ? 'Pipe ' + port
      : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
      case 'EACCES':
          console.error(bind + ' requires elevated privileges');
          process.exit(1);
          break;
      case 'EADDRINUSE':
          console.error(bind + ' is already in use');
          process.exit(1);
          break;
      default:
          throw error;
  }
}




Image

댓글목록

Image