본문 바로가기
computing

미들웨어(middleware)

by tech-stu 2025. 2. 18.

백엔드에서 미들웨어란?

미들웨어(Middleware)는 말 그대로 **"중간에서 무언가를 하는 것"**을 의미해. 백엔드에서 미들웨어는 클라이언트(사용자의 요청)와 서버(요청을 처리하는 곳) 사이에서 중간 역할을 하는 프로그램 또는 함수야.


미들웨어의 역할

미들웨어는 여러 가지 역할을 하지만, 가장 대표적인 역할은 다음과 같아:

  1. 요청(Request)과 응답(Response) 처리
    • 사용자가 요청을 보내면 그 요청을 가로채서 확인하거나 변경할 수 있어.
    • 서버가 응답을 보내기 전에 데이터를 추가하거나 수정할 수도 있어.
  2. 인증 및 권한 관리
    • 로그인한 사용자인지 확인하고, 특정 기능에 접근할 권한이 있는지 체크하는 역할을 해.
    • 예를 들어, 관리자만 접근 가능한 페이지라면 미들웨어가 먼저 확인하고 관리자만 요청을 진행하게 할 수 있어.
  3. 로깅 및 분석
    • 누가, 언제, 어떤 요청을 보냈는지 기록할 수 있어.
    • 이를 통해 서버의 상태를 모니터링하고, 문제가 생겼을 때 원인을 파악하는 데 도움을 줄 수 있어.
  4. 요청 데이터 검증
    • 사용자가 보낸 데이터가 유효한지 검사하는 역할을 해.
    • 예를 들어, 회원가입 시 이메일 형식이 올바른지 확인하거나, 비밀번호가 일정 길이 이상인지 검사할 수 있어.
  5. 캐싱(Caching)과 성능 최적화
    • 자주 요청되는 데이터를 미리 저장해서 서버의 부하를 줄일 수 있어.
    • 예를 들어, 인기 있는 게시글 정보를 캐시에 저장해두면 데이터베이스를 매번 조회하지 않아도 돼.

미들웨어의 예제

예제 1: 요청을 가로채서 로그 남기기

def logging_middleware(request, next):
    print(f"요청을 받았습니다: {request['url']}")
    return next(request)  # 다음 미들웨어 또는 실제 처리 함수 실행

사용자가 http://example.com/user로 요청을 보내면:

요청을 받았습니다: http://example.com/user

이런 로그가 남게 돼.


예제 2: 로그인한 사용자만 요청 처리

def auth_middleware(request, next):
    if not request.get("user"):  # 사용자가 로그인하지 않았다면
        return {"status": 401, "message": "로그인이 필요합니다."}
    
    return next(request)  # 로그인한 경우 다음 단계 진행
  • 로그인하지 않은 사용자가 요청하면 "로그인이 필요합니다." 라는 응답을 보내.
  • 로그인한 사용자는 정상적으로 요청이 진행돼.

예제 3: 데이터 유효성 검사

def validation_middleware(request, next):
    if "email" not in request or "password" not in request:
        return {"status": 400, "message": "이메일과 비밀번호가 필요합니다."}
    
    return next(request)  # 검사가 통과되면 다음 단계 진행
  • email과 password가 없으면 "이메일과 비밀번호가 필요합니다." 라는 메시지를 보냄.
  • 유효한 데이터라면 다음 단계로 넘어감.

미들웨어의 실행 흐름

미들웨어는 여러 개를 사용할 수 있고, 보통 순차적으로 실행돼.

예를 들어, 사용자가 로그인한 사용자만 볼 수 있는 페이지에 접근했다고 가정하면:

  1. 로깅 미들웨어가 실행 → 요청을 기록
  2. 인증 미들웨어 실행 → 로그인했는지 확인
  3. 데이터 검증 미들웨어 실행 → 요청 데이터 확인
  4. 핵심 비즈니스 로직 실행 → 실제 데이터 처리

만약 로그인하지 않았다면, 2번 미들웨어에서 멈추고 **"로그인이 필요합니다."**라는 메시지를 반환하게 돼.


정리

미들웨어는 요청과 응답 사이에서 중간 역할을 하는 기능
보안, 로깅, 성능 최적화, 데이터 검증 등 다양한 역할을 함
순차적으로 실행되며, 특정 조건이 충족되지 않으면 요청을 중단할 수도 있음
백엔드 개발에서 필수적인 개념으로, 효율적이고 안전한 서버를 만들 때 유용하게 사용됨

이제 미들웨어가 뭔지 이해됐을 거야! 😊👍

 


백엔드에서 미들웨어는 애플리케이션의 핵심 로직을 처리하는 부분과 클라이언트 요청을 처리하는 부분 사이에서 요청과 응답을 중간에서 처리하는 역할을 합니다. 미들웨어는 다양한 기능을 수행하며, 백엔드 개발에서 필수적인 요소입니다.

미들웨어의 주요 기능:

  • 요청/응답 처리: 클라이언트 요청을 가로채서 필요한 작업을 수행하고, 응답을 수정하거나 추가 정보를 담아 클라이언트에게 전달합니다.
  • 인증/인가: 사용자 인증 및 권한 부여를 처리하여 보안을 강화합니다.
  • 로깅: 요청, 응답, 에러 등의 정보를 기록하여 애플리케이션의 상태를 모니터링하고 문제 발생 시 추적을 용이하게 합니다.
  • 데이터 변환: 요청 데이터를 필요한 형식으로 변환하거나, 응답 데이터를 클라이언트가 이해할 수 있는 형식으로 변환합니다.
  • 캐싱: 자주 사용되는 데이터를 임시로 저장하여 성능을 향상시킵니다.
  • 에러 처리: 예외를 처리하고 적절한 에러 응답을 클라이언트에게 전달합니다.

미들웨어의 장점:

  • 코드 재사용성: 공통 기능을 하는 미들웨어를 여러 애플리케이션에서 재사용하여 개발 효율성을 높입니다.
  • 관심사 분리: 핵심 로직과 부가 기능을 분리하여 코드의 가독성을 높이고 유지보수를 용이하게 합니다.
  • 확장성: 필요한 기능을 하는 미들웨어를 추가하거나 수정하여 쉽게 기능을 확장할 수 있습니다.

미들웨어의 종류:

  • 전역 미들웨어: 모든 요청에 대해 실행되는 미들웨어
  • 라우팅 미들웨어: 특정 라우트에만 적용되는 미들웨어
  • 사용자 정의 미들웨어: 개발자가 직접 작성한 미들웨어

미들웨어 사용 예시 (Node.js Express):

JavaScript
 
const express = require('express');
const app = express();

// 미들웨어 예시: 로깅
app.use((req, res, next) => {
  console.log(`[${new Date()}] ${req.method} ${req.url}`);
  next(); // 다음 미들웨어 또는 라우트 핸들러로 이동
});

// 라우트 핸들러
app.get('/', (req, res) => {
  res.send('Hello World!');
});

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

백엔드 프레임워크별 미들웨어:

  • Node.js Express: app.use() 메서드를 사용하여 미들웨어 등록
  • Spring: 인터셉터 또는 필터를 사용하여 미들웨어 구현
  • Django: 미들웨어 클래스를 정의하여 사용

참고 자료:

미들웨어는 백엔드 개발에서 매우 중요한 개념이므로, 다양한 미들웨어를 사용해보고 직접 만들어보면서 익히는 것이 좋습니다. 궁금한 점이 있다면 언제든지 다시 질문해주세요.