아카이브

[Node][Express] route & Router 메소드 본문

Backend/Node.js

[Node][Express] route & Router 메소드

Rayi 2024. 8. 19. 11:07

route( )

미들웨어의 기능을 추가하다보면 이렇게 중복되는 경로들이 많아지는 경우가 있습니다.

아래 코드의 경우 /products의 경로가 중복해서 나타나는 것을 볼 수 있습니다.

import express from 'express'

const app = express()

app.get('/products', (req, res) => {
    res.json({ message: 'get Product list' })
})

app.post('/products', (req, res) => {
    res.json({ message: 'add Product' })
})

app.patch('/products/:id', (req, res) => {
    res.json({ message: 'modify Product' })
})

app.delete('/products/:id', (req, res) => {
    res.json({ message: 'delete Product' })
})

app.listen(3000, () => {
    console.log('Server is listening on port 3000')
})

express의 route( ) 메소드를 사용하면 자주 사용되는 경로를 묶어서 간단하게 작성할 수 있습니다.

import express from 'express'

const app = express()

app.route('/products')
    .get((req, res) => {
        res.json({ message: 'get Product list' })
    })
    .post((req, res) => {
        res.json({ message: 'add Product' })
    })

app.route('/products/:id')
    .patch('/products/:id', (req, res) => {
        res.json({ message: 'modify Product' })
    })
    .delete('/products/:id', (req, res) => {
        res.json({ message: 'delete Product' })
    })

app.listen(3000, () => {
    console.log('Server is listening on port 3000')
})

Router( )

route를 이용해서 중복되는 경로의 기입을 줄일 수 있지만, 경로 자체가 여러가지라면 route의 개수 또한 많아지게 됩니다.

이 때 express의 Router() 메소드를 사용하면 비슷한 기능을 하는 route()들을 하나의 Router로 묶어 app과 연결시킬 수 있습니다.

import express from 'express'

const app = express()

const sampleRouter = express.Router()

sampleRouter.route('/')  // app 대신 sampleRouter에 route를 사용합니다.
    .get((req, res) => {
        res.json({ message: 'get Product list' })
    })
    .post((req, res) => {
        res.json({ message: 'add Product' })
    })

sampleRouter.route('/:id')  // app 대신 sampleRouter에 route를 사용합니다.
    .patch('/products/:id', (req, res) => {
        res.json({ message: 'modify Product' })
    })
    .delete('/products/:id', (req, res) => {
        res.json({ message: 'delete Product' })
    })
    
app.use('/products', sampleRouter) // sampleRouter를 미들웨어로 사용합니다.

app.listen(3000, () => {
    console.log('Server is listening on port 3000')
})

또한 미들웨어는 Router 수준에서도 정의할 수 있습니다.

sampleRouter.use((req, res, next) => {
    console.log('this is always exectued in the sampleRouter')
    next()
})

이렇게 생성하는 Router들은 다른 파일에서 작성할 수도 있기 때문에 미들웨어를 모듈화 하는데 사용될 수 있습니다. 

다음과 같은 구조로 미들웨어를 구성할 수 있습니다.

 

728x90
Comments