[Dart 언어강좌] 019. Dart의 라이브러리 및 프레임워크 소개, 주요 라이브러리 소개 (http, routing 등)

Dart는 구글이 개발한 프로그래밍 언어로, 주로 모바일 및 웹 애플리케이션 개발에 사용됩니다. Dart는 다양한 라이브러리와 프레임워크를 제공하여 개발자들이 효율적으로 소프트웨어를 개발할 수 있도록 지원합니다. 이 글에서는 Dart의 주요 라이브러리와 프레임워크에 대해 자세히 알아보겠습니다.

Dart 라이브러리 개요

Dart의 라이브러리는 기능 단위로 구성되어 있으며, 특정 작업을 쉽게 수행할 수 있도록 돕습니다. Dart SDK에 포함된 기본 라이브러리는 여러 기능을 제공하며, 또한 pub.dev를 통해 다양한 서드파티 패키지를 추가로 사용할 수 있습니다.

주요 라이브러리

  • dart:core: 모든 Dart 프로그램에서 사용되는 기본 라이브러리로, 숫자, 문자열, 리스트, 맵 등과 같은 기본 데이터 타입을 포함합니다.
  • dart:async: 비동기 프로그래밍을 지원하며, Future 및 Stream 클래스를 통해 비동기 작업을 관리합니다.
  • dart:convert: JSON과 같은 데이터 포맷을 직렬화하고 역직렬화하는 기능을 제공합니다.
  • dart:html: 웹 애플리케이션 개발에 필요한 HTML 및 DOM manipulations을 위한 라이브러리입니다.
  • dart:io: 네트워크, 파일 시스템과의 상호작용을 제공하며, 서버 사이드 애플리케이션에 주로 사용됩니다.

Dart 프레임워크 소개

Dart는 여러 프레임워크와 함께 사용될 수 있으며, 그 중에서도 Flutter가 가장 유명합니다. 하지만 이 외에도 다양한 오픈소스 프레임워크가 존재합니다. 여기서는 Dart의 주요 프레임워크 몇 가지를 소개하겠습니다.

1. Flutter

Flutter는 구글이 개발한 UI 툴킷으로, Dart로 작성된 애플리케이션을 iOS, Android 및 웹 플랫폼에서 개발할 수 있게 도와줍니다. Flutter는 단일 코드베이스로 여러 플랫폼에 배포할 수 있다는 장점이 있습니다. 다음은 Flutter를 사용한 기본 애플리케이션 생성 예제입니다.

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Example')),
        body: Center(child: Text('Hello, Flutter!')),
      ),
    );
  }
}

2. AngularDart

AngularDart는 Angular 프레임워크의 Dart 버전으로, 구조화되고 유지 보수하기 쉬운 웹 애플리케이션을 개발하는 데 사용됩니다. 다음은 AngularDart를 사용한 기본 컴포넌트 예제입니다.

import 'package:angular/angular.dart';

@Component(
  selector: 'my-app',
  template: '

Hello, AngularDart!

', ) class AppComponent {}

3. Aqueduct

Aqueduct는 Dart 기반의 서버 사이드 프레임워크로, RESTful API를 쉽게 구축할 수 있게 도와줍니다. Aqueduct는 ORM과 Authentication 기능을 내장하고 있어 데이터베이스와의 상호작용이 용이합니다. 다음은 Aqueduct를 사용한 간단한 REST API 서버 예제입니다.

import 'package:aqueduct/aqueduct.dart';

class Channel extends ApplicationChannel {
  @override
  Future prepare() async {
    // 초기화 코드
  }

  @override
  Controller get entryPoint {
    final router = Router();
    router.route('/example').linkFunction((request) async {
      return Response.ok('Hello, Aqueduct!');
    });
    return router;
  }
}

4. shelf

Shelf는 Dart의 미들웨어 프레임워크로, HTTP 서버를 구성하는 데 필요한 기본 개념을 제공합니다. Shelf를 사용하면 기능을 플러그인 방식으로 추가하는 것이 가능합니다. 다음은 Shelf를 사용한 간단한 HTTP 서버 예제입니다.

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

void main() async {
  final handler = const Pipeline()
      .addMiddleware(logRequests())
      .addHandler((Request request) {
        return Response.ok('Hello, Shelf!');
      });

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

HTTP 라이브러리

Dart의 http 라이브러리는 클라이언트 측 HTTP 요청을 처리하기 위해 설계되었습니다. Flutter와 같은 모바일 애플리케이션에서 RESTful API와 통신하는 데 유용합니다. 아래는 GET 요청 및 POST 요청을 처리하는 예제입니다.

GET 요청

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

Future fetchPost() async {
  final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));

  if (response.statusCode == 200) {
    print('Response body: ${response.body}');
  } else {
    throw Exception('Failed to load post');
  }
}

POST 요청

Future createPost() async {
  final response = await http.post(
    Uri.parse('https://jsonplaceholder.typicode.com/posts'),
    headers: {
      'Content-Type': 'application/json; charset=UTF-8',
    },
    body: jsonEncode({
      'title': 'New Post',
      'body': 'This is the body of the new post',
      'userId': '1',
    }),
  );

  if (response.statusCode == 201) {
    print('Post created: ${response.body}');
  } else {
    throw Exception('Failed to create post');
  }
}

Routing 라이브러리

Dart와 Flutter의 라우팅은 애플리케이션 내에서 다른 페이지로 네비게이션하는 기능을 제공합니다. 라우팅을 처리하는 여러 라이브러리를 사용할 수 있으며, 그 중 fluro가 인기가 많습니다.

Fluro 라이브러리 예제

import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';

class MyRouter {
  static final FluroRouter router = FluroRouter();

  static void setupRouter() {
    router.define('/home', handler: Handler(handlerFunc: (BuildContext? context, Map> parameters) {
      return HomeScreen();
    }));

    router.define('/detail/:id', handler: Handler(handlerFunc: (BuildContext? context, Map> parameters) {
      return DetailScreen(id: parameters['id']!.first);
    }));
  }
}

결론

Dart는 다양한 라이브러리와 프레임워크를 통해 강력한 개발 환경을 제공합니다. 이 글에서는 Dart의 주요 라이브러리와 프레임워크를 소개하고, HTTP 및 라우팅 처리에 관한 예제를 제공했습니다. Dart를 통해 애플리케이션을 개발할 때 이러한 도구들을 활용하여 더욱 효율적이고 생산적인 개발을 할 수 있습니다.