# πŸ’°μ€ν–‰μ°½κ΅¬ λ§€λ‹ˆμ €πŸ’° ## λͺ©μ°¨ 1. [μ†Œκ°œ](#1μ†Œκ°œ) 2. [νŒ€μ›](#2νŒ€μ›) 3. [νƒ€μž„λΌμΈ](#3νƒ€μž„λΌμΈ) 4. [UML](#4λ‹€μ΄μ–΄κ·Έλž¨) 5. [μ‹€ν–‰ ν™”λ©΄](#5μ‹€ν–‰ν™”λ©΄) 6. [νŠΈλŸ¬λΈ” μŠˆνŒ…](#6νŠΈλŸ¬λΈ”-μŠˆνŒ…) 7. [핡심 κ²½ν—˜](#7ν”„λ‘œμ νŠΈ-μˆ˜ν–‰-쀑-핡심-κ²½ν—˜) 8. [μ°Έκ³  링크](#8μ°Έκ³ -링크) ## 1.μ†Œκ°œ - μ€ν–‰μ˜ 은행원듀이 고객의 업무에 λ”°λ₯Έ 일을 λ™μ‹œμ— μ²˜λ¦¬ν•˜λŠ” μ•±μž…λ‹ˆλ‹€. <br> ## 2.νŒ€μ› | Baem | bella | | --- | --- | | <img src=https://i.imgur.com/jrW5RQj.png width="155" height="150" >|<img src=https://i.imgur.com/Ux3OvW7.jpg width="155" height="150" > | | [@Dylan-Yoon](https://github.com/dylan-yoon) | [@hyhy0429](https://github.com/hyhy0429) | <br> ## 3.νƒ€μž„λΌμΈ **[STEP-1]** - 221101 - CocoaPod을 μ΄μš©ν•œ SwiftLint 라이브러리 μ„€μΉ˜ - Node 파일 생성 및 κ΅¬ν˜„ - LinkedList 파일 생성과 ν”„λ‘œνΌν‹° 및 λ©”μ„œλ“œ κ΅¬ν˜„ - LinkedList UnitTest κ΅¬ν˜„ **[STEP-2]** - 221102 - Bank 파일 생성 및 νƒ€μž… λ‚΄λΆ€ λ©”μ„œλ“œ κ΅¬ν˜„ - Customer 파일 생성 - Bank νƒ€μž… λ‚΄λΆ€ λ©”μ„œλ“œ κΈ°λŠ₯ 뢄리 - μ ‘κ·Όμ œμ–΄μž μ„€μ • **[STEP-3]** - 221107 - Task 파일 생성 및 Customer νƒ€μž… ν”„λ‘œνΌν‹° μΆ”κ°€ - Bankmanger νƒ€μž… κ΅¬ν˜„ - Bank νƒ€μž… λ‚΄λΆ€ 고객 λŒ€κΈ°μ—΄ ꡬ뢄 및 λžœλ€ν•˜κ²Œ 업무 λΆ„λ°°ν•˜λŠ” λ©”μ„œλ“œ μΆ”κ°€ - Bankmanager νƒ€μž… λ‚΄λΆ€ task() κ΅¬ν˜„ - Bankmanager νƒ€μž… class둜 λ³€κ²½ 및 μ‹œκ°„/고객수 ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œ κ΅¬ν˜„ - Bank νƒ€μž… λ‚΄λΆ€ 업무 λ§ˆμΉ˜λŠ” λ©”μ„œλ“œ κ΅¬ν˜„ - Bank νƒ€μž… λ‚΄λΆ€ 일을 μ‹œμž‘ λ©”μ„œλ“œμ™€ DispatchQueue에 λ˜μ§€λŠ” λ©”μ„œλ“œ κΈ°λŠ₯ 뢄리 - 221110 - BankType의 고객창ꡬλ₯Ό Task νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ‘œ κ΄€λ¦¬ν•˜λ„λ‘ κ΅¬ν˜„ - Bank νƒ€μž… λ‚΄λΆ€ 업무 κ΄€λ ¨ λ©”μ„œλ“œλ₯Ό BankManager νƒ€μž… λ‚΄λΆ€λ‘œ 이동 - Bank νƒ€μž… λ‚΄λΆ€ dispatchTask() μ‹œκ°„κ³„μ‚° 였λ₯˜ μˆ˜μ • - 221111 - Readme μž‘μ„± <br> ## 4.λ‹€μ΄μ–΄κ·Έλž¨ #### UML <img src=https://i.imgur.com/ih6BBYT.jpg width="600" height="450"> ## 5.μ‹€ν–‰ν™”λ©΄ | STEP 1, 2 | STEP 3 | | -- | -- | | <img src=https://i.imgur.com/Tw1RwJ4.gif width="400" height="350" > | <img src=https://i.imgur.com/5ZcK7tA.gif width="400" height="350" > | ## 6.νŠΈλŸ¬λΈ” μŠˆνŒ… #### SwiftLint SPMμ„€μΉ˜μ— λŒ€ν•œ μ˜€ν•΄μ™€ Cocoa Pod 선택 이유 - Swift Package Manager(SPM) - 처음 `SwiftLint 라이브러리`λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ μ˜μ‘΄μ„±κ΄€λ¦¬λ„κ΅¬ 쀑 `CocoaPod`κ³Ό `SPM`을 κ³ λ―Όν•˜κ²Œ λ˜μ—ˆκ³ , μ• ν”Œμ—μ„œ 직접 μ œκ³΅ν•œλ‹€λŠ” 점 및 νŽΈλ¦¬ν•˜λ‹€λŠ” μ μ—μ„œ `SPM`을 μ„ νƒν•˜μ—¬ μ‚¬μš©ν•˜λ €κ³  ν–ˆμŠ΅λ‹ˆλ‹€. - SPM을 μ΄μš©ν•œ μ„€μΉ˜ κ³Όμ •μ—μ„œ, μ²˜μŒμ—λŠ” Xcode의 [File -> Add Package]μ—μ„œ μ„€μΉ˜λ§Œ ν•˜λ©΄ λ˜λŠ” κ²ƒμœΌλ‘œ μ•Œκ³  μžˆμ—ˆμœΌλ‚˜, `SwiftLint`λŠ” λ‹€λ₯Έ 라이브러리처럼 SPM을 μ§€μ›ν•˜λŠ” 것이 μ•„λ‹ˆμ—ˆμœΌλ©° μ‚¬μš©μ„ μœ„ν•΄μ„œλŠ” `brew`λ₯Ό 톡해 `swiftLint`λ₯Ό μΈμŠ€ν†¨ ν•œ λ’€ ν”„λ‘œμ νŠΈμ— 적용 ν›„ swiftlint.yml νŒŒμΌμ„ 생성 ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. - CocoaPod - <img src=https://i.imgur.com/ImUaDQf.png width="600" height="250" > - [SwiftLint github](https://github.com/realm/SwiftLint)의 `μ„€μΉ˜`와 κ΄€λ ¨λœ 뢀뢄을 μ‚΄νŽ΄λ³΄λ‹ˆ, `SPM`이 μ•„λ‹Œ `CocoaPod` μ‚¬μš©μ„ ꢌμž₯ν•˜κ³  μžˆλŠ” 것을 μ•Œκ²Œ λ˜μ–΄ λ³€κ²½ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. #### 큐의 μ‚¬μš© - μ²˜μŒμ—λŠ” LinkedList둜 λ§Œλ“  큐λ₯Ό ν™œμš©ν•˜μ—¬, `예금 큐` `λŒ€μΆœ 큐` λ₯Ό λ”°λ‘œ λ§Œλ“€κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, Bank νƒ€μž… 내뢀에 예금 λ§€λ‹ˆμ € 2λͺ…κ³Ό λŒ€μΆœ λ§€λ‹ˆμ € 1λͺ…을 μƒμ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 예금 λ§€λ‹ˆμ €1κ³Ό λŒ€μΆœλ§€λ‹ˆμ €1μ—κ²Œ 각 고객 λŒ€κΈ°μ—΄μ—μ„œ 고객을 κΊΌλ‚΄ 일을 ν• λ‹Ήν•˜λŠ” 것이 κ°€λŠ₯ν–ˆμœΌλ‚˜, 예금 κ³ κ°λŒ€κΈ°μ—΄μ„ μ˜ˆκΈˆλ§€λ‹ˆμ €1 뿐만 μ•„λ‹ˆλΌ μ˜ˆκΈˆλ§€λ‹ˆμ €2μ—κ²Œλ„ ν• λ‹Ήν•˜λŠ” κ²ƒμ—λŠ” μ‹€νŒ¨ν•˜κ²Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 고민을 ν•˜λ‹€κ°€, μ—…λ¬΄μ²˜λ¦¬λ₯Ό λ§€λ‹ˆμ € 객체λ₯Ό μƒμ„±ν•΄μ„œ λΆ„λ‹΄ν•˜λŠ” 것이 μ•„λ‹Œ μŠ€λ ˆλ“œμ˜ κ°œλ…μ—μ„œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμœΌλ‘œ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. #### DispatchSemaphore μ‚¬μš© - μœ„μ˜ 과정에 기재된 것과 같이, μ—…λ¬΄μ²˜λ¦¬λ₯Ό μŠ€λ ˆλ“œμ˜ κ°œλ…μ—μ„œ μ²˜λ¦¬ν•˜κ³ μž ν•˜λŠ” κ΅¬ν˜„κ³Όμ •μ—μ„œ, 각 업무λ₯Ό `global.async` λ₯Ό μ΄μš©ν•˜μ—¬ 보낼 κ²½μš°μ—, λžœλ€ν•˜κ²Œ μƒμ„±ν•œ 고객 수 만큼(ν•„μš”ν•œ 만큼) μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, `DispatchSemaphore`와 `SerialQueue` 두 κ°€μ§€ 방법 쀑에 κ³ λ―Όν•˜κ²Œ λ˜μ—ˆμœΌλ©° 예금 업무와 λŒ€μΆœ 업무λ₯Ό μ²˜λ¦¬ν•˜λŠ” μŠ€λ ˆλ“œμ˜ 개수λ₯Ό μ œν•œν•˜κ³ μž `DispatchSemaphore`의 `value` λ₯Ό μ΄μš©ν•˜μ—¬ μ§€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. #### ν΄λ‘œμ €μΊ‘μ³ 였λ₯˜μ— λ”°λ₯Έ Struct -> Class νƒ€μž… λ³€κ²½ ![](https://i.imgur.com/2CUCsq8.png) - `struct Bankmanager` 의 νƒ€μž…μ΄ Struct일 λ•Œ, `Bank`의 DispatchQueue μ—μ„œ μ‚¬μš©ν•˜λ©΄ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 값이 이미 캑쳐가 λ˜μ–΄μžˆμ–΄ 변경이 λΆˆκ°€ν•˜κΈ°μ— μœ„μ™€ 같은 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. - μΊ‘μ³λ“œ 리슀트λ₯Ό ν™œμš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž ν•˜μ˜€μœΌλ‚˜, μΊ‘μ³λ“œ 리슀트 μ—­μ‹œ κ°’ 변경은 λΆˆκ°€ν•˜μ˜€κΈ°μ— μ°Έμ‘°νƒ€μž…μ΄ μ•„λ‹Œ κ°’νƒ€μž…μœΌλ‘œ λ°”κΎΈμ–΄ 문제λ₯Ό ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. #### 초기 섀계와 ν˜„μž¬ κ΅¬ν˜„μ˜ 차이 - 처음 섀계 μ‹œμ—λŠ”, 예금 λŒ€κΈ°μ—΄κ³Ό λŒ€μΆœ λŒ€κΈ°μ—΄μ„ λ§Œλ“€κ³  예금 λ‹΄λ‹Ή 은행원(2), λŒ€μΆœ λ‹΄λ‹Ή 은행원(1) 및 μ€ν–‰μ°½κ΅¬μ˜ κ°œλ…μ΄ λ‹΄κΈ΄ 객체λ₯Ό μƒμ„±ν•˜μ—¬ 업무λ₯Ό ν• λ‹Ήν•˜κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, ν•˜λ‚˜μ˜ 예금 λŒ€κΈ°μ—΄μ˜ 고객듀을 두 λͺ…μ˜ μ€ν–‰μ›μ—κ²Œ λΆ„λ°°ν•˜λŠ” μž‘μ—…(whileλ¬Έ 이용 μ‹œ, 이미 μ˜ˆκΈˆλ‹΄λ‹Ή 은행원1이 λͺ¨λ‘ 고객을 dequeueν•œ 상황)이 λΆˆκ°€ν•˜κ²Œ λ˜μ–΄, μΌν•˜λŠ” μ€ν–‰μ›μ˜ κ°œλ…μ„ μŠ€λ ˆλ“œμ˜ κ°œλ…μ— μ μš©ν•˜κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법 λ°©λ²•μœΌλ‘œλŠ” ν™€μˆ˜λ²ˆμ§Έ 짝수번째둜 각각 ν• λ‹Ήν•˜λŠ” 방법이 μžˆμ„ 수 μžˆμ§€λ§Œ 은행원이 μ—¬λŸ¬λͺ…일 경우 λ³΅μž‘ν•΄ 질 κ²ƒμœΌλ‘œ μ˜ˆμƒν•΄μ„œ λ‹€λ₯Έ 방법을 μ°Ύμ•„ 보고자 ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ![](https://i.imgur.com/zGT6TRz.png) - 예λ₯Ό λ“€μ–΄, μœ„μ˜ μ‚¬μ§„μ²˜λŸΌ λ§Œμ•½ 총 6λͺ…μ˜ 고객이 μžˆμ„ λ•Œ 예금 μ°½κ΅¬μ—λŠ” 2λͺ…μ˜ 은행원이 μžˆλ‹€κ³  μƒκ°ν•΄λ΄…λ‹ˆλ‹€. λ§ν¬λ“œ λ¦¬μŠ€νŠΈμ— λ“€μ–΄μžˆλŠ” 고객듀을 ν•˜λ‚˜μ”© λΉΌμ„œ `async`둜 보내주면 λ™μ‹œμ— 일을 μ²˜λ¦¬ν•˜κ²Œ 될 것이며, κ³΅μœ μžμ›μΈ μ˜ˆκΈˆκ³ κ°λŒ€κΈ°μ—΄μ— μ ‘κ·Όν•  수 μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό `Semaphore`의 `value`λ₯Ό 톡해 μ œν•œν•˜μ—¬ 2λͺ…μ”© μ—…λ¬΄μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜κ²Œ λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, μœ„μ˜ μ‚¬μ§„μ²˜λŸΌ 각 고객당 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œ μ—…λ¬΄μ²˜λ¦¬κ°€ λ˜μ–΄ 총 고객의 μˆ˜μ— λ§žλŠ” μŠ€λ ˆλ“œκ°€ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— μ–΄λ–€ 방식을 μ‚¬μš© ν•΄μ•Όν• μ§€ λ‹€μ‹œ 고민해보아야 ν•  뢀뢄이라고 μƒκ°ν•©λ‹ˆλ‹€. <br> ## 7.ν”„λ‘œμ νŠΈ μˆ˜ν–‰ 쀑 핡심 κ²½ν—˜ - μ˜μ‘΄μ„±κ΄€λ¦¬λ„κ΅¬μ˜ κ°œλ… 이해와 적용 - LinkedList 자료ꡬ쑰의 이해와 적용 - Generics κ°œλ…μ΄ν•΄μ™€ 적용 - νƒ€μž… 좔상화 및 μΌλ°˜ν™” - 동기 λΉ„λ™κΈ°μ˜ 이해와 적용 - λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ° κ°œλ…μ˜ 이해 - GCD의 이해와 ν™œμš© - ν΄λ‘œμ € 캑쳐와 μΊ‘μ³λ“œ 리슀트의 이해 <br> ## 8.μ°Έκ³  링크 - Apple Developer - [Generic](https://docs.swift.org/swift-book/LanguageGuide/Generics.html) - [Choosing Between Structures and Classes](https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes) - Swift Programming Language - [ν΄λ‘œμ € 캑쳐(캑쳐 κ°’)](https://docs.swift.org/swift-book/LanguageGuide/Closures.html) - [ν΄λ‘œμ €μ˜ κ°•ν•œ μ°Έμ‘°](https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html#ID56) - μœ„ν‚€λ°±κ³Ό - [LinkedList](https://ko.wikipedia.org/wiki/%EC%97%B0%EA%B2%B0_%EB%A6%AC%EC%8A%A4%ED%8A%B8) - github - [SwiftLint.github](https://github.com/realm/SwiftLint) - μ•Όκ³°λ‹·λ„· - [λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°](https://yagom.net/courses/%EB%8F%99%EC%8B%9C%EC%84%B1-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-concurrency-programming/) --- [πŸ” 맨 μœ„λ‘œ μ΄λ™ν•˜κΈ°](#은행창ꡬ-λ§€λ‹ˆμ €)