본문 바로가기
Flutter

TODO App 만들어 보기

by hyoungbin 2023. 11. 2.

작업 진행

1. 폴더 구조 잡기

 

 

// baseURI -> 서버 주소 + 포트
// endPoint -> 미리 정의
// 자신에 IP 주소 입력 해야 함 - 192.168.0.22
const baseUri = 'http://192.168.0.22:80';
const pathUser = '/user';
const epSignUp = '$pathUser/sign-up';
const epSignIn = '$pathUser/sign-in';

const pathTodo = '/todos';
const epTodoList = '$pathTodo/all';
const epTodoById = '$pathTodo/{id}';
const epTodoCreate = '$pathTodo/create';

 

class UserDto {
  String email;
  String password;

  UserDto({required this.email, required this.password});

  @override
  String toString() {
    return 'UserDto{email: $email, password: $password}';
  }
}

 

import 'package:class_my_todo_v1/models/entity/user_entity.dart';

import '../../models/dto/user_dto.dart';

abstract class UserRepository {
  UserEntity signIn(UserDto userDto);
  void signUp();
}

 

// 단위 테스트 작성 해보기

import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository_impl.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('회원 관리 도메인 테스트', () {
    test('사용자 로그인 테스트', () async {
      // given
      UserRepository userRepository = UserRepositoryImpl();
      UserDto userDto =
          UserDto(email: 'hong@example.com', password: 'hong1234');

      // when
      UserEntity userEntity = await userRepository.signIn(userDto);

      // then
      expect(userEntity, isA<UserEntity>()); // 데이터 타입이 UserEntity 확인
      expect(userEntity.username, '홍길동');
    });
  });
}

 

 

// 단위 테스트 작성 해보기

import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository_impl.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('회원 관리 도메인 테스트', () {
    test('사용자 로그인 테스트', () async {
      // given
      UserRepository userRepository = UserRepositoryImpl();
      UserDto userDto =
          UserDto(email: 'hong@example.com', password: 'hong1234');
      // when
      UserEntity userEntity = await userRepository.signIn(userDto);

      // then
      expect(userEntity, isA<UserEntity>()); // 데이터 타입이 UserEntity 확인
      expect(userEntity.username, '홍길동');
    });
  });
}

 


 

class UserEntity {
  int userId;
  String username;
  String email;

  UserEntity(
      {required this.userId, required this.username, required this.email});

  @override
  String toString() {
    return 'UserEntity{userId: $userId, username: $username, email: $email}';
  }

  // 변환 기능 추가
  // factory 메서드 활용
  factory UserEntity.fromJson(Map<String, dynamic> json) {
    return UserEntity(
      userId: json['userId'] as int,
      username: json['username'] as String,
      email: json['email'] as String,
    );
  }
}

 

class UserDto {
  String? username;
  String email;
  String password;

  UserDto({required this.email, required this.password, this.username});

  Map<String, dynamic> toJson() {
    return {'email': email, 'password': password, 'username': username ?? ''};
  }

  @override
  String toString() {
    return 'UserDto{email: $email, password: $password}';
  }
}

 

import 'package:class_my_todo_v1/models/entity/user_entity.dart';

import '../../models/dto/user_dto.dart';

abstract class UserRepository {
  Future<UserEntity> signIn(UserDto userDto);
  Future<int> signUp(UserDto userDto);
}

 

import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/shared/api.dart';
import 'package:class_my_todo_v1/shared/http.dart';
import 'package:dio/dio.dart';

// 싱글톤 처리
class UserRepositoryImpl implements UserRepository {
  UserRepositoryImpl._single();

  // 외부에서 접근할 수 있는 변수를 static 처리
  static final UserRepositoryImpl _instance = UserRepositoryImpl._single();

  // 1 dart 언어에서 factory 키워드 - 생성자, 메서드
  // factory 생성자 - 매번 클래스에인스턴스를 같은 녀셕으로 반환 처리
  factory UserRepositoryImpl() {
    return _instance;
  }

  @override
  Future<UserEntity> signIn(UserDto userDto) async {
    try {
      // 사용자의 정보 요청 -> GET( 보안상에 이유로 POST 처리)
      // BaseURI + epSignUp
      // http://192.168.0.22:80/user/sign-in

      // userDto --> json 문자열 형식
      // dio -> 이 처리를 하기 위해서 규칙 --> DTO 안에 toJson 메서드를 구현해 놓아야 한다.
      Response response = await dio.post(epSignIn, data: userDto);

      print(response.headers['Authorization']); // token 확인
      print(response.data); // body 영역 데이터 확인
      print(response.toString()); //response 전체 확인
      return UserEntity.fromJson(response.data);
    } catch (e) {
      return UserEntity(userId: -1, username: '', email: '');
    }
  }

  @override
  Future<int> signUp(UserDto userDto) {
    // TODO: implement signUp
    throw UnimplementedError();
  }
}

 

 

테스트

// 단위 테스트 작성 해보기

import 'package:class_my_todo_v1/models/dto/user_dto.dart';
import 'package:class_my_todo_v1/models/entity/user_entity.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository.dart';
import 'package:class_my_todo_v1/repository/remote/user_repository_impl.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('회원 관리 도메인 테스트', () {
    test('사용자 로그인 테스트', () async {
      // given
      UserRepository userRepository = UserRepositoryImpl();
      UserDto userDto =
          UserDto(email: 'hong@example.com', password: 'hong1234');
      // when
      UserEntity userEntity = await userRepository.signIn(userDto);

      // then
      expect(userEntity, isA<UserEntity>()); // 데이터 타입이 UserEntity 확인
      expect(userEntity.username, '홍길동');
    });
  });
}

'Flutter' 카테고리의 다른 글

용어 정리 - 1  (0) 2023.11.02
테스트 종류  (0) 2023.11.02
Flutter - RiverPod 이란  (0) 2023.11.01
theme 적용하기  (0) 2023.11.01
JWT 구축 하기  (0) 2023.10.30