Coder Social home page Coder Social logo

ios-bank-manager's Introduction

🏦 은행창ꡬ λ§€λ‹ˆμ €

0. λͺ©μ°¨

  1. μ†Œκ°œ
  2. νŒ€μ›
  3. νƒ€μž„λΌμΈ
  4. μ‹œκ°ν™”λœ ν”„λ‘œμ νŠΈ ꡬ쑰
  5. μ‹€ν–‰ ν™”λ©΄
  6. νŠΈλŸ¬λΈ” μŠˆνŒ…
  7. 핡심 κ²½ν—˜
  8. 참고 링크

1. μ†Œκ°œ

  • 은행 업무 처리 ν”„λ‘œμ„ΈμŠ€λ₯Ό κ΅¬ν˜„ν•œ ConsoleApp
  • 은행 업무 처리 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•œ UIApp

2. νŒ€μ›

zhilly λ―Έλ‹ˆ
@zhilly11 @minii

3. νƒ€μž„λΌμΈ

[STEP-1]

  • 2022.10.31
    • ν”„λ‘œμ νŠΈ 초기 μ„€μ •
    • μ‚¬μš©μž λŒ€κΈ° Queue νƒ€μž… ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±
  • 2022.11.01
    • SwiftLint 적용
    • μ‚¬μš©μž λŒ€κΈ° Queue νƒ€μž… κ΅¬ν˜„

[STEP-2]

  • 2022.11.03
    • Console Manager νƒ€μž… κ΅¬ν˜„ 및 λ©”μ„œλ“œ κ΅¬ν˜„
    • Bank Manager νƒ€μž… κ΅¬ν˜„ 및 λ©”μ„œλ“œ κ΅¬ν˜„
    • Bank νƒ€μž… κ΅¬ν˜„ 및 λ©”μ„œλ“œ κ΅¬ν˜„
    • μ½”λ“œ λ¦¬νŒ©ν† λ§
  • 2022.11.07
    • μ½”λ“œ λ¦¬νŒ©ν„°λ§

[STEP-3]

  • 2022.11.08
    • Costomer νƒ€μž…μ— ν”„λ‘œνΌν‹° μΆ”κ°€
    • BankProcessing ν”„λ‘œν† μ½œ μ •μ˜ 및 κΈ°λ³Έ κ΅¬ν˜„
    • BankOperation νƒ€μž… κ΅¬ν˜„ 및 λ©”μ„œλ“œ κ΅¬ν˜„
    • μž‘μ—… 처리 방식을 Dispatch -> Operation으둜 μˆ˜μ •
    • Bank νƒ€μž… μΆ”κ°€ κ΅¬ν˜„
    • μž‘μ—…μ‹œκ°„μ„ κ³„μ‚°ν•˜λŠ” λ©”μ„œλ“œ κ΅¬ν˜„
    • ν”„λ‘œμ νŠΈ 및 μ½”λ“œ λ¦¬νŒ©ν† λ§

[STEP-4]

  • 2022.11.10
    • Main화면을 κ΅¬μ„±ν•˜λŠ” UIμš”μ†Œ 파일 κ΅¬ν˜„
    • ConsoleAppμ—μ„œ κ΅¬ν˜„ν•œ νŒŒμΌμ„ UIApp에 μΆ”κ°€
    • UIAppμ—μ„œ λΆˆν•„μš”ν•œ 파일 제거 및 톡합
    • 고객 업무 μˆ˜ν–‰ λ©”μ†Œλ“œ κ΅¬ν˜„
    • UI μ—…λ°μ΄νŠΈ λ©”μ„œλ“œ κ΅¬ν˜„

4. μ‹œκ°ν™”λœ ν”„λ‘œμ νŠΈ ꡬ쑰

File Tree

  • BankManagerConsoleApp
BankManagerConsoleApp
β”œβ”€β”€ BaseDataStruct
β”‚Β Β  β”œβ”€β”€ CustomerQueue.swift
β”‚Β Β  β”œβ”€β”€ LinkedList.swift
β”‚Β Β  └── Node.swift
β”œβ”€β”€ Manager
β”œβ”€β”€ Model
β”‚Β Β  β”œβ”€β”€ Bank.swift
β”‚Β Β  β”œβ”€β”€ BankBusiness.swift
β”‚Β Β  β”œβ”€β”€ BankOperationProcessing.swift
β”‚Β Β  β”œβ”€β”€ BankerOperation.swift
β”‚Β Β  └── Customer.swift
└── main.swift
  • BankManagerUIApp
BankManagerUIApp
β”œβ”€β”€ AppDelegate.swift
β”œβ”€β”€ Base.lproj
β”œβ”€β”€ Info.plist
β”œβ”€β”€ SceneDelegate.swift
β”œβ”€β”€ View
β”‚Β Β  β”œβ”€β”€ BankView.swift
β”‚Β Β  β”œβ”€β”€ Base.lproj
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ LaunchScreen.storyboard
β”‚Β Β  β”‚Β Β  └── Main.storyboard
β”‚Β Β  β”œβ”€β”€ CustomerLineScrollView.swift
β”‚Β Β  β”œβ”€β”€ QueueLabelStackView.swift
β”‚Β Β  β”œβ”€β”€ UserTopButtonStackView.swift
β”‚Β Β  └── WorkTimeLabelStackView.swift
└── ViewController
    └── BankViewController.swift

UML

  • ConsoleApp κ΅¬ν˜„ νƒ€μž…μ˜ UML ConsoleAppUML

5. μ‹€ν–‰ ν™”λ©΄

  • 큐 νƒ€μž… κ΅¬ν˜„ ν›„ ν…ŒμŠ€νŠΈ μˆ˜ν–‰κ²°κ³Ό

    testImage

  • ν•œλͺ…μ˜ 은행원이 업무λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ³Όμ •

    previewOfCmd

  • 두λͺ…μ˜ 예금 은행원과 ν•œλͺ…μ˜ λŒ€μΆœ 은행원이 λΉ„λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” κ³Όμ •

    AsyncPreview

  • UIApp κ΅¬ν˜„ ν™”λ©΄ (λ―Έμ™„μ„±)

    UICustomerScroll

6. νŠΈλŸ¬λΈ” μŠˆνŒ…

DispatchQueue의 μ‚¬μš©

  • μš”κ΅¬μ‚¬ν•­ 쀑 μ€ν–‰μ—λŠ” nλͺ…μ˜ 은행원이 κ·Όλ¬΄ν•˜κ³ , ν•œλͺ…μ˜ μ€ν–‰μ›λ§Œμ΄ 창ꡬ 업무λ₯Ό ν•œλ‹€.λΌλŠ” 문ꡬλ₯Ό μ΄ν•΄λ‚˜λŠ” κ²ƒμ—μ„œ 어렀움을 λŠλ‚€ 것 κ°™λ‹€. μ—¬λŸ¬λͺ…μ˜ 은행원은 닀쀑 μ“°λ ˆλ“œμ˜ ν™˜κ²½μ„ λ§ν•˜λŠ” 것인지, λ‹¨μˆœνžˆ μ—¬λŸ¬κ°œμ˜ 은행원 μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•΄μ•Ό ν•˜λŠ” 것인지에 λŒ€ν•΄μ„œ κ³ λ―Όν•˜κ²Œ λ˜μ—ˆκ³ , 이λ₯Ό ν•΄κ²°ν•˜μ§€ λͺ»ν•œμ±„ κ΅¬ν˜„μ„ ν•˜λ €κ³  ν•˜λ‹ˆ 어렀움을 κ²ͺ은 것 κ°™λ‹€. κ·Έλž˜μ„œ λ…Όμ˜λ₯Ό ν•˜μ—¬μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” λ°©ν–₯이 μ•„λ‹Œ, 닀쀑 μ“°λ ˆλ“œμ˜ λ°©ν–₯으둜 κ΅¬ν˜„μ„ ν•  수 μžˆλŠ” 뢀뢄이 μžˆμ„ 것 κ°™λ‹€λŠ” 결둠을 ν†΅ν•΄μ„œ 닀쀑 μ“°λ ˆλ“œμ˜ ν™˜κ²½μœΌλ‘œ κ΅¬ν˜„ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€.
  • λ˜ν•œ, 닀쀑 μ“°λ ˆλ“œμ˜ κ΄€μ μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ 은행원이 κ·Όλ¬΄ν•˜λŠ” μ‹œκ°„ λ™μ•ˆμ—λŠ” λ‹€λ₯Έ 일을 ν•  수 μ—†λŠ” 것을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ λ™κΈ°μ μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ €κ³  ν•˜μ˜€λ‹€.
  • ν•˜λ‚˜μ˜ 업무λ₯Ό μ²˜λ¦¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ 0.7μ΄ˆλΌλŠ” μš”κ΅¬μ‚¬ν•­μ΄ μžˆμ—ˆκ³ , 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ asyncAfter λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜λ €κ³  ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ, λΉ„λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— sleepλ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬μ„œ 업무 μ‹œκ°„μ„ 기닀릴 수 μžˆλ„λ‘ ν•˜μ˜€λ‹€.

μ€ν–‰μ›μ˜ 역할에 λŒ€ν•œ κ³ λ―Ό 및 문제

  • 처음 μƒκ°ν–ˆλ˜ μ˜λ„ (κ·Έλ¦Ό 1)

    thinkImage

  • Operation을 톡해 κ΅¬ν˜„ μ™„μ„± (κ·Έλ¦Ό 2)

    realImage

  • 은행원이 ν•  수 μžˆλŠ” 일의 μ˜μ—­μ€ μ–΄λ””κΉŒμ§€μΈκ°€μ— λŒ€ν•΄μ„œ κ³ λ―Όν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 은행원이 ν˜„μž¬ λŒ€μΆœ μ°½κ΅¬μ—μ„œ 일을 ν•˜κ³  μžˆμ§€λ§Œ, λ‹€λ₯Έ 업무λ₯Ό ν•˜μ§€ λͺ»ν•˜λŠ” 것은 μ•„λ‹ˆλΌκ³  μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 즉, 은행원은 μ–΄λ–€ μ†λ‹˜μ΄ 와도 업무λ₯Ό λ³Ό 수 μžˆμ–΄μ•Ό ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

  • Threadλ₯Ό 은행원이라고 μƒκ°ν•œλ‹€λ©΄, ν•œκ°œμ˜ Threadκ°€ ν•œλͺ…μ˜ 은행원이기 λ•Œλ¬Έμ— 관리가 λ”μš± μ‰¬μšΈ 것이라고 μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ κ·Έλ¦Ό 1 처럼 ν•œκ°œμ˜ κΈ€λ‘œλ²Œ νμ—μ„œ μ—¬λŸ¬κ°œμ˜ μ“°λ ˆλ“œλ‘œ 일을 ν•˜λŠ” 것에 λŒ€ν•΄μ„œ κ³ λ―Όν•˜κ³  κ΅¬ν˜„μ„ μ‹œλ„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • ν•˜μ§€λ§Œ, 은행 μ „μ²΄μ˜ λŒ€κΈ°μ—΄μ—μ„œλŠ” λΉ„λ™κΈ°μ μœΌλ‘œ 일을 μˆ˜ν–‰μ‹œμΌœμ•Ό ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€κ³ , 각각의 μ“°λ ˆλ“œμ˜ 일은 λ™κΈ°μ μœΌλ‘œ 이루어져야 ν•˜κΈ° λ•Œλ¬Έμ— λ™μΌν•œ νμ—μ„œ 일을 μ§„ν–‰ν•˜λŠ” 것은 μ μ ˆν•˜μ§€ μ•Šλ‹€κ³  μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ κ·Έλ¦Ό 2와 같이 λ‘κ°œμ˜ 큐둜 κ΅¬μ„±ν•˜κ³ , 각 큐에 λ”°λΌμ„œ λ™μ‹œμ— μˆ˜ν–‰ν•  수 μžˆλŠ” 일의 개수λ₯Ό μ‘°μ ˆμ•„μ—¬μ„œ κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • μœ„μ™€ 같이 κ΅¬ν˜„ν•˜λŠ” κ³Όμ •μ—μ„œ DispatchQueueλŠ” λ‚΄λΆ€ μž‘μ—…μ— λŒ€ν•œ μ“°λ ˆλ“œλ₯Ό μ§μ ‘μ μœΌλ‘œ μ œν•œν•˜λŠ” λ©”μ„œλ“œλ‚˜ ν”„λ‘œνΌν‹°κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— Operation νƒ€μž…κ³Ό OperationQueueλ₯Ό ν™œμš©ν•˜μ—¬μ„œ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

κ°€λ‘œ 슀크둀

문제 상황 ν•΄κ²° ν™”λ©΄
  • UIλ₯Ό κ΅¬μ„±ν•˜λ˜ 쀑, λ™μΌν•œ 클래슀둜 μ •μ˜λœ 슀크둀 λ·° 2개λ₯Ό λ‚˜λž€νžˆ 배치 ν•˜λ €κ³  ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ, 각 기기의 safeArea의 크기가 λ‹€λ₯Έ 이유둜 μΈν•΄μ„œ μ™Όμͺ½μ€ μ •ν™•ν•˜κ²Œ μ„Έλ‘œλ‘œλ§Œ 슀크둀이 λ˜μ§€λ§Œ, 였λ₯Έμͺ½μ€ μ‚¬λ°©μœΌλ‘œ 슀크둀이 κ°€λŠ₯ν•œ 상황이 λ°œμƒν•˜μ˜€λ‹€.

  • μ΄λŠ” 슀크둀 뷰의 ContentView의 κ°€λ‘œ 길이가 frameLayoutGuide의 κ°€λ‘œ 길이와 λ™μΌν•˜κ²Œν•˜μ—¬ κ°€λ‘œ μŠ€ν¬λ‘€μ„ 방지할 수 μžˆμ—ˆμ§€λ§Œ, AutoLayout μ œμ•½ 사항을 κ΅¬μ„±ν•˜λŠ” κ³Όμ •μ—μ„œ CenterX의 μ œμ•½μ‚¬ν•­μœΌλ‘œ μΈν•΄μ„œ λ°œμƒν•˜κ²Œ λ˜μ—ˆλ‹€.

  • 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‹€μ–‘ν•œ 방법을 찾게 λ˜μ—ˆλ‹€.

    1. ScrollView의 bounces ν”„λ‘œνΌν‹°λ₯Ό false둜 λ³€κ²½ν•˜μ—¬μ„œ ν™”λ©΄ μ΄μ™Έμ˜ μ˜μ—­μœΌλ‘œ 슀크둀 λ˜λŠ” 것을 λ§‰λŠ”λ²•
    2. UIScrollViewDelegateλ₯Ό 채택 ν•˜μ—¬μ„œ scrollViewDidScroll() ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ£ΌλŠ” 법
  • μš°λ¦¬λŠ” 이에 λŒ€ν•΄μ„œ 2번째 방법을 ν™œμš©ν•˜μ—¬μ„œ ScrollView의 ContentOffset.x의 값이 λ³€κ²½λ˜λŠ” 것을 λ‹€μ‹œ 0으둜 λ³€κ²½ν•˜μ—¬μ„œ κ°€λ‘œ 슀크둀이 λ˜μ§€ μ•Šλ„λ‘ ν•˜μ˜€λ‹€.

    class CustomerLineScrollView: UIScrollView, UIScrollViewDelegate {
        ...
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            if scrollView.contentOffset.x != 0 {
                scrollView.contentOffset.x = 0
            }
        }
    }

7. ν”„λ‘œμ νŠΈ μˆ˜ν–‰ 쀑 핡심 κ²½ν—˜

  • Linked-List νƒ€μž…μœΌλ‘œ Queue νƒ€μž… κ΅¬ν˜„
  • Generics νƒ€μž…μ˜ 이해
  • mutating ν‚€μ›Œλ“œμ— λŒ€ν•œ 이해
  • 동기와 비동기에 λŒ€ν•œ 이해
  • μŠ€λ ˆλ“œ κ°œλ…μ— λŒ€ν•œ 이해
  • λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ°μ˜ 이해와 ν™œμš©
    • GCD의 이해 및 κ΅¬ν˜„
    • RaceCondition을 ν•΄κ²°ν•˜λŠ” 방법
    • Operation의 이해 및 κ΅¬ν˜„
  • UIAppμ—μ„œμ˜ λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ° 적용
  • NotificationCenter의 이해 및 ν™œμš©
  • Protocol Orientied Programming에 λŒ€ν•œ 이해 및 ν™œμš©
  • μ»€μŠ€ν…€ λ·° κ΅¬ν˜„

8. 참고 링크

μ•Όκ³°λ‹·λ„· - λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ° μ•Όκ³°λ‹·λ„· - μ˜€ν† λ ˆμ΄μ•„μ›ƒ μ •λ³΅ν•˜κΈ° Concurrent Programming With GCD in Swift 3 Swift Language Guide - Subscripts Concurrency Programming Guide Swift Language Guide - Concurrency


πŸ” 맨 μœ„λ‘œ μ΄λ™ν•˜κΈ°

ios-bank-manager's People

Contributors

yagom avatar zhilly11 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.