Giter Club home page Giter Club logo

ios-bank-manager's Introduction

πŸ’°μ€ν–‰μ°½κ΅¬ λ§€λ‹ˆμ €πŸ’°

λͺ©μ°¨

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

1.μ†Œκ°œ

  • μ€ν–‰μ˜ 은행원듀이 고객의 업무에 λ”°λ₯Έ 일을 λ™μ‹œμ— μ²˜λ¦¬ν•˜λŠ” μ•±μž…λ‹ˆλ‹€.

2.νŒ€μ›

Baem bella
@Dylan-Yoon @hyhy0429

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 μž‘μ„±

4.λ‹€μ΄μ–΄κ·Έλž¨

UML

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

STEP 1, 2 STEP 3

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

    • SwiftLint github의 μ„€μΉ˜μ™€ κ΄€λ ¨λœ 뢀뢄을 μ‚΄νŽ΄λ³΄λ‹ˆ, SPM이 μ•„λ‹Œ CocoaPod μ‚¬μš©μ„ ꢌμž₯ν•˜κ³  μžˆλŠ” 것을 μ•Œκ²Œ λ˜μ–΄ λ³€κ²½ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

큐의 μ‚¬μš©

  • μ²˜μŒμ—λŠ” LinkedList둜 λ§Œλ“  큐λ₯Ό ν™œμš©ν•˜μ—¬, 예금 큐 λŒ€μΆœ 큐 λ₯Ό λ”°λ‘œ λ§Œλ“€κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, Bank νƒ€μž… 내뢀에 예금 λ§€λ‹ˆμ € 2λͺ…κ³Ό λŒ€μΆœ λ§€λ‹ˆμ € 1λͺ…을 μƒμ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 예금 λ§€λ‹ˆμ €1κ³Ό λŒ€μΆœλ§€λ‹ˆμ €1μ—κ²Œ 각 고객 λŒ€κΈ°μ—΄μ—μ„œ 고객을 κΊΌλ‚΄ 일을 ν• λ‹Ήν•˜λŠ” 것이 κ°€λŠ₯ν–ˆμœΌλ‚˜, 예금 κ³ κ°λŒ€κΈ°μ—΄μ„ μ˜ˆκΈˆλ§€λ‹ˆμ €1 뿐만 μ•„λ‹ˆλΌ μ˜ˆκΈˆλ§€λ‹ˆμ €2μ—κ²Œλ„ ν• λ‹Ήν•˜λŠ” κ²ƒμ—λŠ” μ‹€νŒ¨ν•˜κ²Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. 고민을 ν•˜λ‹€κ°€, μ—…λ¬΄μ²˜λ¦¬λ₯Ό λ§€λ‹ˆμ € 객체λ₯Ό μƒμ„±ν•΄μ„œ λΆ„λ‹΄ν•˜λŠ” 것이 μ•„λ‹Œ μŠ€λ ˆλ“œμ˜ κ°œλ…μ—μ„œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμœΌλ‘œ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

DispatchSemaphore μ‚¬μš©

  • μœ„μ˜ 과정에 기재된 것과 같이, μ—…λ¬΄μ²˜λ¦¬λ₯Ό μŠ€λ ˆλ“œμ˜ κ°œλ…μ—μ„œ μ²˜λ¦¬ν•˜κ³ μž ν•˜λŠ” κ΅¬ν˜„κ³Όμ •μ—μ„œ, 각 업무λ₯Ό global.async λ₯Ό μ΄μš©ν•˜μ—¬ 보낼 κ²½μš°μ—, λžœλ€ν•˜κ²Œ μƒμ„±ν•œ 고객 수 만큼(ν•„μš”ν•œ 만큼) μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, DispatchSemaphore와 SerialQueue 두 가지 방법 쀑에 κ³ λ―Όν•˜κ²Œ λ˜μ—ˆμœΌλ©° 예금 업무와 λŒ€μΆœ 업무λ₯Ό μ²˜λ¦¬ν•˜λŠ” μŠ€λ ˆλ“œμ˜ 개수λ₯Ό μ œν•œν•˜κ³ μž DispatchSemaphore의 value λ₯Ό μ΄μš©ν•˜μ—¬ μ§€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν΄λ‘œμ €μΊ‘μ³ 였λ₯˜μ— λ”°λ₯Έ Struct -> Class νƒ€μž… λ³€κ²½

  • struct Bankmanager 의 νƒ€μž…μ΄ Struct일 λ•Œ, Bank의 DispatchQueue μ—μ„œ μ‚¬μš©ν•˜λ©΄ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 값이 이미 캑쳐가 λ˜μ–΄μžˆμ–΄ 변경이 λΆˆκ°€ν•˜κΈ°μ— μœ„μ™€ 같은 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μΊ‘μ³λ“œ 리슀트λ₯Ό ν™œμš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜κ³ μž ν•˜μ˜€μœΌλ‚˜, μΊ‘μ³λ“œ 리슀트 μ—­μ‹œ κ°’ 변경은 λΆˆκ°€ν•˜μ˜€κΈ°μ— μ°Έμ‘°νƒ€μž…μ΄ μ•„λ‹Œ κ°’νƒ€μž…μœΌλ‘œ λ°”κΎΈμ–΄ 문제λ₯Ό ν•΄κ²°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

초기 섀계와 ν˜„μž¬ κ΅¬ν˜„μ˜ 차이

  • 처음 섀계 μ‹œμ—λŠ”, 예금 λŒ€κΈ°μ—΄κ³Ό λŒ€μΆœ λŒ€κΈ°μ—΄μ„ λ§Œλ“€κ³  예금 λ‹΄λ‹Ή 은행원(2), λŒ€μΆœ λ‹΄λ‹Ή 은행원(1) 및 μ€ν–‰μ°½κ΅¬μ˜ κ°œλ…μ΄ λ‹΄κΈ΄ 객체λ₯Ό μƒμ„±ν•˜μ—¬ 업무λ₯Ό ν• λ‹Ήν•˜κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, ν•˜λ‚˜μ˜ 예금 λŒ€κΈ°μ—΄μ˜ 고객듀을 두 λͺ…μ˜ μ€ν–‰μ›μ—κ²Œ λΆ„λ°°ν•˜λŠ” μž‘μ—…(whileλ¬Έ 이용 μ‹œ, 이미 μ˜ˆκΈˆλ‹΄λ‹Ή 은행원1이 λͺ¨λ‘ 고객을 dequeueν•œ 상황)이 λΆˆκ°€ν•˜κ²Œ λ˜μ–΄, μΌν•˜λŠ” μ€ν–‰μ›μ˜ κ°œλ…μ„ μŠ€λ ˆλ“œμ˜ κ°œλ…μ— μ μš©ν•˜κ³ μž ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법 λ°©λ²•μœΌλ‘œλŠ” ν™€μˆ˜λ²ˆμ§Έ 짝수번째둜 각각 ν• λ‹Ήν•˜λŠ” 방법이 μžˆμ„ 수 μžˆμ§€λ§Œ 은행원이 μ—¬λŸ¬λͺ…일 경우 λ³΅μž‘ν•΄ 질 κ²ƒμœΌλ‘œ μ˜ˆμƒν•΄μ„œ λ‹€λ₯Έ 방법을 μ°Ύμ•„ 보고자 ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, μœ„μ˜ μ‚¬μ§„μ²˜λŸΌ λ§Œμ•½ 총 6λͺ…μ˜ 고객이 μžˆμ„ λ•Œ 예금 μ°½κ΅¬μ—λŠ” 2λͺ…μ˜ 은행원이 μžˆλ‹€κ³  μƒκ°ν•΄λ΄…λ‹ˆλ‹€. λ§ν¬λ“œ λ¦¬μŠ€νŠΈμ— λ“€μ–΄μžˆλŠ” 고객듀을 ν•˜λ‚˜μ”© λΉΌμ„œ async둜 보내주면 λ™μ‹œμ— 일을 μ²˜λ¦¬ν•˜κ²Œ 될 것이며, κ³΅μœ μžμ›μΈ μ˜ˆκΈˆκ³ κ°λŒ€κΈ°μ—΄μ— μ ‘κ·Όν•  수 μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό Semaphore의 valueλ₯Ό 톡해 μ œν•œν•˜μ—¬ 2λͺ…μ”© μ—…λ¬΄μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜κ²Œ λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, μœ„μ˜ μ‚¬μ§„μ²˜λŸΌ 각 고객당 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œ μ—…λ¬΄μ²˜λ¦¬κ°€ λ˜μ–΄ 총 고객의 μˆ˜μ— λ§žλŠ” μŠ€λ ˆλ“œκ°€ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— μ–΄λ–€ 방식을 μ‚¬μš© 해야할지 λ‹€μ‹œ 고민해보아야 ν•  뢀뢄이라고 μƒκ°ν•©λ‹ˆλ‹€.

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

  • μ˜μ‘΄μ„±κ΄€λ¦¬λ„κ΅¬μ˜ κ°œλ… 이해와 적용
  • LinkedList 자료ꡬ쑰의 이해와 적용
  • Generics κ°œλ…μ΄ν•΄μ™€ 적용
  • νƒ€μž… 좔상화 및 μΌλ°˜ν™”
  • 동기 λΉ„λ™κΈ°μ˜ 이해와 적용
  • λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ° κ°œλ…μ˜ 이해
    • GCD의 이해와 ν™œμš©
  • ν΄λ‘œμ € 캑쳐와 μΊ‘μ³λ“œ 리슀트의 이해

8.참고 링크


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

ios-bank-manager's People

Contributors

hyhy0429 avatar yagom 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.