Dart는 구글에서 개발한 오픈 소스 프로그래밍 언어로, 주로 웹과 모바일 애플리케이션 개발에 사용됩니다.
그러나 Dart는 서버 개발에서도 매우 유용합니다.
이 블로그에서는 초보자도 쉽게 따라 할 수 있도록 Dart를 사용하여 서버를 개발하는 방법을 단계별로 설명하고, 심화 사용법도 소개하겠습니다.
Dart란 무엇인가?
Dart는 간결하고 읽기 쉬운 문법을 가진 프로그래밍 언어입니다.
Dart의 주요 특징은 다음과 같습니다:
- 간결한 문법: 코드 작성이 쉽고 간결합니다.
- 정적 타입 언어: 코드의 안정성을 높여줍니다.
- 고성능: JIT(Just-In-Time) 및 AOT(Ahead-Of-Time) 컴파일을 지원하여 빠른 실행 속도를 제공합니다.
- 비동기 프로그래밍: async와 await 키워드를 통해 비동기 프로그래밍을 쉽게 처리할 수 있습니다.
Dart로 서버 개발하기
Dart로 서버를 개발하기 위해 주로 Shelf라는 프레임워크를 사용합니다.
Shelf는 간단하고 유연한 웹 서버를 만들 수 있게 해줍니다.
이제 Shelf를 사용하여 간단한 서버를 만들어 보겠습니다.
1. Dart SDK 설치
먼저, Dart SDK를 설치해야 합니다. Dart SDK는 Dart 공식 사이트에서 다운로드할 수 있습니다.
설치가 완료되면 dart와 pub 명령어를 사용할 수 있습니다.
2. 프로젝트 초기화
프로젝트를 생성하고 초기화합니다. 터미널(또는 명령 프롬프트)을 열고 다음 명령어를 입력합니다.
dart create -t console-full dart_server
cd dart_server
위 명령어는 dart_server라는 폴더를 생성하고, 기본적인 콘솔 애플리케이션 템플릿을 설정합니다.
3. 의존성 추가
프로젝트 폴더에 있는 pubspec.yaml 파일을 열어 shelf 패키지를 추가합니다.
name: dart_server
description: A simple Dart server
version: 1.0.0
environment:
sdk: '>=2.10.0 <3.0.0'
dependencies:
shelf: ^1.2.0
shelf_router: ^1.0.0
그리고 패키지를 설치합니다.
dart pub get
4. 기본 서버 작성
이제 bin 폴더 안에 server.dart 파일을 생성하고 다음과 같이 코드를 작성합니다.
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('/', (Request request) {
return Response.ok('Hello, Dart Server!');
});
router.get('/hello/<name>', (Request request, String name) {
return Response.ok('Hello, $name!');
});
final handler = const Pipeline()
.addMiddleware(logRequests())
.addHandler(router);
final server = await io.serve(handler, InternetAddress.anyIPv4, 8080);
print('Server listening on port ${server.port}');
}
이 코드는 간단한 웹 서버를 만듭니다. / 경로로 접속하면 "Hello, Dart Server!" 메시지를 반환하고, /hello/YourName 경로로 접속하면 "Hello, YourName!" 메시지를 반환합니다.
5. 서버 실행
서버를 실행하려면 다음 명령어를 사용합니다.
dart run bin/server.dart
이제 브라우저를 열고 http://localhost:8080에 접속하면 "Hello, Dart Server!" 메시지를 확인할 수 있습니다. http://localhost:8080/hello/YourName에 접속하면 "Hello, YourName!" 메시지가 표시됩니다.
심화 사용법
기본적인 서버 설정을 완료한 후, 조금 더 심화된 기능을 구현해 보겠습니다.
1. 미들웨어 추가
미들웨어는 요청이 처리되기 전에 실행되는 코드로, 로그를 남기거나 인증을 처리하는 데 사용됩니다.
위 코드에서 logRequests()는 요청 로그를 출력하는 미들웨어입니다.
다른 미들웨어를 추가하려면 Pipeline에 연결하면 됩니다.
final handler = const Pipeline()
.addMiddleware(logRequests())
.addMiddleware((innerHandler) {
return (request) async {
print('Request headers: ${request.headers}');
return await innerHandler(request);
};
})
.addHandler(router);
2. 데이터베이스 연동
Dart로 서버를 개발할 때 데이터베이스와 연동할 수 있습니다.
예를 들어, postgres 패키지를 사용하여 PostgreSQL 데이터베이스와 연결할 수 있습니다.
pubspec.yaml 파일에 의존성을 추가합니다.
dependencies:
shelf: ^1.2.0
shelf_router: ^1.0.0
postgres: ^2.4.1
그리고 패키지를 설치합니다.
dart pub get
데이터베이스 연결 코드를 추가합니다.
import 'package:postgres/postgres.dart';
void main() async {
final connection = PostgreSQLConnection(
'localhost', 5432, 'database_name',
username: 'username',
password: 'password',
);
await connection.open();
// 나머지 서버 코드...
}
3. 에러 처리
서버에서 발생하는 에러를 처리하는 것은 매우 중요합니다. Shelf에서는 미들웨어를 사용하여 에러를 처리할 수 있습니다.
final handler = const Pipeline()
.addMiddleware(logRequests())
.addMiddleware(handleErrors())
.addHandler(router);
Middleware handleErrors() {
return (innerHandler) {
return (request) async {
try {
return await innerHandler(request);
} catch (error, stackTrace) {
print('Error: $error\nStackTrace: $stackTrace');
return Response.internalServerError(
body: 'Internal Server Error',
);
}
};
};
}
결론
Dart는 클라이언트와 서버를 모두 동일한 언어로 개발할 수 있는 강력한 도구입니다.
Shelf와 같은 프레임워크를 사용하면 간단하고 효율적으로 서버를 구축할 수 있습니다.
이 가이드를 통해 기본적인 Dart 서버 개발부터 심화 기능 구현까지 다양한 방법을 배워보았습니다.
Dart의 간결한 문법과 강력한 비동기 처리 능력을 활용하여 고성능 서버 애플리케이션을 개발해 보세요.
Dart로 서버 개발을 시작해 보시겠습니까?
공식 문서와 다양한 튜토리얼을 참고하여 첫 걸음을 내딛어 보세요!
수발가족을 위한 일기장 “나비일기장”
https://play.google.com/store/apps/details?id=com.maccrey.navi_diary_release
구글플레이 앱 배포의 시작! 비공개테스트 20명의 테스터모집을 위한 앱 "테스터 쉐어"
https://play.google.com/store/apps/details?id=com.maccrey.tester_share_release
카카오톡 오픈 채팅방
'Flutter > Dart Language' 카테고리의 다른 글
Dart에서 클래스와 객체 이해하기 (0) | 2024.06.23 |
---|---|
Dart에서의 상속과 믹싱: extends, with, implements (0) | 2024.06.21 |
Dart에서 static 키워드: 궁금증 해결 가이드 (0) | 2024.06.21 |
객체의 속성 접근 및 제어: Getter와 Setter 완벽 가이드 (0) | 2024.06.21 |
Dart에서 객체 지향 프로그래밍: 클래스와 객체 심화 가이드 (0) | 2024.06.21 |