{"id":27022560,"url":"https://github.com/devyhan/weatherlist","last_synced_at":"2025-04-04T20:37:47.130Z","repository":{"id":59964409,"uuid":"540336550","full_name":"devyhan/WeatherList","owner":"devyhan","description":"OpenWeather API를 활용한 Seoul, London, Chicago, 세 도시의 날씨를 표시합니다.","archived":false,"fork":false,"pushed_at":"2022-10-04T06:24:10.000Z","size":1033,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2023-03-10T09:49:23.163Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devyhan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-09-23T07:55:59.000Z","updated_at":"2022-09-23T08:08:33.000Z","dependencies_parsed_at":"2023-01-19T05:00:58.757Z","dependency_job_id":null,"html_url":"https://github.com/devyhan/WeatherList","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devyhan%2FWeatherList","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devyhan%2FWeatherList/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devyhan%2FWeatherList/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devyhan%2FWeatherList/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devyhan","download_url":"https://codeload.github.com/devyhan/WeatherList/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247249463,"owners_count":20908209,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-04T20:37:46.588Z","updated_at":"2025-04-04T20:37:47.124Z","avatar_url":"https://github.com/devyhan.png","language":"Swift","readme":"# WeatherList\n\n  ## Requirements\n  - Seoul, London, Chicago, 세 도시의 날씨를 표시하는 앱이에요. \n  - 위 도시 순서대로 오늘을 포함한 6일 간의 날씨를 표시해주세요.\n  - 총 3개 도시의 각 6일간의 날씨를 한 화면에 표시해주세요.\n\n---\n\n  ## Useage\n  \n  ```\n  $ pod install \u0026\u0026 xed .\n  ```\n  \n  WeatherList/WeatherList/Resources 해당 경로에 [Secrets.plist](https://drive.google.com/file/d/1EYT646D6XW0T6u8ksDMu55wFJR3IuL50/view?usp=sharing)를 다운받아 추가 해주어야 합니다.\n\u003e WeatherList PROJECT \u003e Build Phases \u003e Copy Bundle Resources에 Secrets.plist가 잡혀야 합니다.\n    \n  ## Libraries\n  |Name|Description|\n  |---|---|\n  |SnapKit|Auto Layout을 쉽게 만듭니다.|\n  |RxSwift|관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 구성하기 위한 라이브러리입니다.|\n  |RxCocoa|Cocoa Framework에 Rx기능을 합친 RxSwift 래퍼 입니다.|\n  |RxDataSources|테이블뷰와 컬렉션뷰의 DataSource 오브젝트 관리를 쉽게 관리하도록 합니다.|\n  |RxAppState|View Controller 의 Life Cycle 이벤트를 관찰할 수 있도록 합니다.|\n  |RxTest|RxSwift의 스트림들을 테스트 할 수 있고 가상 시간을 함께 이벤트를 발생시킬 수 있도록 합니다.|\n  |RxNimble/RxTest|Nimble의 expect라는 함수로 명료하게 테스트를 할 수 있도록 합니다.|\n\n  \u003e RxTest, RxNimble은 Project의 Tests target에서만 사용(import) 할 수 있도록 pod file에 명시합니다.\n \n  ## Project\n\n  \u003cimg src=\"./GithubResources/structure.png\" width=\"500px\" height=\"300px\" title=\"Github_Logo\"/\u003e\n\n  *CleanArchitecture + MVVM(I/O pattern)*\n\n  ### Presentation Layer\n  - View, ViewModel이 포함되며 ViewModel의 Input Output을 통해 ViewController와 상호작용합니다.\n  \n  ### Domain Layer\n  - 가장 안쪽의 Layer로 외부 Layer의 구현을 모르는 순수한 Business logic(Domain UseCase, Entities)가 포함됩니다. 또한 Data Layer에서 받아온 Entitiy를 Domain Model로 변환해줄 수 있는 Mapper인 Translator가 존재합니다.\n\n  ### Data Layer\n  - Domain UseCase의 실질적인 Implementation가 존재하며 하나 이상의 Repositories 포함됩니다. 또한 데이터를 전달할 때 Data Transfer Objects(DTO)를 사용하여 JSON의 response를 Entity로 변환합니다.\n\n \u003e 각 Layer의 Dependency는 Podspec File에 정의되어 Target으로 분리되어 있습니다.\n\n  ### etc..\n\n   ### App\n   - App의 시작점인 @main, Project Resourcesr가 포함됩니다.\n   \n   ### Utils \n   - Namespace, Extension등이 포함됩니다.\n\n   ### Infrastructure\n   - Network통신을 위한 Implementation가 포함됩니다.\n   \n   ### Container\n   - Dependency Injection Container가 포함되며, PropertyWrapper를 통한 Injected Wrapper가 존재합니다.\n\n   ### Test(Unit Test)\n   - ViewModel의 로직을 검증하 기존 코드의 유효성을 검증하며, 코드 추가시에 발생할 수 있는 사이드 이팩트를 줄일 수 있는 Test Case들이 포함됩니다.\n\n  ## Tree\n\n```\nWeatherList\n├── App\n│   └── AppDelegate.swift\n└── Resources\n    ├── Assets.xcassets\n    │   ├── AccentColor.colorset\n    │   │   └── Contents.json\n    │   ├── AppIcon.appiconset\n    │   │   └── Contents.json\n    │   ├── Contents.json\n    │   └── icons\n    │       ├── 01.imageset\n    │       │   ├── 01.svg\n    │       │   └── Contents.json\n    │       ├── 02.imageset\n    │       │   ├── 02.svg\n    │       │   └── Contents.json\n    │       ├── 03.imageset\n    │       │   ├── 03.svg\n    │       │   └── Contents.json\n    │       ├── 04.imageset\n    │       │   ├── 04.svg\n    │       │   └── Contents.json\n    │       ├── 09.imageset\n    │       │   ├── 09.svg\n    │       │   └── Contents.json\n    │       ├── 10.imageset\n    │       │   ├── 10.svg\n    │       │   └── Contents.json\n    │       ├── 11.imageset\n    │       │   ├── 11.svg\n    │       │   └── Contents.json\n    │       ├── 13.imageset\n    │       │   ├── 13.svg\n    │       │   └── Contents.json\n    │       ├── 50.imageset\n    │       │   ├── 50.svg\n    │       │   └── Contents.json\n    │       ├── Contents.json\n    │       └── na.imageset\n    │           ├── Contents.json\n    │           └── na.svg\n    ├── Base.lproj\n    │   └── LaunchScreen.storyboard\n    ├── ChicagoFiveDays.json\n    ├── Info.plist\n    ├── LondonFiveDays.json\n    ├── Secrets.plist\n    └── SeoulFiveDays.json\n\nModules\n├── Container\n│   ├── Container\n│   │   ├── Container.h\n│   │   └── Sources\n│   │       ├── DI\n│   │       │   └── DependencyInjection.swift\n│   │       └── InjetedPropertyWrapper.swift\n│   └── Container.podspec\n├── Data\n│   ├── Data\n│   │   ├── Data.h\n│   │   └── Sources\n│   │       ├── Entities\n│   │       │   └── FiveDaysWeatherDTO.swift\n│   │       ├── Mock\n│   │       │   ├── LondonFiveDays.json\n│   │       │   └── MockFetchWeatherList.swift\n│   │       ├── Translator\n│   │       │   └── FiveDaysWeatherTranslator.swift\n│   │       └── UseCase\n│   │           └── FetchWeatherListImpl.swift\n│   └── Data.podspec\n├── Domain\n│   ├── Domain\n│   │   ├── Domain.h\n│   │   └── Sources\n│   │       ├── Entities\n│   │       │   └── FiveDaysWeather.swift\n│   │       └── UseCases\n│   │           └── FetchWeatherList.swift\n│   └── Domain.podspec\n├── Infrastructure\n│   ├── Infrastructure\n│   │   ├── Infrastructure.h\n│   │   └── Sources\n│   │       ├── GetSecrets\n│   │       │   └── GetSecrets.swift\n│   │       ├── Mocking\n│   │       │   └── MockClient.swift\n│   │       └── Networking\n│   │           ├── APIClient\n│   │           │   └── APIClient.swift\n│   │           ├── HTTPMethod.swift\n│   │           └── RequestBuilder\n│   │               └── RequestBuilder.swift\n│   └── Infrastructure.podspec\n├── Presentation\n│   ├── Presentation\n│   │   ├── Presentation.h\n│   │   └── Sources\n│   │       ├── View\n│   │       │   └── WeatherListCell.swift\n│   │       ├── ViewController\n│   │       │   └── WeatherListVC.swift\n│   │       └── ViewModel\n│   │           └── WeatherListVM.swift\n│   └── Presentation.podspec\n└── Utils\n    ├── Utils\n    │   ├── Sources\n    │   │   ├── Extension.swift\n    │   │   └── URLBuilder\n    │   │       ├── Components\n    │   │       │   ├── CombinedComponent.swift\n    │   │       │   ├── EmptyComponent.swift\n    │   │       │   ├── Host.swift\n    │   │       │   ├── Path.swift\n    │   │       │   ├── Query.swift\n    │   │       │   ├── Scheme.swift\n    │   │       │   └── URLComponent.swift\n    │   │       └── RURLBuilder.swift\n    │   └── Utils.h\n    └── Utils.podspec\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevyhan%2Fweatherlist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevyhan%2Fweatherlist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevyhan%2Fweatherlist/lists"}