17. express.Router, ERD란?

JSLEE·2024년 5월 5일

express.all & next()

express에서는 express.all("/", function(res,req){}) 메소드를 통해 모든 http요청에 대해 처리할 수 있다.

app.all('/main', function (req, res, next) {
  console.log('all-main');
  next(); 
});

해당 코드에서 GET, POST, DELETE 등 무슨 http메소드가 오든 콘솔에 all-main이라는 문자를 출력한다.
또한, next() 함수를 통해, 다음 핸들러로 이동시켜준다.
예를들어, postman을 통해 GET request를 보낸다면,
app.all -> next() -> app.get 의 순서대로 작동한다는 의미이다.

app.get('/main', function (req, res) {
  console.log('get-main'); // all-main , get-main 출력
  res.send('end')
});

next() 다음에 이어지는 핸들러가 없으면, respond가 없기때문에 오류가 발생한다.
따라서, 구현하고자 하는 기능들을 유용하게 분리하여 작성할 수 있다.

next()는 app.all()에서만 사용할 수 있는 것이아니라, 다른 http 메소드에도 적용이 가능하고, 중첩해서 사용할 수 있다.

app.get('/main', (req,res,next) =>{
  console.log('get-main1')
  next()
}, (req,res)=>{
  console.log('get-main2')
  res.send('end')
})        

app.get('url' , function1, function2 ...) 와 같이 작성하면 된다.


express.Router() 클래스

지금까지 연습에서는, 다음과 같이 작성을 했었다.

const express = require("express")
const app = express()
app.listen(3000)

그 이유는, 모든 request를 같은 파일에서 처리하고, 같은 파일에서 서버를 실행시켰기 때문이다.
유지ㆍ보수를 위해 URL 구역마다 파일을 나누어서 작성하면 어떻게 해야할까?

쇼핑몰 사이트를 예시로 들어보자.
쇼핑몰에서는 회원 관리를 하는 API를 처리하는 파일이 있을 것이고, (user.js)
회원의 정보를 이용하여 결재 내역, 장바구니 등에 대해 처리하는 파일이 있을 것이다.
(info.js)
또한, 이 파일들을 모아모아 서버를 실행시키기 위한 파일이 있을 것이다. (app.js)

이 때 사용할 수 있는 express의 클래스가 바로 express.Router() 클래스이다.
사용법은 어렵지 않다.

user.js나, info.js 에서는 다음과 같이 작성했을 것이다.

// user.js , info.js
const express = require("express")
const app = express()
app.listen(3000)

이 코드를, app = express() 부분을 express.Router() 클래스로 바꾸어주면 된다.

// user.js , info.js
const express = require("express")
const router = express.Router()
// app.listen(3000) -> 서버에서 모아서 작동시킬것이므로 삭제

router.get() // app.get() 대신, router.get() 사용
router.post() // app.post() 대신, router.post() 사용

module.exports = router // 모듈 export

이렇게 export한 모듈을, 서버파일에서 불러와서 실행시켜보자.

// app.js (서버 관리 파일)
const express = require("express")
const app = express()
app.listen(3000)

const userRouter = require('./routes/user') // user.js 의 위치
const infoRouter = require('./routes/info') // info.js 의 위치

app.use("/" , userRouter)
app.use("/" , infoRouter)

위 코드를 통해, 각각 따로 라우팅된 js파일들을 모아서 한번에 실행시킬 수 있다.
그리고, app.use("/" , "모듈명") 에서, 주소부분("/") 을 바꿀 수 있다.
예를들어 app.use("/user/", userRouter) 라고 작성하게 되면,
user.js에서는 기본적으로 /user/ 이라는 URL이 포함되게 된다.
따라서 user.js에서 router.get('/', function) 이라고 작성하기만 해도,
URL은 '/user/' 을 의미하게 된다.


그 외 express의 respond 메소드

res.json, res.send() 는 클라이언트에게 데이터를 전달하기 위해 기본적으로 알고 있어야하는 필수 요소이고,

res.download(), res.redirect() 를 요긴하게 사용할 수 있을 것 같다.

참고자료 : expressjs.com


ERD란?

"구조"화된 데이터를 저장하기 위해 데이터베이스를 쓴다. 이 데이터의 "구조" 및 그에 수반한 제약 조건들은 다양한 기법에 의해 설계될 수 있다. 그 기법 중 하나가 개체-관계 모델링(Entity-Relationship Modelling)이다. 줄여서 ERM이라고 한다. ERM 프로세스의 산출물을 가리켜 개체-관계 다이어그램(Entity-Relationship Diagram)이라 한다. 줄여서 ERD라 일컫는다. 데이터 모델링 과정은 데이터 모델을 그림으로 표현하기 위해 표시법을 필요로 한다. ERD는 개념적 데이터 모델 혹은 시맨틱 데이터 모델의 한 타입이다.
ERD란-Wikipedia

쉽게 말해서, 데이터베이스를 설계할 때 어떤 데이터들이 서로 연관이 있는지를 한눈에 알아볼 수 있게 도식화한 것이다.
이를 통해서, 복잡한 데이터들의 관계를 파악할 수 있고, 불필요한 데이터를 파악할 수 있으며, 데이터를 수정할 때 다른 데이터에 미치는 영향에 대해서도 파악할 수 있다.

creately.com 에서 ERD 템플릿들을 확인할 수 있다.
다음은 creately.com 의 기본 템플릿 중 하나를 가지고 와봤다.

직사각형 : 직사각형은 Entity를 의미한다. 엔터티는 데이터가 저장되는 주체이다. 즉, Database 의 테이블명과 같은 역할이라고 생각하면 될 것 같다. ( ex. table : 탈것 )
타원 : Database의 테이블에는 column으로 속성들이 있다. 해당 속성들을 타원에 나타낸다.
(ex. attribute : 탈것의 이름, 탈것의 가격, 탈것의 속도 등)
마름모 : 관계를 나타내며, 주로 동작을 나타내는 표현이 사용된다.


profile
공부한 내용들을 정리하기 위해 사용하는 블로그입니다.

0개의 댓글