Dart 서버: 서버 미들웨어 및 플러그인 작성하기
오늘은 서버 미들웨어의 개념과 Dart에서 미들웨어의 역할, 그리고 요청/응답 미들웨어를 작성하는 방법에 대해 알아보겠습니다.
초보자도 이해할 수 있도록 쉽게 설명해 드릴게요.
서버 미들웨어의 개념
서버 미들웨어는 클라이언트의 요청과 서버의 응답 사이에서 중간 처리를 하는 소프트웨어입니다.
미들웨어는 요청을 가로채서 추가적인 작업을 수행할 수 있게 해줍니다.
예를 들어, 인증, 로깅, 에러 처리와 같은 작업을 미들웨어를 통해 처리할 수 있습니다.
미들웨어의 필요성
- 코드 재사용: 공통된 기능을 여러 라우터에서 재사용할 수 있습니다.
- 응집력 있는 구조: 관련 기능을 모아서 관리할 수 있어 코드가 더 깔끔해집니다.
- 유지 보수 용이: 기능을 한 곳에서 관리하므로 수정이나 유지 보수가 용이합니다.
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);
};
};
}
코드 설명
- authMiddleware 함수: 미들웨어를 생성하는 함수입니다. Handler를 받아서 새로운 Handler를 반환합니다.
- Request에서 헤더 확인: 요청의 헤더에서 Authorization 값을 확인합니다. 유효한 값이 아닐 경우 접근 거부 응답을 반환합니다.
- 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;
};
};
}
코드 설명
- loggingMiddleware 함수: 요청 메소드와 URI, 응답 상태 코드를 출력하는 미들웨어입니다.
- 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');
}
};
};
}
코드 설명
- errorHandlingMiddleware 함수: 에러가 발생할 경우, 에러를 잡아내고 적절한 응답을 반환합니다.
- 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.');
}
코드 설명
- Pipeline: 여러 미들웨어를 순차적으로 적용하는 객체입니다.
- _echoRequest 핸들러: 요청이 성공적으로 처리되면 응답을 반환합니다.
- 서버 시작: localhost에서 8080 포트로 서버를 시작합니다.
오늘은 Dart에서 서버 미들웨어의 개념과 역할, 그리고 인증, 로깅, 에러 처리 미들웨어를 작성하는 방법에 대해 알아보았습니다.
미들웨어를 통해 서버의 기능을 모듈화하고 유지 보수성을 높일 수 있습니다.
구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Dart > Dart Server' 카테고리의 다른 글
[추가학습] Dart 서버/ 서버 애플리케이션 국제화(i18n) 및 지역화(l10n)/ 날짜 및 시간 처리 (5) | 2024.10.06 |
---|---|
[추가학습] Dart 서버/ 서버 미들웨어 및 플러그인 작성 / 커스텀 플러그인 개발 (1) | 2024.09.22 |
[추가학습] Dart 서버/ 분산 시스템 및 서버 확장성 / 이벤트 기반 아키텍처 (1) | 2024.09.22 |
[추가학습] Dart 서버/ 분산 시스템 및 서버 확장성 / 서버 확장성 고려하기 (1) | 2024.09.22 |
[추가학습] Dart 서버/ 분산 시스템 및 서버 확장성 / 분산 시스템의 개념과 Dart의 적용 (0) | 2024.09.22 |