{"id":22147204,"url":"https://github.com/dev-junehee/swimz","last_synced_at":"2026-04-28T23:02:12.002Z","repository":{"id":246128048,"uuid":"814585104","full_name":"dev-junehee/swimz","owner":"dev-junehee","description":"수영하는 MZ들을 위한 스웸웨어 쇼핑 플랫폼","archived":false,"fork":false,"pushed_at":"2024-12-17T05:24:12.000Z","size":2809,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-29T17:34:05.532Z","etag":null,"topics":["ios","mvvm","openapi","realm","realmswift","swift","uikit","webkit"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dev-junehee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-13T09:45:33.000Z","updated_at":"2024-12-17T05:24:16.000Z","dependencies_parsed_at":"2024-06-26T02:31:41.467Z","dependency_job_id":"80cb582d-412e-455f-b3f2-f192788ac86f","html_url":"https://github.com/dev-junehee/swimz","commit_stats":null,"previous_names":["dev-junehee/meaning-out","dev-junehee/swimz"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-junehee%2Fswimz","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-junehee%2Fswimz/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-junehee%2Fswimz/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev-junehee%2Fswimz/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dev-junehee","download_url":"https://codeload.github.com/dev-junehee/swimz/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245268258,"owners_count":20587585,"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":["ios","mvvm","openapi","realm","realmswift","swift","uikit","webkit"],"created_at":"2024-12-01T23:14:41.150Z","updated_at":"2026-04-28T23:02:11.935Z","avatar_url":"https://github.com/dev-junehee.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🐬 스윔즈 (SwiMZ) - MZ들을 위한 스웸웨어 쇼핑 플랫폼\n\n\u003cbr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=180\" src=\"https://github.com/user-attachments/assets/a6b417d5-c83d-45bd-8744-7d3b61e51768\" /\u003e\n  \u003cbr /\u003e\u003cbr /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Swift-v5.1-F05138?logo=swift\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Xcode-v15.4-147EFB?logo=Xcode\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/iOS-15.0+-000000?logo=apple\" /\u003e\n\n\u003c/div\u003e\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n## 기획의도 (Intention)\n\u003e ### 수영하는 MZ들이 모이는 공간을 만들어보자!\n- \"혹시 수영복 어디에서 사세요?\", \"이 수영복 어떤 브랜드인가요?\"\n- 다양한 스윔웨어 브랜드를 한 눈에 모아보고 검색할 수 있는 플랫폼이 필요하다고 생각했습니다.\n- 스윔즈는 MZ세대를 위한 스윔웨어 쇼핑 플랫폼으로 다양한 스타일과 브랜드를 쉽게 검색하고 비교 할 수 있는 공간입니다.\n- 트렌드에 민감한 MZ들을 위해 맞춤형 스윔웨어 검색 결과를 통해 새로운 쇼핑 경험을 제공합니다.\n\n\u003cbr /\u003e\n\n## 프로젝트 소개 (Description)\n\u003e **개발 기간** : 2024. 06. 13 ~ 2024. 06. 18 (약 6일)\u003cbr /\u003e\n\u003e **개발 인원** : 1명 (기획·디자인·개발)\u003cbr /\u003e\n\u003e **최소 버전** : iOS 15.0+\u003cbr /\u003e\n\u003e **지원 모드** : 세로 모드, 라이트 모드\n\n\u003cbr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=\"19%\" src=\"https://github.com/user-attachments/assets/703d3e3f-1534-4af4-9916-a0065f3e566c\" /\u003e\n  \u003cimg width=\"19%\" src=\"https://github.com/user-attachments/assets/2d3a5d8b-f926-4d15-98c9-d06ef000ae38\" /\u003e\n  \u003cimg width=\"19%\" src=\"https://github.com/user-attachments/assets/db06655e-3872-4876-8fbe-d74fbb7ab577\" /\u003e\n  \u003cimg width=\"19%\" src=\"https://github.com/user-attachments/assets/328f54b1-0463-46ba-9f0a-6c8f4b86a3b6\" /\u003e\n  \u003cimg width=\"19%\" src=\"https://github.com/user-attachments/assets/317e0a26-d5d0-4ffb-8c4e-a2cfca065908\" /\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n## 사용 기술 및 개발 환경 (Tech Stack \u0026 Environment)\n- **Language \u0026 Tool** : Swift 5.1, Xcode 15.4\n- **iOS** : UIKit, WebKit\n- **Library** : Kingfisher, SnapKit, TextFieldEffects\n- **Architecture** : MVVM\n- **Design Pattern** : Observer, Repository, Singleton\n- **Network** : Alamofire\n- **Local DB** : Realm\n- **Management** : Git, GitHub\n\n\u003cbr /\u003e\n\n## 개발 방식 및 브랜치 전략 (Development \u0026 Branch Strategy)\n### Issue, Pull Request(PR) 템플릿 활용한 프로젝트 관리\n- 개발 시작 전 새로운 Issue 생성 후, Issue와 브랜치를 연결하고 이슈 번호를 브랜치명에 활용하여 일관된 작업 내용 기록\n- Issue와 PR 생성 시 레이블을 표기하여 작업 종류와 진행사항을 한 눈에 알 수 있도록 처리\n- PR 생성 시 템플릿에 맞게 작업 내용과 스크린샷을 상세히 기록하여 추후에도 프로젝트 진행 현황을 알 수 있도록 문서화\n\n### 작업 단위별 브랜치 관리\n- **`main`**\n  - 실제 서비스 배포용 브랜치\n  - 큰 기능 단위 개발 작업이 완료된 후 병합 (Version Realese)\n- **`develop`**\n  - 개발 및 QA 작업용 브랜치 (Main 브랜치에서 분기)\n  - 각 기능 단위 브랜치 작업이 완료된 후 병합\n- **`feat`** , **`design`**, **`fix`**, **`refactor`**...\n  - 작은 기능 단위 브랜치 (develop 브랜치에서 분기)\n  - Issue, PR, Commit 컨벤션과 동일한 Prefix 사용하여 일관된 작업 구분\n- 각 브랜치별 작업 내용 확인을 위해 브랜치명 컨벤션 도입\n  - 이슈번호-prefix--작업설명\n  - `1-feat-main-search`\n\n\u003cbr /\u003e\n\n## 주요 기능 (Main Feature)\n### 스윔웨어 상품 검색 \u0026 상세 정보\n\u003e 최근 검색어, 상품 정렬\n- Naver Shopping API 기반의 스윔웨어 상품 검색 기능\n- 상품 검색 결과 정렬 옵션 제공 (정확도/날짜순/가격순)\n- 웹뷰를 활용한 상품 상세 페이지 조회\n- 사용자가 검색한 내용을 저장하여 최근 검색어 목록 제공 \u0026 검색어 클릭 시 검색 결과 연결\n\n### 상품 찜하기\n- 사용자가 찜한 상품을 로컬 데이터베이스에 저장\n- 찜한 상품을 모아볼 수 있는 목록 기능 제공\n\n### 사용자 설정\n- 프로필 설정 및 수정 (프로필 아바타, 닉네임)\n- 닉네임 유효성 검사\n\n\u003cbr /\u003e\n\n## 주요 기술 구현 내용 (Implementation Details)\n### Observer 패턴을 적용한 MVVM 아키텍쳐 설계\n- 데이터를 관찰하여 값이 변하는지 여부에 따른 데이터 바인딩 처리\n- Observable 제네릭 클래스 구현하여 핸들링할 값과 클로저 선언\n- 초기화 시점에 데이터를 받아 값에 할당하고, 값이 변할 때 마다 클로저를 호출하여 외부에서 변경된 값을 반영\n\n\u003cbr /\u003e\n\n### Realm 데이터베이스를 활용해 찜 카테고리와 찜한 상품 기능 구현\n- 앱에서 사용할 찜 카테고리와 찜 상품(Item)모델을 정의하고 List 타입을 통해 1:N 관계 설정\n- Repository 패턴을 활용해 찜 카테고리 생성/삭제, 찜 상품 저장/삭제 등의 메서드를 구현하고 ViewModel에서 인스턴스 생성하여 메서드 실행\n\n\u003cbr /\u003e\n\n### Naver Shopping API와 WebKit를 활용한 상품 검색 및 상품 상세 정보 기능 구현\n- Singleton 패턴으로 NetworkManager 구현하여 Query 기반 스윔웨어 상품 검색\n- 사용자가 입력한 검색어를 기반으로 Default Query를 적용하여 컨셉에 맞는 검색 결과 노출\n- URLSession.shared.dataTask를 사용해 네트워크 요청하고 클로저 구문과 Result Type을 통해 네트워크 성공/실패 처리\n\n\u003cbr /\u003e\n\n### Reusable 프로토콜 구현\n- AnyObject를 상속 받는 Reusable 프로토콜 구현\n- UIView extension을 활용해 Reuseable을 채택하여 id값 반환하도록 처리\n- UIView를 상속받는 클래스는 클래스명을 id로 반환\n\n\u003cbr /\u003e\n\n### View 객체를 확장하여 공통적으로 활용 가능한 메서드 구현\n- BarButton 설정, Alert/ActionSheet 처리, popViewControlle 등 모든 ViewController에서 사용 가능한 기능에 대한 메서드 구현\n- 다양한 뷰 객체 Extension을 활용해 기본적인 UI 초기 세팅 함수 정의하여 활용\n\n\u003cbr /\u003e\n\n### PropertyWrapper를 사용해 간편한 UserDefaults 관리\n- UserDefaults로 관리할 속성을 열거형을 활용해 정의\n- PropertyWrapper를 사용하여 UserDefaultsWrapper를 구현, 키와 기본값 관리\n- UserDefaults 핸들링을 위한 구조체를 구현하고 각 속성을 타입 프로퍼티로 정의하여 간편한 접근 처리\n\n\u003cbr /\u003e\n                                                                                                        \n### Base 코드, 공통 컴포넌트, 리소스 관리\n- 여러 View에서 공통적으로 활용하는 Base 코드 정의, 필요한 메서드를 오버라이딩하여 사용\n- 반복적으로 사용되는 UI를 재사용과 커스텀이 가능하도록 컴포넌트화하여 활용\n- 열거형과 타입 프로퍼티를 통해 앱에서 사용하는 문자열, 폰트, 이미지 등의 리소스 코드를 데이터로 인식하여 관리\n\n\u003cbr /\u003e\n\n### 성능 최적화 \u0026 메모리 누수 방지   \n- final, private 키워드를 사용하여 서브클래싱과 오버라이딩을 방지,  파일 외부에서 접근하지 않는 프로퍼티에 대해 접근 제한 처리\n- Static Dispatch로 동작하도록 처리함으로써 컴파일 최적화\n- 클로저 내부에서 외부 데이터를 참조할 때 [weak self] 처리하여 강한 순환 참조 문제 해결\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev-junehee%2Fswimz","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdev-junehee%2Fswimz","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev-junehee%2Fswimz/lists"}