• [Flutter] 운동 보조 앱 "헬생"

    2022. 2. 18.

    by. 안녕진

    Flutter를 처음 배운 상황에서 만들어본 앱이라, 생각처럼 술술 풀리진 않았지만 재밌게 만들었다.

    소개

    메인 화면

    • 앱에 접속할 때마다 리스트에 적힌 명언 중 하나가 랜덤으로 전시된다.

      운동하기 탭 (모드 선택 화면)

      알람기능 사용 모드 - 타이머를 설정하여, 세트 사이 휴식 중 시간이 되면 알람을 울림

      알람기능 사용 X

      운동 진행 화면

    • 종목을 입력하고, 무게(생략가능)를 입력한다.
    • 세트 시작 버튼을 누르고, 실제 운동을 진행한 뒤에 세트 종료를 클릭한다.
    • 횟수를 기록하는 텍스트필드가 전시되고, 동시에 그 시점부터 휴식시간이 카운트 된다.

      통계 화면

      종목별 통계 탭 - 기록된 운동들의 총 실시 횟수가 기록된다.

      기록별 통계 탭 - 운동 종료를 통해 기록한 운동들을 확인할 수 있다.

      기록별 통계 탭 상세보기 中 간단히 보기

    • 운동을 마친 시각을 기준으로 몇 분(며칠, 몇 달)전에 실시한 운동인지 기록된다.

      기록별 통계 탭 상세보기 中 자세히 보기

    • 우측 하단 FloatingActionButton을 클릭하면 휴식시간까지 함께 기록된 기록을 볼 수 있다.

    구현 방식

    언어, 라이브러리

    Dart언어의 Flutter라이브러리를 사용했다.
    Flutter 라이브러리는 android, ios, web 앱을 동시에 하나의 코드 베이스로 개발하도록 돕는다.
    내장된 머터리얼 디자인 등을 사용해 쉽게 예쁜 화면을 구성할 수 있었다.

    유저 데이터 저장

    기기 내의 주요 디렉토리 (Documents, 등등)를 쉽게 얻을 수 있게 도와주는 path_provider라는 라이브러리를 사용했다.
    앱 실행 후 디렉토리에 접근해 기존 유저 데이터 유무를 확인한 후, 1초 간격으로 데이터를 저장하는 메소드를 호출했다.

    배운 점

    1. 데이터 저장 관련

    데이터를 저장할 때, 1초마다 isChanged라는 User클래스의 bool 변수를 비교하여 true가 되면 저장하도록 했다.
    개발할 때에는 저장하는 메소드가 실행되지 않은 시점에서 강제 종료 등으로 데이터를 저장하지 못 할 경우를 대비하겠다고 1초마다 저장을 한 것이다.
    그런데 지금 와서 드는 생각은, 굳이 1초마다 비교 안하고 User클래스의 필드의 변경을 setter메소드로만 접근할 수 있도록 하고, setter가 실행될 때마다 파일에 저장하면 되겠다는 생각이 들었다.
    블로그에 글을 포스팅하는 것을 예로 들어보자.
    내가 타이핑하는 모든 것들이 변경시마다 저장되면 부하가 생길 수도 있다고 생각된다.
    하지만 내가 만든 앱 같이 유저가 운동시작/세트시작 등의 버튼을 클릭했을 때에만 변경하면 될 경우에는, 굳이 주기적으로 저장할 필요가 없었던 것이다...
    설계 없이 바로 개발하다 보니 깊게 생각을 못 했다.

    클래스 설계는 물론이고, 어떤 데이터를 파일에 저장해야하는지 등 프로젝트 전반적인 내용을 제대로 설계해놓는 것이 정말 중요하다는 것을 배웠다.

    2. 주석 달기

    주석을 똑바로 안 달았더니, 수정하기가 너무 어려웠다.
    주석 달아야 한다는 것을 머리로만 알고 있었는데, 주석은 필수라는 것을 뼈저리게 느꼈다.

    타인이 봐도 이해될 정도의 주석을 다는 것을 목표로 열심히 달아야겠다.

    3. 클래스, 변수, 함수명 신경쓰기

    제대로 된 설계 없이 시작했더니, 이름도 당연히 깊게 생각하지 않고 지었다.
    푸쉬업 같은 운동 자체를 말하는 클래스 Workout
    하루의 운동을 뜻하는 클래스 DailyWorkout
    현재 진행중인 운동을 말하는 변수 currentWorkout
    등 등..

    헷갈리지 않도록 명확하게 이름짓는 작업도 중요한 것 같다. (아니면 주석을 잘 달던가)

    댓글