---
# System prepended metadata

title: Week7~8 스타벅스트 앱 계획

---

# Week7~8 스타벅스트 앱 계획
[TOC]

## Contributer
> []

| ⛺️ 캠퍼남바 | 👨🏻‍💻 이름 |
| ---- | ---- |
| S025 | [신명섭](https://github.com/s1gnature) |
| S034 | [윤상진](https://github.com/alibreo3754)|

- [그라운드 룰](https://www.notion.so/c831311f5b864241a36d8bba0acc93f3)
- [전체 작업 내용](https://amusing-syzygy-b9c.notion.site/Week7-8-cb736fce3d7a42f889d49376b7f13194)

## 실행 화면

|Home|Order|
| -------- | ----- |
| <img width = 240 src = "https://user-images.githubusercontent.com/40790219/138382222-58a63200-8102-48a5-8644-187c34582d05.gif"> |<img width = 240 src = "https://user-images.githubusercontent.com/40790219/138382206-4143f02e-d419-45bf-9502-5be74780a8ee.gif"> |

|Pay|나만의 메뉴|
| -------- | ----- |
| <img width = 240 src = "https://i.imgur.com/xhyx5sg.gif"> | <img width = 240 src = "https://i.imgur.com/XZdZI4S.gif"> |

## Architecture
JK-iOS Clean Architecture + Combine기반 MVVM + 일부 페이지 MVC

## Task
> **TaskFlow**
> 홈 화면 → 주문 화면(주문 목록) → 제품 상세 → 지불 화면 -> 나만의 메뉴 → 초기 이벤트 화면

**아키텍쳐 → MVVM 구조로 화면내의 기능을 나눠서 구현해본다.**
**팀에서 각자 화면 단위로 단순히 분업해서 작업하지 않는다.**

- 프로젝트 협업은 짝 프로그래밍만 하는 게 아니다. 서로 어떻게 협업할 것인가 상의한다.
- 짝-프로그래밍 방식을 일주일에 하루 4시간 이상 진행한다.
- 화면 단위 혹은 폴더, 기능 단위로 전혀 협업 포인트가 없이 분업하지 않는다.
- 작업을 작게 나누고 반드시 화면 단위로 협업하고 완성하고 난 이후 다음 단계(화면)를 진행한다.

**Branch 전략**

- 상진님의 forked Repo를 기준으로 `Dev` branch를 추가한 후 해당 브랜치에서 각자의 작업 브랜치를 분기합니다.
이후 그 날의 작업 마무리에 `Dev` 브랜치에 merge 후 upstream으로 PR을 작성합니다.
- 드라이버 ↔ 네비게이터는 대략 1시간 마다 교체합니다.

**Week7(1주차) 목표 → 홈 화면 ~ 주문 화면(주문 목록)까지 구현을 목표로!**

- 공통 목표: 프로젝트 내부에 강제 언래핑(@IBOutlet도 포함)을 없게 한다.
- 상진: combine을 익혀본다.
- 명섭: snapkit을 익혀본다.

**Week8(2주차) 목표**

- 공통 목표: JK Clean Architecture를 위해 노력한다
    ![](https://i.imgur.com/dPI49Y7.png)
- 상진: snapkit을 익혀본다.
- 명섭: combine을 익혀본다.

## CocoaPod
- SwiftLint
    > 프로젝트 내부에 Optional 강제 해제를 사용하지 않도록 강제하기 및 서로의 코드 스타일을 맞추기 위해 사용
    - Option
        ~~~ yaml
        disabled_rules: # 실행에서 제외할 룰 식별자들
          - trailing_whitespace # 함수마다 공백으로 구분하려 했으나, 경고메시지를 줘서 제거
        opt_in_rules:
          - force_unwrapping
        included:
        excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음
          - Carthage
          - Pods
        # let string: String = "hi" 변수 뒤에 콜론은 붙이고 콜론 뒤엔 한칸 띄우기
        colon:
          severity: error
        comma: error #[1, 2, 3, 4] 콤마와 마찬가지로 변수뒤에 붙이고 한칸띄우기
        # ! 전부 금지
        force_unwrapping: error
        force_cast: error
        force_try: error
        vertical_whitespace: # 의미없는 공백 제거
            severity: error
        reporter: "xcode"
        ~~~
- Snapkit
    > 코드로 레이아웃을 구현함에 있어 Autolayout, NSLayoutConstraint를 대체하기 위해 사용

## TroubleShooting
- **`self.` 키워드는 가독성을 높히는데 도움이 되는가?**
> `self.` 를 사용하면서 클래스 내부의 프로퍼티와 메소드 내부의 프로퍼티를 구분감 있게 하기위해 컨벤션에 클래스 내부의 프로퍼티를 사용할 때 모든 프로퍼티에 `self.`를 강제하였다.
> 그러나 `closure` 에서의 캡쳐된 `self`와 혼용될 여지가 있다는 리뷰어님의 피드백에 1차적으로 설득 시도를 하였다.

*2차 피드백*
![](https://i.imgur.com/HBlOYot.png)

> 리뷰어님의 2차 피드백에서의 답변으로 인해 이야기를 나눈 결과 `closure` 에서의 `self` 혼용을 막을 방법이 없다고 판단, '**클래스 프로퍼티와 메소드 프로퍼티의 변수명을 더 고민해서 적는 것**'으로 하여 `self.` 키워드 사용을 제한하는 것으로 정하고 리뷰어님의 의견을 받아들였다.

