Skip to content

seohyeon2/ios-bank-manager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 

Repository files navigation

은행 관리 매니저

프로젝트 저장소

프로젝트 기간: 2022-06-27 ~ 2022-07-08
팀원: 현이, 그루트
리뷰어: @GREENOVER
그라운드롤: GroundRule

📑 목차

개발자 소개

현이 그루트
현이 그루트

프로젝트 소개

  • 은행 고객의 업무처리를 동시성 프로그래밍을 이용해서 구현했습니다.

UML

[ClassDiagram]

구현내용

고객 10명 추가 고객 여러명 추가 초기화 버튼 클릭

키워드

  • Queue
  • Node
  • Linked List
    • Doubly Linked List
    • Singly Linked List
  • Generics
  • Synchronous, Asynchronous
  • GCD(Dispatch Queue)
  • Concurrency Programming

참고문서

핵심경험

  • Linked-list 자료구조의 이해 및 구현
  • Queue 자료구조의 이해 및 구현
  • Generics 개념이해 및 적용
  • Queue의 활용
  • 타입 추상화 및 일반화
  • 동기(Synchronous)와 비동기(Asynchronous)의 이해
  • 동시성 프로그래밍 개념의 이해
  • 동시성 프로그래밍을 위한 기반기술(GCD, Operation) 등의 이해
  • 스레드(Thread) 개념에 대한 이해
  • GCD를 활용한 동시성 프로그래밍 구현
  • 동기(Synchronous)와 비동기(Asynchronous) 동작의 구현 및 적용
  • 동시성 프로그래밍 중 UI 요소 업데이트의 주의점 이해
  • 커스텀 뷰 구현
  • 스택뷰 활용
  • Xcode 프로젝트 관리 구조의 이해와 응용

기능설명

Node

Linked-list를 구현하기 위한 Node 타입 구현.

LinkedList

CustomerQueue를 구현하기 위한 Linked-List 타입 구현.

CustomerQueue

고객이 임시로 대기할 대기열(Queue) 타입 구현.

QueueError

CustomerQueue의 에러 타입 구현.

Bank

은행 전반적인 업무를 담당하는 타입 구현.

BankManager

은행 업무를 수행하는 타입 구현

BankStatus

은행 영업 및 종료에 대한 타입을 구현했습니다.

BankBusiness

은행 업무 및 시간에 대한 타입을 구현했습니다.

Customer

고객 타입 구현

ConsolManager

콘솔에서 이루어지는 작업들을 구현했습니다.  

Debugging

STEP 1

Command Line Tool에서 Unit Test를 위해서 @testable import 을 사용할 때 모듈을 찾지 못하는 문제가 발생.

  • 문제 해결을 위한 시도

    • Unit Testing Bundle을 사용해서 직접 프로젝트 target을 추가했다.
    • Scheme도 직접 추가하는 방법을 사용.

      1️⃣

      2️⃣

    • 마지막으로 테스트에 사용되는 클래스의 target Target Membership을 추가했다.

  • 테스트 파일에서 @testable import를 사용하지 않아도 문제가 일어나지 않았다.

참고 페이지

STEP 3

비동기 처리 시 모든 업무시작이 출력된 후 업무완료가 출력되는 문제

문제가 발생한 출력 정상 출력
  • 원인 분석
    • 스레드의 수를 제어하지 않고 실행했기 때문에, 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()
            }

About

은행 매니저 프로젝트 저장소

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages