본문 바로가기
Programming/Node.js

Node.js를 사용해서 Notes 앱 만드는 방법

by 혀코 2020. 1. 3.

안녕하세요. 혀코입니다.

오늘은 Node.js를 사용해서 Notes 앱 만드는 방법에 대해서 알아보겠습니다.

app.js를 다음과 같이 작성합니다.

const yargs = require('yargs') // 사용자로부터 명령어를 받는다.
const notes = require('./notes.js') // 노트 추가, 삭제, 리스트, 읽기등의 함수를 가진다.

yargs.command({ // 노트를 추가할 수 있는 명령어를 정의한다.
    command: 'add', // 명령어
    describe: 'Add a new note', //설명
    builder: { // 옵션 2개 title과 body를 가진다. 
        title: {
            describe: 'Note title', // 옵션 설명
            demandOption: true, // 필수
            type: 'string' // 옵션 값의 형식
        },
        body: {
            describe: 'Note body',
            demandOption: false, // 옵션
            type: 'string'
        }
    },
    handler(argv) { // 옵션 값을 받는다.
        notes.addNote(argv.title, argv.body) // 옵션값을 notes 함수로 넘겨서 처리한다.
    }
})

yargs.command({ // 노트를 삭제할 수 있는 명령어를 정의한다.
    command: 'remove', 
    describe: 'Remove a note',
    builder: {
        title: {
            describe: 'Note title',
            demandOption: true,
            type: 'string'
        }
    },
    handler(argv) { 
        notes.removeNote(argv.title)
    } 
}) 

yargs.command({ // 모든 노트를 리스트할 수 있는 명령어를 정의한다.
    command: 'list', 
    describe: 'List your notes', 
    handler() { 
        notes.listNotes()
    } 
}) 

yargs.command({ 
    command: 'read', // 노트의 내용을 읽을 수 있는 명령어를 정의한다.
    describe: 'Read a note', 
    builder: {
        title: {
            describe: 'Note title',
            demandOption: true,
            type: 'string'
        }
    },
    handler(argv) { 
        notes.readNote(argv.title)
    } 
}) 

yargs.parse() // 명령어 실행 결과를 출력한다.

 

notes.js 를 다음과 같이 작성합니다.

const fs = require('fs') // 파일 관리 모듈
const chalk = require('chalk') // console.log 색상 관리 모듈

const addNote = (title, body) => { // 추가 add 명령어의 옵션 title과 body를 받아서 처리한다.
    const notes = loadNotes() // 노트를 로드하고
    const duplicateNote = notes.find((note) => note.title === title) // title이 동일한 노트를 찾는다

    if (!duplicateNote) { // title이 동일한 노트가 없을 경우, 추가한다.
        notes.push({ // notes object에 새로운 값을 추가한다.
            title: title,
            body: body
        })
        saveNotes(notes) // 추가된 노트를 저장한다.
        console.log(chalk.green.inverse('New note added!')) // 콘솔에 로그를 남긴다.
    } else {
        console.log(chalk.red.inverse('Note title taken!')) // 콘솔에 로그를 남긴다.
    }

}

const removeNote = (title) => { // 삭제 remove 명령어의 옵션 title을 받아서 처리한다.
    const notes = loadNotes() // 노트를 로드하고
    const notesToKeep = notes.filter((note) => note.title !== title) // title과 동일하지 않은 노트를 남긴다.

    if(notes.length > notesToKeep.length) { // 남겨진 노트가 기존 노트 개수보다 적다면 
        console.log(chalk.green.inverse('Note removed!')) // 삭제되었다고 콘솔에 로그를 남긴다.
    } else {
        console.log(chalk.red.inverse('No note found!')) // 동일하다면 해당 노트를 찾을 수 없다고 콘솔에 로그를 남긴다.
    }

    saveNotes(notesToKeep) // 남겨진 노트를 저장한다.
}

const listNotes = () => { // 리스트 list 명령어를 받아서 처리한다.
    const notes = loadNotes() // 모든 노트를 로드한다.
    
    console.log(chalk.inverse('Your notes')) // 콘솔에 로그를 남긴다.

    notes.forEach((note) => { // 모든 노트의 각 note의 title을 콘솔에 로그로 남긴다.
        console.log(note.title)
    })
}

const readNote = (title) => { // 읽기 read 명령어의 옵션 title을 받아서 처리한다.
    const notes = loadNotes() // 모든 노트를 로드한다.
    const note = notes.find((note) => note.title === title) // 옵션으로 받은 title과 동일한 노트가 있는지 확인한다.

    if (note) {
        console.log(chalk.inverse(note.title)) // 있다면 콘솔에 타이틀을 남긴다.
        console.log(note.body) // 그리고 내용을 콘솔에 남긴다.
    } else {
        console.log(chalk.red.inverse('Note not found')) // 없다면, 노트를 찾을 수 없다고 로그에 남긴다.
    }
}

const saveNotes = (notes) => { // 저장 노트
    const dataJSON = JSON.stringify(notes) // 16진수 코드를 문자열로 변환한다.
    fs.writeFileSync('notes.json',dataJSON) // 파일을 저장한다.
}

const loadNotes = () => { // 노트를 로드한다.
    try {
        const dataBuffer = fs.readFileSync('notes.json') // 16진수 코드로 노트를 불러온다.
        const dataJSON = dataBuffer.toString() // 문자열로 변환한다.
        return JSON.parse(dataJSON) // object의 parameter를 반환할 수 있도록 리턴한다.
    } catch (e) {
        return []
    }
}

module.exports = { // app.js에서 사용할 수 있게 한다.
    addNote: addNote,
    removeNote: removeNote,
    listNotes: listNotes,
    readNote: readNote
}

 

다음의 명령어를 사용해서 테스트 해보겠습니다.

$ node app.js add --title="Hyukho" --body="Today is Awesome"

New note added! 가 표시되고 notes.json 파일에 아래와 같이 저장됩니다.

[{"title":"Hyukho","body":"Today is Awesome"}]

동일한 명령어를 사용하면, 해당 타이틀이 이미 존재한다고 콘솔에 표시가 됩니다.

또 아래 명령어를 사용해서 데이터를 추가 해보겠습니다.

$ node app.js add --title="Kate" --body="Super Woman"

New note added! 가 표시되고 notes.json 파일에 아래와 같이 저장됩니다.

[{"title":"Hyukho","body":"Today is Awesome"},{"title":"Kate","body":"Super Woman"}]

이번에는 리스트 명령어를 사용해 보겠습니다.

$ node app.js list

아래와 같이 출력됩니다.

Your notes
Hyukho
Kate

이번에는 읽기 명령어를 사용해 보겠습니다.

$ node app.js read --title="Hyukho"

아래와 같이 출력됩니다.

Hyukho
Today is Awesome

이번에는 삭제 명령어를 사용해 보겠습니다.

$ node app.js --title="K"

No note found! 라고 표시됩니다.

json 파일에 저장되어 있는 note를 삭제해 보겠습니다.

$ node app.js --title="Kate"

Note removed! 라고 표시됩니다.

notes.json 파일을 확인해 보면 다음과 같이 업데이트 된 것을 확인할 수 있습니다.

[{"title":"Hyukho","body":"Today is Awesome"}]

 

이렇게 Node.js를 사용해서 Notes 앱을 만드는 방법에 대해서 알아보았습니다.

유용하셨다면, 공감과 구독 부탁 드립니다.

감사합니다. :)

댓글