본문 바로가기
Dart/Study

Dart로 간단한 웹 서버 만들기: Shelf 패키지 사용법과 옵션

by Maccrey Coding 2024. 7. 13.
728x90
반응형

안녕하세요! 오늘은 Dart로 간단한 웹 서버를 만드는 방법을 소개하겠습니다. Dart의 강력한 웹 서버 프레임워크 중 하나인 Shelf 패키지를 사용하여 웹 서버를 구축하고 다양한 옵션을 살펴보겠습니다.

Shelf 패키지란?

Shelf는 간단하고 유연한 HTTP 서버와 미들웨어를 작성할 수 있는 Dart 패키지입니다. 이 패키지를 사용하면 웹 애플리케이션을 구축하는 것이 매우 쉬워집니다. Shelf는 요청과 응답을 처리하기 위한 모듈형 미들웨어 시스템을 제공합니다.

시작하기

먼저, Shelf 패키지를 사용하기 위해 Dart 프로젝트를 생성하고 pubspec.yaml 파일에 Shelf 패키지를 추가합니다.

name: my_shelf_server
description: A simple server using Shelf.
dependencies:
  shelf: ^1.2.0
  shelf_router: ^1.0.0
  shelf_static: ^1.0.0

패키지를 추가한 후, pub get 명령어를 실행하여 패키지를 설치합니다.

기본 웹 서버 만들기

이제 기본적인 웹 서버를 만들어보겠습니다. bin 폴더에 server.dart 파일을 생성하고 아래와 같이 코드를 작성합니다.

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

void main() async {
  // 요청을 처리하는 핸들러
  var handler = Pipeline().addMiddleware(logRequests()).addHandler(_echoRequest);

  // 서버 실행
  var server = await io.serve(handler, 'localhost', 8080);
  print('Server listening on port ${server.port}');
}

// 요청을 처리하고 응답을 반환하는 함수
Response _echoRequest(Request request) =>
    Response.ok('Request for "${request.url}"');

이 코드는 기본적인 HTTP 요청을 처리하고 요청된 URL을 반환하는 웹 서버를 만듭니다. 서버는 localhost의 8080 포트에서 실행됩니다.

라우팅 추가

더 복잡한 애플리케이션을 만들기 위해 라우팅을 추가할 수 있습니다. 이를 위해 shelf_router 패키지를 사용합니다.

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

void main() async {
  // 라우터 생성
  final router = Router();

  // 라우트 핸들러 추가
  router.get('/', _rootHandler);
  router.get('/hello/<name>', _helloHandler);

  // 요청을 처리하는 핸들러
  var handler = Pipeline().addMiddleware(logRequests()).addHandler(router);

  // 서버 실행
  var server = await io.serve(handler, 'localhost', 8080);
  print('Server listening on port ${server.port}');
}

Response _rootHandler(Request request) => Response.ok('Hello, World!');

Response _helloHandler(Request request) {
  final name = params(request, 'name');
  return Response.ok('Hello, $name!');
}

이 코드는 두 개의 라우트를 추가합니다. 기본 라우트(/)는 "Hello, World!" 메시지를 반환하고, /hello/<name> 라우트는 URL에서 이름을 추출하여 인사말을 반환합니다.

정적 파일 제공

정적 파일을 제공하기 위해 shelf_static 패키지를 사용할 수 있습니다. 예를 들어, public 폴더에 있는 파일을 제공하려면 다음과 같이 설정할 수 있습니다.

import 'dart:io';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_router/shelf_router.dart';
import 'package:shelf_static/shelf_static.dart';

void main() async {
  final router = Router();

  router.get('/', _rootHandler);
  router.get('/hello/<name>', _helloHandler);

  // 정적 파일 제공 미들웨어 추가
  var staticHandler = createStaticHandler('public', defaultDocument: 'index.html');

  var handler = Pipeline()
      .addMiddleware(logRequests())
      .addMiddleware((innerHandler) {
        return (request) async {
          // 정적 파일 처리
          var staticResponse = await staticHandler(request);
          if (staticResponse.statusCode != 404) {
            return staticResponse;
          }
          // 정적 파일이 없으면 다른 라우트 처리
          return innerHandler(request);
        };
      })
      .addHandler(router);

  var server = await io.serve(handler, 'localhost', 8080);
  print('Server listening on port ${server.port}');
}

Response _rootHandler(Request request) => Response.ok('Hello, World!');

Response _helloHandler(Request request) {
  final name = params(request, 'name');
  return Response.ok('Hello, $name!');
}

이 코드는 public 폴더에서 정적 파일을 제공하며, 기본 문서로 index.html을 설정합니다.

결론

Shelf 패키지를 사용하면 Dart로 간단하면서도 강력한 웹 서버를 쉽게 구축할 수 있습니다.

라우팅, 정적 파일 제공, 미들웨어 등을 활용하여 다양한 기능을 구현할 수 있습니다.

이제 Shelf를 사용하여 나만의 웹 애플리케이션을 만들어 보세요!

728x90
반응형