Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

오픈 마켓 [STEP 2] 아리,제리 #93

Merged
merged 34 commits into from
Jan 13, 2022
Merged
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
a65df63
refoctor: 상품수정, Secret 조회 중복되는 부분을 메소드로 분리 #6
leeari95 Jan 7, 2022
2d57799
refactor: 테스트코드 내 force Unwrapping 옵셔널하게 수정 #6
llghdud921 Jan 7, 2022
78543f2
style: SwiftLint에 Conditional Returns on Newline 룰을 추가
leeari95 Jan 7, 2022
8bb770b
feat: navigationController, segmentControl 추가 및 속성 구현 #7
llghdud921 Jan 7, 2022
3a15dd3
feat: Main에 CollectionView를 올리고 GridCollectionViewCell을 추가 #7
leeari95 Jan 7, 2022
9f4aa1e
feat : Main에 ListCollectionViewCell을 추가 #7
llghdud921 Jan 7, 2022
7ed3ef7
style: listCollectionViewCell 디테일하게 view 수정
llghdud921 Jan 10, 2022
aed288c
feat: 세그먼트 컨트롤러를 활용하여 List와 Grid 형태로 넘어갈 수 있도록 기능 추가 #7
leeari95 Jan 10, 2022
9a7fa20
feat: Http로 network하여 collectionview 로드 #7
llghdud921 Jan 10, 2022
76c9867
feat: 데이터를 가져오는 동안 로드중임을 알 수 있게 UIActivityIndicatorView 기능 추가 #7
leeari95 Jan 10, 2022
33e0482
fix: multipartform body구성 시 마지막 boundary 추가 #6
llghdud921 Jan 10, 2022
d000fcc
feat: 상품 가격 레이블들의 색상, 스타일을 설정하는 기능 추가 #7
leeari95 Jan 10, 2022
c3ad5cf
fix: gridlayoutcell내 stackview constraint 삭제 #7
llghdud921 Jan 10, 2022
7c37bd4
feat: 상품등록 화면으로 이동하는 버튼 추가 후 Modal을 띄우도록 기능 구현 #7
leeari95 Jan 10, 2022
900d5c7
refactor: Collectionview를 custom class로 분리 #7
llghdud921 Jan 11, 2022
fabfe1f
refactor: ProductCell 내부를 리팩토링 #8
leeari95 Jan 11, 2022
224a55d
refactor: ActivityIndicatorView didset 코드 삭제 #8
llghdud921 Jan 11, 2022
f4f5995
refactor: 상품등록 버튼의 Segue Kind를 modal에서 Show로 변경 #8
leeari95 Jan 11, 2022
a53f698
refator: 잘못된 URL 수정 #8
llghdud921 Jan 11, 2022
6bbf36d
refactor: NetworkManager, MultipartForm 부분 리팩토링 #8
leeari95 Jan 11, 2022
29779f4
refactor: networkmanager내 request 옵셔널 타입 수정 #8
llghdud921 Jan 11, 2022
bdfe1fb
refactor: network 후에 collectionview 구성하도록 수정 #8
llghdud921 Jan 11, 2022
ad61002
refactor: 하드코딩 되어있는 메세지 부분을 네임스페이스로 리팩토링 #8
leeari95 Jan 11, 2022
b359b2b
docs: STEP2 README 작성
llghdud921 Jan 11, 2022
ab7156f
refactor: Asset에 등록되어있는 이미지 이름, Scales, Resizing 설정 수정 #9
leeari95 Jan 12, 2022
ffd54e1
refactor: 전반적인 네이밍 수정 #9
llghdud921 Jan 12, 2022
b1aeb83
refactor: 뷰 구성 시 cell을 바인딩 하지 못할 경우 에러 발생 얼럿을 띄우도록 수정 #9
leeari95 Jan 12, 2022
3b91e40
refactor: identifier로 뷰 전환하는 조건문삼항연산자로 개선 #9
llghdud921 Jan 12, 2022
c08cc5b
refactor: NetworkManager 프로퍼티가 private 하도록 접근제어 추가 #9
leeari95 Jan 12, 2022
ceaf667
refactor: 동적으로 레이아웃을 잡도록 UICollectionViewDelegateFlowLayout을 채택 #9
leeari95 Jan 12, 2022
782bc75
refactor: 동적 레이아웃을 위한 collectionview 프로퍼티 생성 #9
llghdud921 Jan 12, 2022
e3a8a37
style: Asset 이미지 이름에 공백부분을 삭제하여 파일명 개선 #9
leeari95 Jan 13, 2022
aa1c79a
refactor: 줄바꿈 컨벤션에 맞춰 개선 #9
llghdud921 Jan 13, 2022
e8e87c6
style: 메소드명 오타를 수정 #9
leeari95 Jan 13, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
docs: STEP2 README 작성
  • Loading branch information
llghdud921 authored Jan 11, 2022
commit b359b2beefebb0693af88d8add5ca2b35fdef8e0
106 changes: 106 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@
+ [의문점](#1-2-의문점)
+ [Trouble Shooting](#1-3-Trouble-Shooting)
+ [배운 개념](#1-4-배운-개념)
+ [PR 후 개선사항](#1-5-PR-후-개선사항)
- [STEP 2 : 상품 목록 화면 구현](#STEP-2--상품-목록-화면-구현)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

크 스텝2도 역시 소홀히 하지 않으셨군요!
최고입니다👍👍👍

+ [고민했던 것](#2-1-고민했던-것)
+ [의문점](#2-2-의문점)
+ [Trouble Shooting](#2-3-Trouble-Shooting)
+ [배운 개념](#2-4-배운-개념)

# 키워드

Expand All @@ -40,6 +46,11 @@
- `Result`
- `Codable` `CodingKey`
- `Async Test`
- `UICollectionView` `UICollectionViewFlowLayout`
- `Xib File`
- `UISegmentedControl`
- `UIActivityIndicatorView`
- `reloadData`

# STEP 1 : 네트워킹 타입 구현

Expand Down Expand Up @@ -143,6 +154,7 @@ class StubURLSessionDataTask: URLSessionDataTask {

> 'init()' was deprecated in iOS 13.0: Please use -[NSURLSession dataTaskWithRequest:] or other NSURLSession methods to create instances
>
- 을 만들어 DummyData를 URLSessionDataTask에 전달하는 방식으로 Test를 진행하는 과정에서 경고가 나타났습니다.
- `이유` URLSessionDataTask `init()`이 IOS13 이후에 deprecatede되었기 때문이다. 해당 경고를 없애고 싶어서 구글링을 하다가 `URLProtocol`을 발견하게 되었다.
- `해결` URLProtocol을 상속받은 MockURLProtocol을 만들어서 URLSession configuration을 구성하는 방법으로 문제를 해결하고 기존에 만들었던 StubURLSessionDataTask, DummyData, MockSession 타입은 더이상 사용하지 않게되어 모두 삭제해주었다.
- `URLProtocol`이란?
Expand Down Expand Up @@ -209,5 +221,99 @@ class StubURLSessionDataTask: URLSessionDataTask {
- Testable한 네트워크 코드 작성하기
- 네트워크 상황과 무관한 네트워킹 데이터 타입의 단위 테스트(Unit Test)

## **1-5 PR 후 개선사항**

- 테스트 코드에 중복되는 부분을 개선
- 빠진 주석 및 줄바꿈을 수정
- Image의 프로퍼티 네이밍을 명확하게 수정
- 하드코딩 되어있는 문자열을 따로 enum 타입으로 빼주어 개선
- 에러의 네이밍을 명확하게 개선
- Parser, Parsable의 네이밍을 JSON을 덧붙혀 명확하게 개선
- 접근제어가 붙어있지 않은 프로퍼티에 접근제어를 추가
- Address의 네이밍을 명확하게 개선 (APIAddress)

[![top](https://img.shields.io/badge/top-%23000000.svg?&style=for-the-badge&logo=Acclaim&logoColor=white&)](#오픈-마켓)


# STEP 2 : **상품 목록 화면 구현**

상품목록을 볼 수 있는 화면을 구현합니다.

## 2-1 고민했던 것

- `CollectionView` 하나로 Cell 두개를 활용하여 화면을 전환하기
- Custom Cell을 구현하고, 두개의 레이아웃을 만들어 셀만 바꿔주는 방식으로 목록화면 구성
- `FlowLayout`을 활용하여 Cell의 레이아웃을 구성
- 서버에서 상품 목록을 불러오는 부분과 뷰를 그리는 부분 비동기 처리 구현
- CollectionView cell 각각 xib로 구현
- `CollectionView`의 `GridCell`, `ListCell`을 각각 xib파일을 생성하여 storyboard로 구현하였고 두개의 xib에 대한 코드는 `ProductCell` 하나의 cell로 구성
- Network를 통해 data를 가져와 `CollectionView`를 구성
- API의 Data를 가져오기 위해 productList Search하는 `request` 생성하여 `networkManager`의 `fetch()`로 network를 진행하였고 가져온 `data`로 `collectionViewload`하였다.

```swift
let request = networkManager.requestListSearch(page: 1, itemsPerPage: 10) else {
...
networkManager.fetch(request: request, decodingType: Products.self) { result in
switch result {
case .success(let products):
self.productList = products.pages
self.collectionViewLoad()
...
```

- `CollectionView`를 재구성하는 경우 `reloadData()` 사용
- `SegmentControl`을 이용해 `flowlayout`을 변경하는 경우 `CollectionView`를 재구성하기 위해 reloadData를 사용하였다.

```swift
// list -> gird, grid -> list로 변경
@IBAction private func switchSegmentedControl(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
currentCellIdentifier = ProductCell.listIdentifier
collectionView.setUpListFlowLayout()
collectionView.scrollToTop()
collectionView.reloadData()
```

- alert을 이용한 `Error Handling`
- OpenMarket app에서 발생한 error는 alert 창을 띄워 error를 나타내었다.
- `localizedError` 프로토콜의 `errorDescription`을 이용하여 description을 정의하였고 `error.localizedDescription`으로 error Message를 출력하도록 에러처리.
- 상품등록 버튼 Segue
- HIG를 참고하여 상품등록 버튼을 눌렀을 때 `Navigation` 형태가 아니라 `Modal`로 띄우도록 구성
- Navigation Bar를 활용하여 취소 버튼을 구성

## 2-2 의문점

- collectionview의 flowlayout을 변경할 때 `AutoLayout 충돌 관련 경고`가 뜨는데, 해결 방법을 모르겠다.
- `SegmentControl`을 활용하여 List나 Grid를 전환할 때 생기는 약간의 딜레이의 원인을 모르겠다.

## 2-3 Trouble Shooting

### 1. Segument Control을 이용하여 화면전환 시 스크롤 위치가 정상적이지 않은 경우

![https://i.imgur.com/DRtK0Xs.gif](https://i.imgur.com/DRtK0Xs.gif)

- `상황` FlowLayout을 활용하여 화면을 전환할 때, 스크롤이 상단에 위치하는게 아니라 제멋대로인 위치에 가있는 현상이 발생했다.
- `이유` 레이아웃이 서로 다르기 때문에 스크롤의 좌표도 다른 것으로 추측이 되었다.
- `해결` 따라서 이 부분을 화면을 전환할 때 스크롤의 위치를 상단에 위치하게 설정해주니 해결되었다.

```swift
extension UIScrollView {
func scrollToTop() {
let topOffset = CGPoint(x: 0, y: -contentInset.top)
setContentOffset(topOffset, animated: false)
}
}
```


## 2-4 배운 개념

- `UICollectionView` `UICollectionViewFlowLayout`
- `Networking`을 통한 뷰에 대한 비동기 처리
- `reloadData`
- `Xib File`
- `UISegmentedControl`
- `UIActivityIndicatorView`

[![top](https://img.shields.io/badge/top-%23000000.svg?&style=for-the-badge&logo=Acclaim&logoColor=white&)](#오픈-마켓)