본문 바로가기

Flutter

[Flutter] 채팅앱 만들기 #1

What to do?

UserService를 만들고, Test 코드 작성하기


Reference

 

아래 영상을 따라서 만들어보았다.


개발환경 세팅하기

 

지난번 포스팅으로 대체한다.

 

[Flutter] 개발환경 세팅하기

Install Flutter flutter 홈페이지에서 flutter 다운로드 다운로드 받은 파일의 압축을 풀기 압축을 풀면 bin파일이 있는데, 이후 해당 파일 경로를 환경변수에 등록해야 함 시스템 환경변수 편집에 들어

sddkarma.tistory.com


pubspec.yaml

 

pubspec.yaml파일에서 아래 코드를 수정

  • null-safety 관련해서 문법 오류가 발생해서 sdk 버전을 수정
  • rethinkdb 라이브러리를 사용하기 위해 dependencies 코드 수정
environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  rethinkdb_dart: ^2.3.2+6

pubspec.yaml


User

 

model/user.dart

class User {
  // getter
  String get id => _id;

  // field
  String _id;
  String username;
  String photoUrl;
  bool active;
  DateTime lastSeen;

  // constructor
  User({
    @required this.username,
      @required this.photoUrl,
      @required this.active,
      @required this.lastSeen,
  });

  // class → json
  toJson()=>{
    'username':username,
    'photo_url':photoUrl,
    'active':active,
    'last_seen':lastSeen,
  };

  // json → class
  factory User.fromJson(Map<String, dynamic> json){
    final user = User(
      username: json['username'],
      photoUrl: json['photo_url'],
      active: json['active'],
      lastSeen: json['last_seen']
    );
    user._id = json['id'];
    return user;
  }
}

UserService

 

service/user_service_interface.dart

  • connect : 유저가 채팅 서비스에 접속
  • online : 현재 접속중인 유저 리스트 반환
  • disconnect : 유저가 채팅서비스에서 나감
abstract class IUserService {
  Future<User> connect(User user);
  Future<List<User>> online();
  Future<void> disconnect(User user);
}

 

service/user_serivce.dart

  • 위에서 만든 class를 implement
  • connect : 유저를 데이터베이스 추가
  • disconnect : 유저의 active 필드를 false로 변경 후, connection 종료
  • online : active 필드가 true인 user list 반환
class UserService implements IUserService {
  final Rethinkdb _db;
  final Connection _connection;

  UserService(this._db, this._connection);

  @override
  Future<User> connect(User user) async {
    var data = user.toJson();
    if (user.id != null) data['id'] = user.id;
    final result = await _db.table('users').insert(data, {
      'conflict': 'update',
      'return_changes': true,
    }).run(_connection);
    return User.fromJson(result['changes'].first['new_val']);
  }

  @override
  Future<void> disconnect(User user) async {
    await _db.table('user').update({'id':user.id, 'active':false, 'last_seen':DateTime.now()}).run(_connection);
    _connection.close();
  }

  @override
  Future<List<User>> online() async {
    Cursor cursor = await _db.table('users').filter({'active':true}).run(_connection);
    final users = await cursor.toList();
    return users.map((u)=>User.fromJson(u)).toList();
  }
}

Test

 

test/helper.dart

  • createDatabase
    • test라는 데이터베이스 생성
    • users라는 테이블 생성
  • cleanDatabase
    • users라는 테이블 제거
Future<void> createDatabase(Rethinkdb db, Connection connection) async{
  await db.dbCreate('test').run(connection).catchError((err)=>{});
  await db.tableCreate('users').run(connection).catchError((err)=>{});
}

Future<void> cleanDatabase(Rethinkdb db, Connection connection) async{
  await db.table('users').delete().run(connection);
}

void main(){
  Rethinkdb _db = Rethinkdb();
  Connection _connection;
  UserService sut;

  setUp(() async {
    _connection = await _db.connect(host:"127.0.0.1", port: 28015);
    await createDatabase(_db, _connection);
    sut = UserService(_db, _connection);
  });
  
  tearDown(() async {
    await cleanDatabase(_db, _connection);
  });

  test('create new user and its id is not empty', () async {
    final user = User(
      username:'test username',
      photoUrl: 'test photo url',
      active: true,
      lastSeen: DateTime.now()
    );
    final userWithId = await sut.connect(user);
    expect(userWithId.id, isNotEmpty);
  });
}

Docker Container

 

  • Docker Desktop을 설치

 

  • Docker Container 삭제
docker container prune

 

  • Docker rethinkdb Container 실행
docker run -d -p 8080:8080 -p 28015:28015 rethinkdb

 

  • 현재 실행중인 컨테이너 출력
docker ps

 

rethink db 컨테이너가 잘 떠 있으면, 브라우져에서 127.0.0.1:8080로 접속하면 다음과 같은 대쉬보드가 나온다. 

1277.0.0.1:8080


테스트는 성공적으로 된다.

 

'Flutter' 카테고리의 다른 글

[Flutter] 채팅앱 만들기 #5  (0) 2023.03.04
[Flutter] 채팅앱 만들기 #4  (0) 2023.03.01
[Flutter] 채팅앱 만들기 #3  (0) 2023.03.01
[Flutter] 채팅앱 만들기 #2  (0) 2023.03.01
[Flutter] 개발환경 세팅하기  (0) 2023.02.25