얼마 전, 드디어 Nomad Coders의 웹기초 스터디의 유튜브 클론코딩이 진행이 시작되었다. 오늘의 과제를 해결한 뒤 뒤늦게 복습으로 영상을 보다가, 니꼬쌤이 예로 보여주는 함수를 수정하기에 따라 미들웨어가 될 수도 있고 컨트롤로가 될 수도 있다고 해서 문득 미들웨어(middleware)와 컨트롤러(controller)의 차이점에 대해 궁금해져 간단하게 정리해 보고자 한다. 먼저 GPT4 선생에게 물어본 뒤 구라인지 확인해 보고자 한다.
미들웨어는 요청과 응답 사이에서 실행되는 함수다. 미들웨어는 순차적으로 실행되며, 컨트롤러 실행 전에 특정 작업을 수행하거나, 컨트롤러가 응답을 반환한 후 추가 작업을 수행할 수 있다. 주요 기능으로는 요청 및 응답 객체를 수정하거나, 인증 및 권한 확인, 에러 처리 등이 있다.
예를 들어, 다음과 같은 미들웨어가 있다.
const authenticationMiddleware = (req, res, next) => {
// 인증 로직 수행
if (req.isAuthenticated()) {
// 인증에 성공하면 다음 미들웨어 또는 컨트롤러로 이동
next();
} else {
// 인증에 실패하면 에러 응답 반환
res.status(401).json({ error: 'Unauthorized' });
}
};
// 미들웨어 예제: 요청 로깅
const requestLogger = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
};
// 라우터에 미들웨어 추가
app.use(requestLogger);
컨트롤러는 웹 애플리케이션에서 요청(request)과 응답(response) 사이의 로직을 처리하는 역할을 담당한다. 클라이언트로부터 요청을 받으면, 해당 요청에 맞는 로직을 수행한 뒤 응답을 반환해 준다. 이 과정에서 데이터베이스와의 상호작용이나 다른 API와 통신을 할 수도 있다. 컨트롤러는 주로 라우팅 파일에서 사용되며, 요청의 종류에 따라 여러 개의 컨트롤러 함수를 작성할 수 있다.
예를 들어, 다음과 같은 컨트롤러가 있다.
const getUser = async (req, res) => {
try {
const user = await User.findById(req.params.id);
res.status(200).json(user);
} catch (err) {
res.status(500).json({ error: 'Something went wrong' });
}
};
컨트롤러와 미들웨어의 주요 차이점은 역할과 실행 시점이다. 컨트롤러는 주로 요청에 대한 로직을 처리하고 응답을 반환하는 반면, 미들웨어는 요청과 응답 사이에서 실행되어 추가 작업을 수행한다.
요약하면 다음과 같다.
미들웨어 | 컨트롤러 | |
---|---|---|
역할 | 요청과 응답 사이에서 추가 작업을 수행 | 요청에 대한 로직 처리와 응답 반환을 담당 |
실행 시점 | 컨트롤러 실행 전, 후 또는 사이에 실행되며, 실행 순서를 변경할 수 있다. | 요청에 따라 특정 시점에만 실행 |
활용도 | 여러 라우터에서 공통적으로 사용 | 특정 요청에 대한 로직을 처리 |
이러한 차이점을 이해하고 ExpressJS에서 컨트롤러와 미들웨어를 적절하게 활용하면, 웹 애플리케이션의 구조를 더 효과적으로 관리하고 확장할 수 있다.