Dart는 주로 프론트엔드 개발에 많이 사용되지만, 서버 사이드 개발에서도 강력한 기능을 제공합니다.
서버와 데이터베이스를 연동할 때 ORM(Object-Relational Mapping) 도구를 사용하면 데이터베이스 작업을 더 쉽고 효율적으로 처리할 수 있습니다.
이번 블로그에서는 Dart의 Aqueduct ORM을 사용하여 데이터베이스와 연동하는 방법을 초보자도 쉽게 이해할 수 있도록 설명하겠습니다.
1. Aqueduct ORM이란?
Aqueduct는 Dart 언어로 작성된 서버 사이드 프레임워크로, ORM 기능을 제공하여 데이터베이스와 객체 간의 매핑을 쉽게 처리할 수 있게 해줍니다.
Aqueduct는 데이터베이스와의 상호작용을 단순화하고, RESTful API를 쉽게 구축할 수 있도록 돕습니다.
2. Aqueduct ORM 설치 및 설정
2.1 Aqueduct 설치
Aqueduct를 사용하려면 먼저 Aqueduct 패키지를 설치해야 합니다. 다음 명령어를 터미널에 입력하여 Aqueduct를 설치합니다.
pub global activate aqueduct
설치가 완료되면 aqueduct 명령어를 사용할 수 있습니다.
2.2 프로젝트 생성
Aqueduct를 사용하여 새로운 프로젝트를 생성합니다.
aqueduct create my_project
cd my_project
위 명령어는 my_project라는 새 Aqueduct 프로젝트를 생성하고, 해당 프로젝트 디렉터리로 이동합니다.
2.3 데이터베이스 설정
프로젝트의 config.yaml 파일을 열어 데이터베이스 설정을 구성합니다. PostgreSQL을 예로 들면 다음과 같습니다.
database:
host: localhost
port: 5432
username: my_user
password: my_password
databaseName: my_database
- host: 데이터베이스 서버 주소
- port: 포트 번호
- username: 데이터베이스 사용자 이름
- password: 데이터베이스 비밀번호
- databaseName: 데이터베이스 이름
3. Aqueduct ORM 사용하기
3.1 모델 정의
모델은 데이터베이스 테이블과 매핑되는 Dart 클래스를 정의합니다.
예를 들어, User 모델을 정의해 보겠습니다.
lib/model/user.dart 파일을 생성하고 다음과 같이 작성합니다.
import 'package:aqueduct/aqueduct.dart';
class User extends ManagedObject<_User> implements _User {}
class _User {
@primaryKey
int id;
String name;
String email;
}
- ManagedObject: Aqueduct의 기본 데이터베이스 모델 클래스입니다.
- @primaryKey: 데이터베이스의 기본 키를 나타냅니다.
3.2 컨트롤러 작성
컨트롤러는 HTTP 요청을 처리하고 데이터베이스와 상호작용하는 역할을 합니다.
lib/controller/user_controller.dart 파일을 생성하고 다음과 같이 작성합니다.
import 'package:aqueduct/aqueduct.dart';
import '../model/user.dart';
class UserController extends ResourceController {
UserController(this.context);
final ManagedContext context;
@Operation.get()
Future<Response> getAllUsers() async {
final userQuery = Query<User>(context);
final users = await userQuery.fetch();
return Response.ok(users);
}
@Operation.post()
Future<Response> createUser() async {
final user = User()
..read(await request.body.decode(), ignore: ["id"]);
final query = Query<User>(context)
..values = user;
final insertedUser = await query.insert();
return Response.ok(insertedUser);
}
}
- ResourceController: Aqueduct의 기본 컨트롤러 클래스를 상속합니다.
- context: 데이터베이스와 상호작용할 수 있는 ManagedContext 인스턴스입니다.
- @Operation.get(): HTTP GET 요청을 처리합니다.
- @Operation.post(): HTTP POST 요청을 처리합니다.
3.3 라우트 설정
lib/channel.dart 파일을 열어 컨트롤러를 라우트에 등록합니다.
import 'package:aqueduct/aqueduct.dart';
import 'controller/user_controller.dart';
class Channel extends ApplicationChannel {
ManagedContext context;
@override
Future prepare() async {
final config = AppConfig(options['configFile'] as String, Environment.dev);
context = ManagedContext(
ManagedDataModel.fromCurrentMirrorSystem(),
PostgreSQLPersistentStore.fromConnectionInfo(
config.dbUsername,
config.dbPassword,
config.dbHost,
config.dbPort,
config.dbName,
),
);
}
@override
Controller get entryPoint {
final router = Router();
router.route('/users').link(() => UserController(context));
return router;
}
}
- Router: Aqueduct의 라우팅 기능을 제공합니다.
- router.route('/users'): /users 경로에 UserController를 연결합니다.
4. 애플리케이션 실행 및 테스트
애플리케이션을 실행하려면 다음 명령어를 입력합니다.
aqueduct db upgrade
aqueduct serve
- aqueduct db upgrade: 데이터베이스 스키마를 최신 상태로 업데이트합니다.
- aqueduct serve: 서버를 시작합니다.
서버가 시작되면, http://localhost:8888/users 경로에서 사용자 데이터를 조회하거나 추가할 수 있습니다.
Dart에서 Aqueduct ORM을 사용하면 데이터베이스와의 상호작용을 쉽게 처리할 수 있습니다.
Aqueduct는 데이터베이스 모델을 정의하고, 컨트롤러를 통해 HTTP 요청을 처리하며, 라우팅을 통해 API 엔드포인트를 설정할 수 있도록 도와줍니다.
이 블로그가 Dart에서 Aqueduct ORM을 사용하는 데 도움이 되었기를 바랍니다.
추가적인 질문이나 도움이 필요하시면 언제든지 말씀해 주세요!
구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Dart > Dart Server' 카테고리의 다른 글
[중급] Dart 서버 비동기 프로그래밍 심화/ Dart의 비동기 프로그래밍 심화 개념 (async/await, Future) (0) | 2024.09.11 |
---|---|
[중급] Dart 서버 데이터베이스 연동/ 간단한 데이터 모델링 및 쿼리 작성 (2) | 2024.09.11 |
[중급] Dart 서버 데이터베이스 연동/ Dart와 관계형 데이터베이스 연결 (PostgreSQL, MySQL 등) (1) | 2024.09.11 |
[중급] Dart 서버 프레임워크 이해하기/ 프레임워크를 이용한 구조화된 서버 개발 (2) | 2024.09.09 |
[중급] Dart 서버 프레임워크 이해하기/ 각 프레임워크의 설치 및 기본 사용법 (0) | 2024.09.09 |