ExpressJS에서 미들웨어와 컨트롤러 이해하기: 차이점 및 활용 방법

목화·2023년 5월 3일
1

얼마 전, 드디어 Nomad Coders의 웹기초 스터디의 유튜브 클론코딩이 진행이 시작되었다. 오늘의 과제를 해결한 뒤 뒤늦게 복습으로 영상을 보다가, 니꼬쌤이 예로 보여주는 함수를 수정하기에 따라 미들웨어가 될 수도 있고 컨트롤로가 될 수도 있다고 해서 문득 미들웨어(middleware)와 컨트롤러(controller)의 차이점에 대해 궁금해져 간단하게 정리해 보고자 한다. 먼저 GPT4 선생에게 물어본 뒤 구라인지 확인해 보고자 한다.

미들웨어(middleware)

미들웨어는 요청과 응답 사이에서 실행되는 함수다. 미들웨어는 순차적으로 실행되며, 컨트롤러 실행 전에 특정 작업을 수행하거나, 컨트롤러가 응답을 반환한 후 추가 작업을 수행할 수 있다. 주요 기능으로는 요청 및 응답 객체를 수정하거나, 인증 및 권한 확인, 에러 처리 등이 있다.

  1. 인증 및 권한 확인 : 사용자가 인증되었는지 확인하거나 특정 역할을 가진 사용자만 접근할 수 있도록 검증하는 작업을 수행한다.
  2. 에러 처리 : 에러가 발생할 경우, 이를 적절하게 처리하여 사용자에게 응답을 반환한다.
  3. 요청 및 응답 로깅 : 서버의 요청과 응답에 대한 정보를 기록하여, 추후 분석이나 디버깅에 활용할 수 있다.
  4. 요청 및 응답 데이터 변환 : 클라이언트로부터 받은 요청 데이터를 처리하기 쉬운 형태로 변환하거나, 서버에서 반환하는 응답 데이터를 클라이언트가 사용하기 쉬운 형태로 변환한다.

예를 들어, 다음과 같은 미들웨어가 있다.

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);

컨트롤러(controller)

컨트롤러는 웹 애플리케이션에서 요청(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에서 컨트롤러와 미들웨어를 적절하게 활용하면, 웹 애플리케이션의 구조를 더 효과적으로 관리하고 확장할 수 있다.

참조

profile
🧑‍💻 SOFTWARE ENGINEER. 무해를 지향합니다. 편견을 지양합니다.

0개의 댓글