프로젝트 기간: 2022-06-27 ~ 2022-07-08
팀원: 현이, 그루트
리뷰어: @GREENOVER
그라운드롤: GroundRule
현이 | 그루트 |
---|---|
현이 | 그루트 |
- 은행 고객의 업무처리를 동시성 프로그래밍을 이용해서 구현했습니다.
고객 10명 추가 | 고객 여러명 추가 | 초기화 버튼 클릭 |
---|---|---|
- Queue
- Node
- Linked List
- Doubly Linked List
- Singly Linked List
- Generics
- Synchronous, Asynchronous
- GCD(Dispatch Queue)
- Concurrency Programming
- Swift Language Guide - Closures
- Swift Language Guide - Inheritance
- Swift Language Guide - Generics
- Concurrent Programming With GCD in Swift 3
- Swift Language Guide - Subscripts(선택사항)
- Concurrency Programming Guide(선택사항)
- Swift Language Guide - Concurrency(선택사항)
- 오토레이아웃 정복하기 - Dynamic Stack View까지 (선택사항)
- Linked-list 자료구조의 이해 및 구현
- Queue 자료구조의 이해 및 구현
- Generics 개념이해 및 적용
- Queue의 활용
- 타입 추상화 및 일반화
- 동기(Synchronous)와 비동기(Asynchronous)의 이해
- 동시성 프로그래밍 개념의 이해
- 동시성 프로그래밍을 위한 기반기술(GCD, Operation) 등의 이해
- 스레드(Thread) 개념에 대한 이해
- GCD를 활용한 동시성 프로그래밍 구현
- 동기(Synchronous)와 비동기(Asynchronous) 동작의 구현 및 적용
- 동시성 프로그래밍 중 UI 요소 업데이트의 주의점 이해
- 커스텀 뷰 구현
- 스택뷰 활용
- Xcode 프로젝트 관리 구조의 이해와 응용
Linked-list를 구현하기 위한 Node 타입 구현.
CustomerQueue를 구현하기 위한 Linked-List 타입 구현.
고객이 임시로 대기할 대기열(Queue) 타입 구현.
CustomerQueue의 에러 타입 구현.
은행 전반적인 업무를 담당하는 타입 구현.
은행 업무를 수행하는 타입 구현
은행 영업 및 종료에 대한 타입을 구현했습니다.
은행 업무 및 시간에 대한 타입을 구현했습니다.
고객 타입 구현
콘솔에서 이루어지는 작업들을 구현했습니다.
-
문제 해결을 위한 시도
- Unit Testing Bundle을 사용해서 직접 프로젝트 target을 추가했다.
-
테스트 파일에서
@testable import
를 사용하지 않아도 문제가 일어나지 않았다.
문제가 발생한 출력 | 정상 출력 |
---|---|
- 원인 분석
- 스레드의 수를 제어하지 않고 실행했기 때문에, work 함수를 workQueue에 넣어주는 만큼 스레드가 할당된다. 그러므로 모든 업무를 시작하는 시점이 거의 동일하게 진행된다는 점을 발견.
// 문제 코드 static func work(customer: Customer, time: TimeInterval) { print("\(customer.name) 고객 \(customer.business.part) 시작") Thread.sleep(forTimeInterval: time) print("\(customer.name) 고객 \(customer.business.part) 완료") } workQueue.async(group: bankManagers) { BankManager.work(customer: customer, time: time) }
- 해결 방법
- DispatchSemaphore를 사용해 workQueue에서 사용할 스레드의 개수를 정해주는 방법으로 문제 해결.
// 수정 코드 workQueue.async(group: bankManagers) { semaphore.wait() BankManager.work(customer: customer, time: time) semaphore.signal() }