본문 바로가기
Node.js

[Node.js] 노드제이에스 - 컨트롤러 작성

by Seong-Jun 2024. 2. 10.
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

댓글