파머스핸즈 앱
송아지 질병관찰 크로스플랫폼(iOS, Android) 모바일 앱입니다.
각 하위 폴더들의 README.md를 참고해주세요.
플레이스토어 링크
앱스토어 링크
목차
개발 환경을 변경하는 방법
기본적으로 develop 브랜치에서 개발을 진행하시면 되며 test, prod 브랜치상에서 코드 수정은 하지 않는 것이 좋습니다.
개발환경은 git checkout을 먼저 한 후 amplify env를 바꿔주어야 합니다.
develop 브랜치에는 amplify dev 환경만 존재합니다.
test 브랜치에는 amplify dev, test 환경만 존재합니다.
prod 브랜치에는 amplify dev, test, prod 환경 모두 존재합니다.
# git 브랜치 변경
$ git checkout <develop | test | prod>
# amplify 환경 변경
$ amplify env checkout <dev | test | prod>
Git 병합하는 방법
상용앱에 배포하기 전에는 브랜치 병합이 필요합니다.

develop -> test
test -> prod
prod -> master 순으로 병합을 진행하시면 되고 master 브랜치는 병합을 하지 않아도 문제는 없습니다.
병합시 team-provider-info.json 충돌이 발생할 경우
amplify push를 하면 team-provider-info.json 파일의 내용이 변경됩니다.
또는 기타 이유로 병합시 충돌이 날 수 있을텐데 현재 브랜치의 변경사항만 가져오면 됩니다.
예를 들어, develop 브랜치에서 test 브랜치로 병합을 할 경우 test 브랜치의 team-provider-info.json 내용만을 취하면 됩니다.
test 브랜치에서 prod 브랜치로 병합할때는 prod 브랜치의 team-provider-info.json을 취하면 되겠죠.
Amplify 코드 수정후 배포하는 방법
develop 브랜치에서 amplify 코드를 수정하고 amplify push를 입력합니다.
그럼 team-provider-info.json 파일 내용이 변경될텐데 변경사항을 해당 브랜치에 커밋하시면 됩니다.
예를 들어, dev, test, prod 모든 환경에 배포를 하는 경우를 가정해보겠습니다.
git checkout develop && amplify env checkout dev명령어로 개발 환경으로 전환합니다.- develop 브랜치에서 코드를 수정합니다.
- 변경사항을 커밋합니다.
amplify push로 배포합니다.team-provider-info.json파일의 내용이 변경될텐데 해당 변경사항도 커밋합니다.git checkout test && amplify env checkout test명령어로 테스트 환경으로 전환합니다.git merge develop --no-ff명령어로 develop 브랜치를 test 브랜치에 병합합니다. (이때team-provider-info.json충돌이 난다면 test 브랜치의team-provider-info.json의 내용을 취합니다.)amplify push로 배포합니다.team-provider-info.json내용이 변경될텐데 해당 변경사항을 test브랜치에 커밋합니다.git checkout prod && amplify env checkout prod명령어로 상용 환경으로 전환합니다.git merge test --no-ff명령어로 test 브랜치를 prod 브랜치에 병합합니다.amplify push로 배포합니다.team-provider-info.json내용이 변경될텐데 해당 변경사항을 prod브랜치에 커밋합니다.- (선택사항)
git checkout master && git merge prod --no-ff명령어로 prod 브랜치를 master에 병합합니다.
앱 배포하는 방법
배포 스크립트는 프로젝트 루트에 위치한 deploy.sh에 작성되어있습니다.
$ <PROJECT_ROOT>/deploy.sh
이 파일을 실행시키면 dist/ 디렉토리에 각 환경별 .aab 파일과 .xcarchive 파일이 생성됩니다.
디렉토리 구조
project
│ pubspec.yaml
│ package.json
│ deploy.sh
│ flutter_launcher_icons-envDev.yaml
│ flutter_launcher_icons-envProd.yaml
│ flutter_launcher_icons-envTest.yaml
│
└───amplify
│ │ team-provider-info.json
│ └───backend
│ └───api
│ └───FarmersHandsClientAPI
│ └───auth
│ └───function
│ └───farmershandsuserappc02bf2d8
│ │ tsconfig.json
│ │
│ └───src
│ └───ts-src
│ └───routes
│ │ app.ts
│ │ index.ts
│ │ utils.ts
│ │ package.json
│ │
│ └───api
│ │ cow_data.ts
│ │ cow_group.ts
│ │ cows.ts
│ │ disease_observations.ts
│ │ engagement.ts
│ │ farms.ts
│ │ index.ts
│ │ reports.ts
│ │ user.ts
│
└───android
│ │ build.gradle
│ │ key.properties
│ │ local.properties
│ │
│ └───app
│ │ build.gradle
│ │ google-services.json
│ │ key.jks
│ │
│ └───src
│ │
│ └───main
│ │ AndroidManifest.xml
│
└───assets
│ └───icons
│ └───images
│ └───vectors
│
└───google_fonts
│
│
└───ios
│ │ Runner.xcodeproj
│ │ Runner.xcworkspace
│ │
│ └───Flutter
│ │
│ └───Runner
│
└───lib
│ app_entry.dart
│ main.dart
│ main_dev.dart
│ main_test.dart
│ notifications.dart
│
└───components
│
└───events
│
└───extensions
│
└───interfaces
│
└───models
│
└───screen_arguments
│
└───screens
│
└───services
│
└───stores
│
└───types
│
└───utils
│
└───views
Libraries
- account_subscreen
- action_type
- add_cows_to_cow_group_popup
- alert_popup
- amplifyconfiguration
- api_service
- app_config
- app_constants
- app_entry
- app_state
- bar_day_data
- bar_graph
- bar_graph_painter
- bar_graph_ylabel_painter
- bar_hour_data
- base_popup
- base_report_card
- bcs_type
- chat_list_subscreen
- chat_list_subscreen_arguments
- chat_list_subscreen_vm
- chat_message
- chat_message_bubble_view_me
- chat_message_bubble_view_you
- chat_screen
- chat_screen_vm
- checkbox_form_view
- circle_image_view
- common_app_bar
- confirm_popup
- constants
- copy_cows_to_other_group_popup
- cow
- cow_current_status_data_table_expanded_row
- cow_current_status_data_table_expanded_row_painter
- cow_current_status_screen
- cow_current_status_screen_vm
- cow_data
- cow_data_band_value
- cow_data_day
- cow_data_hour
- cow_data_value
- cow_detail_screen
- cow_detail_screen_arguments
- cow_detail_screen_vm
- cow_group
- cow_group_management_subscreen
- cow_group_state
- cow_history_subscreen
- cow_management_subscreen
- cow_settings_screen
- cow_settings_screen_vm
- cow_state
- cow_status
- cow_status_distribution_column_view
- cow_status_distribution_view
- cow_status_type
- create_new_cow_group_popup
- create_new_cow_popup
- custom_colors
- custom_data_table
- custom_data_table_type
- custom_refresher
- custom_scrollbar
- data_table_cell
- data_table_column
- data_table_row
- datetime_picker_screen
- datetime_picker_screen_arguments
- desc_dropdown_view
- desc_text_view
- desc_textfield_view
- device_management_subscreen
- disease_observation
- disease_observation_create_screen
- disease_observation_create_screen_arguments
- disease_observation_create_screen_vm
- disease_observation_list_screen
- disease_observation_list_screen_vm
- doctor
- dropdown_form_view
- empty_screen
- event_handler
- event_service
- farm
- farm_info_screen
- farm_info_screen_vm
- farm_input_code_screen
- farm_input_code_screen_vm
- farm_loading_screen
- farm_loading_screen_vm
- farm_management_subscreen
- farm_select_screen
- farm_select_screen_vm
- farm_state
- feedback_type
- find_password_screen
- find_password_screen_vm
- find_username_screen
- find_username_screen_vm
- gateway
- gateway_management_subscreen
- gateway_need_check_report_card
- gateway_popup
- gateway_state
- generated_plugin_registrant
- graph_avg_type
- graph_view_type
- graph_ylabel_text
- grid_sub_view
- group_list_view
- header_text_view
- header_view
- header_view
- header_view
- health_doubt_report_card
- health_doubt_subscreen
- helper
- home_screen
- home_screen_vm
- ic_circle_grey_info
- input_mode_type
- iterable
- juso
- juso_point
- juso_returns
- juso_service
- juso_vm
- large_header_view
- linear_progress_bar
- linear_progress_bar_painter
- loading_popup
- loading_view
- log_constants
- log_manager
- main
- main_circle_view
- main_dev
- main_screen
- main_test
- move_cows_to_other_cow_group_popup
- need_check_subscreen
- no_animation_tab_controller
- no_glow_scroll_behavior
- notification_management_subscreen
- notification_service
- numeric_constants
- odd_action_report_card
- odd_action_subscreen
- phone_auth_resend_screen
- phone_auth_resend_screen_vm
- phone_auth_screen
- phone_auth_screen_arguments
- phone_auth_screen_vm
- phone_number_formatter
- photo_view_screen
- photo_view_screen_arguments
- popup_action
- popup_events
- popup_impl
- popup_screen
- popup_screen_arguments
- popup_subname_view
- popup_title_view
- popup_type
- preference
- prefs_constants
- remove_cow_group_popup
- remove_cow_groups_popup
- remove_cow_popup
- remove_cows_from_cow_group_popup
- report
- report_card_count_item_view
- report_card_count_view
- report_card_desc_text_view
- report_card_input_memo_view
- report_card_list_title_view
- report_card_list_view
- report_card_title_text_view
- report_card_view_vm
- report_events
- report_group
- report_header_view
- report_screen
- report_screen_arguments
- report_screen_vm
- report_state
- report_title
- report_type
- root_report_card_view
- round_container_view
- screen_impl
- scroll_state
- search_cow_action
- search_cow_events
- search_cow_result
- search_cow_screen
- search_cow_screen_vm
- search_juso
- search_result_list_item_view
- search_result_list_view
- search_textfield_view
- select_date_view
- self_diagnosis
- self_diagnosis_screen
- sensor
- sensor_management_subscreen
- sensor_popup
- sensor_removal_report_card
- sensor_state
- settings_screen
- settings_screen_vm
- settings_subscreen
- signin_screen
- signin_screen_vm
- signup_screen
- signup_screen_vm
- software_management_subscreen
- splash_screen
- stack_data
- stat_item_view
- stateful_widget_template
- stateless_widget_template
- string_constants
- text_form_view
- update_cow_popup
- user
- user_info_screen_vm
- user_info_subscreen
- user_list_subscreen
- user_state
- validators
- weather_service
- webview_screen
- webview_screen_arguments
- worker
- converting_methods Models
- 모델파일에서 json 파싱이 이루어질때 기본 자료형(String, int)이 아닌 경우 커스텀 컨버팅 함수들을 정의해놓았습니다.