본문 바로가기
Dart/Dart Server

[추가학습] Dart 서버/ 서버 미들웨어 및 플러그인 작성 / 서버 미들웨어의 개념

by Maccrey Coding 2024. 9. 22.
728x90
반응형

Dart 서버: 서버 미들웨어 및 플러그인 작성하기

오늘은 서버 미들웨어의 개념과 Dart에서 미들웨어의 역할, 그리고 요청/응답 미들웨어를 작성하는 방법에 대해 알아보겠습니다.

초보자도 이해할 수 있도록 쉽게 설명해 드릴게요.

서버 미들웨어의 개념

서버 미들웨어는 클라이언트의 요청과 서버의 응답 사이에서 중간 처리를 하는 소프트웨어입니다.

미들웨어는 요청을 가로채서 추가적인 작업을 수행할 수 있게 해줍니다.

예를 들어, 인증, 로깅, 에러 처리와 같은 작업을 미들웨어를 통해 처리할 수 있습니다.

미들웨어의 필요성

  1. 코드 재사용: 공통된 기능을 여러 라우터에서 재사용할 수 있습니다.
  2. 응집력 있는 구조: 관련 기능을 모아서 관리할 수 있어 코드가 더 깔끔해집니다.
  3. 유지 보수 용이: 기능을 한 곳에서 관리하므로 수정이나 유지 보수가 용이합니다.

Dart에서 미들웨어의 역할과 필요성

Dart에서는 shelf 패키지를 사용하여 미들웨어를 쉽게 구현할 수 있습니다. shelf는 Dart의 웹 서버를 위한 미들웨어와 라우팅 기능을 제공하는 라이브러리입니다.

예시: shelf 패키지 설치

pubspec.yaml 파일에 다음과 같이 shelf 패키지를 추가합니다.

dependencies:
  shelf: ^1.0.0

요청/응답 미들웨어 작성하기

이제 Dart에서 간단한 요청/응답 미들웨어를 작성해보겠습니다. 예를 들어, 인증 미들웨어, 로깅 미들웨어, 에러 처리 미들웨어를 구현할 거예요.

1. 인증 미들웨어

인증 미들웨어는 클라이언트의 요청이 유효한지 확인합니다.

코드 예제: 인증 미들웨어

import 'dart:async';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/http.dart' as http;

Middleware authMiddleware() {
  return (Handler innerHandler) {
    return (Request request) async {
      // 요청 헤더에서 'Authorization' 키를 확인
      final authHeader = request.headers['Authorization'];
      if (authHeader == null || authHeader != 'Bearer valid_token') {
        return Response.forbidden('Access Denied');
      }
      // 인증이 성공하면 다음 미들웨어 또는 핸들러 호출
      return await innerHandler(request);
    };
  };
}

코드 설명

  1. authMiddleware 함수: 미들웨어를 생성하는 함수입니다. Handler를 받아서 새로운 Handler를 반환합니다.
  2. Request에서 헤더 확인: 요청의 헤더에서 Authorization 값을 확인합니다. 유효한 값이 아닐 경우 접근 거부 응답을 반환합니다.
  3. innerHandler 호출: 인증이 성공하면 다음 핸들러를 호출합니다.

2. 로깅 미들웨어

로깅 미들웨어는 요청을 기록하여 후에 분석할 수 있게 해줍니다.

코드 예제: 로깅 미들웨어

Middleware loggingMiddleware() {
  return (Handler innerHandler) {
    return (Request request) async {
      print('Request Method: ${request.method}');
      print('Request URI: ${request.requestedUri}');
      final response = await innerHandler(request);
      print('Response Status: ${response.statusCode}');
      return response;
    };
  };
}

코드 설명

  1. loggingMiddleware 함수: 요청 메소드와 URI, 응답 상태 코드를 출력하는 미들웨어입니다.
  2. innerHandler 호출: 요청이 처리된 후, 응답 상태 코드를 출력하고 응답을 반환합니다.

3. 에러 처리 미들웨어

에러 처리 미들웨어는 서버에서 발생하는 에러를 처리합니다.

코드 예제: 에러 처리 미들웨어

Middleware errorHandlingMiddleware() {
  return (Handler innerHandler) {
    return (Request request) async {
      try {
        return await innerHandler(request);
      } catch (e) {
        print('Error: $e');
        return Response.internalServerError(body: 'Internal Server Error');
      }
    };
  };
}

코드 설명

  1. errorHandlingMiddleware 함수: 에러가 발생할 경우, 에러를 잡아내고 적절한 응답을 반환합니다.
  2. try-catch 블록: 요청 처리 중에 발생하는 예외를 캐치하여 에러 메시지를 출력하고 500 에러 응답을 반환합니다.

전체 서버 예제

이제 위에서 만든 미들웨어를 결합하여 간단한 서버를 만들어 보겠습니다.

전체 서버 코드

import 'dart:async';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/http.dart' as http;
import 'package:shelf/shelf_io.dart' as io;

void main() async {
  final handler = const Pipeline()
      .addMiddleware(authMiddleware())
      .addMiddleware(loggingMiddleware())
      .addMiddleware(errorHandlingMiddleware())
      .addHandler(_echoRequest);

  final server = await io.serve(handler, 'localhost', 8080);
  print('Serving at http://${server.address.host}:${server.port}');
}

Response _echoRequest(Request request) {
  return Response.ok('Request for "${request.url}" received.');
}

코드 설명

  1. Pipeline: 여러 미들웨어를 순차적으로 적용하는 객체입니다.
  2. _echoRequest 핸들러: 요청이 성공적으로 처리되면 응답을 반환합니다.
  3. 서버 시작: localhost에서 8080 포트로 서버를 시작합니다.

오늘은 Dart에서 서버 미들웨어의 개념과 역할, 그리고 인증, 로깅, 에러 처리 미들웨어를 작성하는 방법에 대해 알아보았습니다.

미들웨어를 통해 서버의 기능을 모듈화하고 유지 보수성을 높일 수 있습니다.

 

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

728x90
반응형