안녕하세요. 혀코입니다.
오늘은 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 앱을 만드는 방법에 대해서 알아보았습니다.
유용하셨다면, 공감과 구독 부탁 드립니다.
감사합니다. :)
댓글