---
# System prepended metadata

title: 3조 피어세션 회고

---

# 3조 피어세션 회고

# 팀원



| S031 | S045 | S002 | S022 | S049 | S020 | S012 | S013 |
| -------- | -------- | --- | --- | --- | --- | --- | -------- |
| [오현식](https://github.com/Kinaan-Oh) | [이지수](https://github.com/tmfrlrkvlek) | [강민상](https://github.com/FreeDeveloper97) | [백지현](https://github.com/bhyun) | [이태혁](https://github.com/taelee42) | [박인우](https://github.com/inuinseoul) | [김우재](https://github.com/kimwj9792) | [김태훈](https://github.com/Modyhoon) |


## 목적

- 코드 공유를 통한 피드백 및 부족한 점 개선
- 마스터 피드백 내용을 함께 살펴보면서 구체적인 내용 파악

## 과정

- [x] 코드리뷰
- [x] 마스터 피드백 리뷰
- [x] 깃 이슈 공유 및 커밋메세지 공유
- [x] 유용한 꿀팁 공유

### S012 김우재

[XCode XCTest 테스트 메서드 실행 순서 정리](https://zdodev.github.io/xctest/Xcode-XCTest-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C-%EC%A0%95%EB%A6%AC/)

### S031 오현식

Player card 받은것을 Set으로 선언하여 관련 메소드로 중복처리 를 간편하게 할 수 있다.

``` swift
XCAssertEqual(cardsDistibutedSet.count, sut.turnBefore() != "로봇" ? mode : 3, "~~~")
XCAssertEqual(cardRecieved.intersection(cardsDirtrubutedSet).count, 0, "~~~")
```

- `~=` 기능

    Range 안에 속해있는지 판단해주는 연산자이다.

- if문 말고 Guard를 활용하여 validation 처리를 미리 해주자.

### S049 이태혁
- 뷰 컨트롤러들을 전부 탭바에 넣음
- `guard` 구문에서 컴마로

    ```swift
    func isValidText(_ text: String) -> Bool {
        let validRegex = "^\\w{1,5}$"
        let alphaRegex = "[a-zA-Z]"
        guard let _ = text.range(of: validRegex, options: .regularExpression),
              let _ = text.range(of: alphaRegex, options: .regularExpression)
              else {
            return false
        }
        return true
    }
    ```

    guard 에서는 `,` 가 and의 역할을 할 수 있는 것 같다.

    [스위프트의 콤마와 &&의 차이: condition과 expression의 구분](https://soojin.ro/blog/swift-comma-vs-and-operator)

### S045 이지수

스토리보드에서 `extension` 으로 Button UI 바꾸기

``` swift
import UIKit

extension UIButton {
    
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
        }
        get {
            return layer.cornerRadius
        }
    }
    
    @IBInspectable var borderColor: UIColor? {
        set {
            guard let color = newValue else { return }
            layer.borderColor = color.cgColor
        }
        get {
            guard let color = layer.borderColor else { return nil }
            return UIColor(cgColor: color)
        }
    }
    
}
```

[피어세션 관련 개인 기록](https://bush-tire-4d2.notion.site/16bd93f9fec24f7c86afb90d9b0d6da8)

### S002 강민상

``` swift
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return range.location < 5
}
```


이렇게하면 애초에 Text 5글자 이상 입력을 못한다고 한다.

- `mutating` 알아보자

    shuffle test → 카드 종류가 한번이라도 다를 경우 → 이래서 Card에 `Equtable`을 사용한 것

- 과일 카드게임테스트에서 테스트는 각 시행이 독립적으로 작동해야 한다고 알고 있는데, 3장뽑는테스트에서 1장뽑는 테스트를 사용하게 되면 독립적임이 보장되는가?

- reset() 을 할때 removeAll() 을 하지 않고 빈 배열을 하나 만들어서 넣어줬는데, 그렇게 하게되면 기존에 있던 메모리를 가지고 있는 변수가 없을것 같다. 이 때 메모리 누수 이슈는 없을까요?

### S020 박인우

클래스와 구조체를 선택하는 방법

동일성이 필요하면 클래스를 사용해라

[Apple Developer Documentation](https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes)

### S022 백지현

- nil 로 테스트

- 깃을 웹 게임처럼 할수 있는 사이트

[XCode XCTest 테스트 메서드 실행 순서 정리](https://zdodev.github.io/xctest/Xcode-XCTest-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C-%EC%A0%95%EB%A6%AC/)

### JK 님 피드백 기준으로 진행

![](https://i.imgur.com/KftHJxj.png)

- 테스트 작성을 먼저할지 코드 작성을 먼저 할지 (TDD 방식) 논의
    - 다들 코드 작성을 먼저 하는 편
- 잘게 쪼개어 놓는게 유닛테스트를 하기에 좋지 않을까 생각

[https://www.youtube.com/watch?v=meTnd09Pf_M&t=665s](https://www.youtube.com/watch?v=meTnd09Pf_M&t=665s)

![](https://i.imgur.com/zjaWsto.png)

### 공유된 꿀팁들
- https://soojin.ro/blog/swift-comma-vs-and-operator
- https://zdodev.github.io/xctest/Xcode-XCTest-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C-%EC%A0%95%EB%A6%AC/
- https://learngitbranching.js.org/?locale=ko
- https://www.youtube.com/watch?v=meTnd09Pf_M&t=665s
- https://gist.github.com/godrm/d07ae33973bf71c5324058406dfe42dd
- https://www.conventionalcommits.org/en/v1.0.0/
- http://karma-runner.github.io/6.3/dev/git-commit-msg.html

## 결과


### 피어별 느낀점
- S012 김우재 : 같은 코드도 여러 방향으로 짤 수 있다는 것을 배웠습니다. 특히 프로토콜... 더 공부해야 할 것 같아요...

- S020 박인우 : 다른 분들에 비해 구조화가 덜 되었음을 느꼈습니다. 과제의 목적에만 맞추려고 하지말고 더 나은 코드를 작성하려고 노력하겠다고 다짐했습니다.

- S002 강민상 : Test를 먼저 생각하고 작성하는 TDD에 대해 좀더 알아봐야겠다는 생각이 들었습니다. 피어세션을 통해 CaseIterable, removeAll() 등 몰랐던 부분을 알게 되었습니다. commit 의 convention 또한 알게 되었습니다. (git은 아직 어렵...)

- S049 이태혁 : IBInspectable이 충격적이었습니다. 테스트에 신경을 쓰신 분들이 많이 계셔서 많이 배울 수 있었습니다. 

- S045 이지수 : 같은 미션을 진행했는데도 팀별로 신경쓴 포커스가 다르다는 점이 신기했습니다. 그래서 피어 세션의 목적답게 폭넓은 정보들을 공유할 수 있었던 것 같습니다. 특히 꿀팁을 많이 알게 되었습니다.

- S022 백지현: 커밋 메시지를 좀 더 컨벤션에 맞게 작성해야 겠다는 생각이 들었습니다. 다른 분들 코드 리뷰를 통해서 다양한 꿀팁을 알게 된 것 같습니다.

- S013 김태훈 : Model, Controller, View에 따라 폴더를 나누면 코드 분리가 수월하고 가독성이 좋을것 같다라는 생각이 들었습니다. 추가적으로 git convention 에 대해 이야기를 나눠봐서 좋은 정보를 많이 얻어간것 같습니다.

- S031 오현식 : 저희 팀원들과 다른 생각을 가진 타 팀원들과 다양한 Swift 문법, 커밋 컨벤션, 모델 설계 방법, 깃 브랜치 전략에 대해 공유하였고 많이 배웠습니다. 다만, 테스트하기 좋은 구조가 무엇인지에 대해 해결하지 못한 점이 아쉬웠고 마스터님께 질의해야 겠다는 생각이 들었습니다.