728x90
반응형
SMALL
Do it! Node.js 프로그래밍 입문 8일차 입니다.
디자인 아키텍처
코드를 읽기 쉽고 관리하기 편하도록 기능이나 역할에 따라 여러 파일로 나눈 뒤 연결해서 사용하자는 것을 디자인 아키텍처라고 합니다.
MVC 패턴
Model, View, Controller을 합해서 MVC 패턴이라고 합니다. 이렇게 3개로 나눠서 코딩하면 실제 처리 로직과 데이터베이스, 인터페이스 부분이 서로 영향을 받지 않습니다.
영역 | 설명 |
모델 | - 애플리케이션에서 처리할 대상 - 데이터베이스를 통해 자료를 저장하거나 검색, 수정하는 함수들이 모델에 해당 - 사용자에게 어떻게 보일지는 신경 쓰지 않고 처리할 대상에 집중 |
뷰 | - 컨트롤러나 모델의 처리 결과를 시각적으로 보여줍니다. - 흔히 사이트나 애플리케이션에 표시되는 화면을 만듭니다. - 서버에서 가져온 동적 자료를 표시하므로 템플릿 형태로 처리합니다. |
컨트롤러 | - 모델과 뷰 중간에 위치하면서 요청에 따라 모델이나 뷰를 수정하는 역할을 합니다. - 노드에서 작성하는 라우트 코드가 컨트롤러에 해당합니다. |
뷰와 모델은 직접 연결되지 않습니다. 브라우저에서 POST방식으로 자료를 만들 때도 중간에 컨트롤러를 거쳐서 데이터베이스에 저장하고, 데이터베이스의 자료를 가져와 브라우저 화면에 보여 줄 때에도 중간에 컨트롤러를 거칩니다.
컨트롤러 작성하기
모든 연락처 가져오기
controllers/contactController.js
// @desc 함수설명
// @route 요청방식과 URL
// @desc Get all contacts
// @route GET /contacts
const getAllContacts = async (req, res) => { // 비동기 처리
try {
res.status(200).send("Contacts Page")
} catch (error) {
res.send(error.message)
}
}
이런식으로 코드를 작성하면 try ~ catch 구문을 계속 반복해서 작성해야 합니다. 다음 명령어로 패키지를 설치합니다.
npm install express-async-handler
const asyncHandler = require("express-async-handler") // npm install express-async-handler
// @desc 함수설명
// @route 요청방식과 URL
// @desc Get all contacts
// @route GET /contacts
// const getAllContacts = async (req, res) => { // 비동기 처리
// try {
// res.status(200).send("Contacts Page")
// } catch (error) {
// res.send(error.message)
// }
// }
// => 위의 코드 express-async-handler를 사용하여 수정
const getAllContacts = asyncHandler(async (req, res) => { // 비동기 처리
// DB 연락처 가져오기
res.status(200).send("Contacts Page")
})
routes/contactRoutes.js
const express = require("express")
const router = express.Router() // router 객체 인스턴스 생성
const getAllContacts = require("../controllers/contactController")
router
.route("/")
.get(getAllContacts)
// 코드생략 ...
새 연락처 추가하기
controllers/contactController.js
// @desc Create a contact
// @route POST /contacts
const createContact = asyncHandler(async (req, res) => {
console.log(req.body)
const {name, email, phone} = req.body
if(!name || !email || !phone) {
return res.status(400).send("필수 값이 입력되지 않았습니다.")
}
res.status(201).send("Create Contacts")
})
module.exports = {getAllContacts, createContact}
routes/contactRoutes.js
const express = require("express")
const router = express.Router() // router 객체 인스턴스 생성
const {
getAllContacts,
createContact
} = require("../controllers/contactController")
router
.route("/")
.get(getAllContacts)
.post(createContact)
다른 기능들 ...
routes/contactRoutes.js
const express = require("express")
const router = express.Router() // router 객체 인스턴스 생성
const {
getAllContacts,
createContact,
getContact,
updateContact,
deleteContact
} = require("../controllers/contactController")
router
.route("/")
.get(getAllContacts)
.post(createContact)
router
.route("/:id")
.get(getContact)
.put(updateContact)
.delete(deleteContact)
module.exports = router
controllers/contactController.js
const asyncHandler = require("express-async-handler") // npm install express-async-handler
const Contact = require("../models/contactModel") // DB모델 연결
// @desc 함수설명
// @route 요청방식과 URL
// @desc Get all contacts
// @route GET /contacts
const getAllContacts = asyncHandler(async (req, res) => { // 비동기 처리
// DB 연락처 가져오기
res.status(200).send("Contacts Page")
})
// @desc Create a contact
// @route POST /contacts
const createContact = asyncHandler(async (req, res) => {
console.log(req.body)
const {name, email, phone} = req.body
if(!name || !email || !phone) {
return res.status(400).send("필수 값이 입력되지 않았습니다.")
}
res.status(201).send("Create Contacts")
})
// @desc Get a contact
// @route Get /contacts/:id
const getContact = asyncHandler(async (req, res) => {
res.status(200).send(`View Contact for ID : ${req.params.id}`)
})
// @desc Update a contact
// @route PUT /contacts/:id
const updateContact = asyncHandler(async (req, res) => {
// 특정조건에 맞는 연락처 가져오기
res.status(200).send(`Update Contact for ID : ${req.params.id}`)
})
// @desc Delete a contact
// @route DELETE /contacts/:id
const deleteContact = asyncHandler(async (req, res) => {
res.status(200).send(`Delete Contact for ID : ${req.params.id}`)
})
module.exports = {getAllContacts, createContact, getContact, updateContact, deleteContact}
728x90
반응형
LIST
'Node.js' 카테고리의 다른 글
[Node.js] 노드제이에스 - 템플릿 엔진 (2) | 2024.02.13 |
---|---|
[Node.js] 노드제이에스 - CRUD 코드 작성 (0) | 2024.02.10 |
[Node.js] 노드제이에스 - CRUD를 위한 API 작성 (0) | 2024.02.10 |
[Node.js] 노드제이에스 - 몽고DB (2) | 2024.02.09 |
[Node.js] 노드제이에스 - 미들웨어 함수 만들기 (0) | 2024.02.08 |
댓글