README - donggeonoh/bithumb-techcamp-ios-1st GitHub Wiki

README

๋น—์ธํ…Œํฌ์บ ํ”„ ์•ผ๊ณฐ ์•„์นด๋ฐ๋ฏธ

๊ฐœ์š”

ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

๋น—์ธ Public API ์‚ฌ์šฉํ•œ ์•ฑ ๊ตฌํ˜„

ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

2022.02.21 ~ 2022.03.13

ํŒ€์› ์†Œ๊ฐœ

์˜ค๋™๊ฑด(DonggeonOh) ๊น€์ง„์˜(์ œ๋กœ) ํ™ฉ์ œํ•˜(ํ—ˆํ™ฉ)
[email protected] [email protected] [email protected]
https://github.com/DonggeonOh https://github.com/z3rosmith https://github.com/HJEHA

ํ”„๋กœ์ ํŠธ ๊ธฐ์ˆ  ์Šคํƒ

  • ์•„ํ‚คํ…์ณ
    • MVC
  • ์˜์กด์„ฑ ๊ด€๋ฆฌ๋„๊ตฌ
    • Swift Pakage Manager (SPM)
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • Charts
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • Core Data
  • UI
    • 1 Storyboard, 1 ViewController
    • Modern collection view

์•ฑ ๊ตฌ๋™ ํ™”๋ฉด

์ฝ”์ธ ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด

๋ผ์ดํŠธ ๋ชจ๋“œ ๋‹คํฌ ๋ชจ๋“œ

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(์ฐจํŠธ)

๋ผ์ดํŠธ ๋ชจ๋“œ ๋‹คํฌ ๋ชจ๋“œ

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(ํ˜ธ๊ฐ€)

๋ผ์ดํŠธ ๋ชจ๋“œ ๋‹คํฌ ๋ชจ๋“œ

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(์ฒด๊ฒฐ ๋‚ด์—ญ)

๋ผ์ดํŠธ ๋ชจ๋“œ ๋‹คํฌ ๋ชจ๋“œ

์ž…์ถœ๊ธˆ ํ˜„ํ™ฉ ํ™”๋ฉด

๋ผ์ดํŠธ ๋ชจ๋“œ ๋‹คํฌ ๋ชจ๋“œ

๋”๋ณด๊ธฐ ํ™”๋ฉด

๋ผ์ดํŠธ ๋ชจ๋“œ ๋‹คํฌ ๋ชจ๋“œ

์ฃผ์š” ๊ธฐ๋Šฅ ์†Œ๊ฐœ

๋„คํŠธ์›Œํฌ

์ฝ”์–ด๋ฐ์ดํ„ฐ

  • ์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด์˜ ์ฐจํŠธ
  • ์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ ์ฐจํŠธ
  • ๊ด€์‹ฌ ์ฝ”์ธ ๋ชฉ๋ก

์ฝ”์ธ ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด

  • ๊ด€์‹ฌ/์›ํ™” ํƒญ์œผ๋กœ ๊ด€์‹ฌ/์›ํ™” ์…€๋กœ ์Šคํฌ๋กค ๊ธฐ๋Šฅ

    ์œ ์ €๊ฐ€ ํ„ฐ์น˜๋ฅผ ํ•œ๋ฒˆ ๋” ํ•ด์„œ ๊ด€์‹ฌ๋ชฉ๋ก์— ์ ‘๊ทผํ•  ํ•„์š” ์—†์ด ํ•œ ํ™”๋ฉด์—์„œ ๊ด€์‹ฌ/์›ํ™” ๋ชฉ๋ก์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•œ ํ™”๋ฉด์— ๊ด€์‹ฌ/์›ํ™” ๋ชฉ๋ก์„ ๋„ฃ์—ˆ์Œ

  • ์ฝ”์ธ๋ช… ๋ฐ ์‹ฌ๋ณผ๋กœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
  • ์ธ๊ธฐ์ˆœ(์ตœ๊ทผ 24์‹œ๊ฐ„ ๊ฑฐ๋ž˜๊ธˆ์•ก ๊ธฐ์ค€), ์ด๋ฆ„์ˆœ, ํ˜„์žฌ๊ฐ€์ˆœ, ๋ณ€๋™๋ฅ ์ˆœ ์ •๋ ฌ ๊ธฐ๋Šฅ
  • ์…€ ์Šฌ๋ผ์ด๋“œ ์‹œ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ”๊ฐ€
  • ํ˜„์žฌ๊ฐ€ ๋ฐ ๋ณ€๋™๋ฅ  ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด

  • ์›น์†Œ์ผ“์„ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜(ํ˜„์žฌ๊ฐ€, ๋ณ€๋™๊ฐ€, ๋ณ€๋™๋ฅ )
  • ์ฐจํŠธ ๊ตฌํ˜„ (์ตœ๊ทผ 3๊ฐœ์›” ์‹œ๊ฐ€ ๊ธฐ์ค€)

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(์ฐจํŠธ)

  • ์‹œ๊ฐ„(1๋ถ„, 10๋ถ„, 30๋ถ„, 1์‹œ๊ฐ„, 1์ผ) ๋ณ„ ์ฐจํŠธ ๋ฐ์ดํ„ฐ ํ‘œ์‹œ
  • ์ฐจํŠธ์˜ ์บ”๋“ค์Šคํ‹ฑ ํ„ฐ์น˜ ์‹œ ์ •๋ณด(์‹œ๊ฐ€, ๊ณ ๊ฐ€, ์ €๊ฐ€, ์ข…๊ฐ€) ํ‘œ์‹œ
  • ์›น์†Œ์ผ“์„ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์บ”๋“ค์Šคํ‹ฑ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(ํ˜ธ๊ฐ€)

  • ๋งค์ˆ˜, ๋งค๋„ ์˜์—ญ ๋ถ„๋ฆฌ
  • ์›น์†Œ์ผ“์„ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜
  • ๋งค๋„, ๋งค์ˆ˜์˜ ์ „์ฒด ์ˆ˜๋Ÿ‰์„ ํ‘œ์‹œ
  • ๋งค๋„ ๋˜๋Š” ๋งค์ˆ˜ ์…€๋งŒ ํ™”๋ฉด์— ํ‘œ์‹œ๋  ๊ฒฝ์šฐ ๋ฐ˜๋Œ€ ์ฃผ๋ฌธ์˜ ์ตœ์ €๊ฐ€, ์ตœ๊ณ ๊ฐ€ ๋ทฐ ๋…ธ์ถœ

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(์ฒด๊ฒฐ ๋‚ด์—ญ)

  • ์›น ์†Œ์ผ“์„ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ฐ˜์˜

์ž…์ถœ๊ธˆ ํ˜„ํ™ฉ ํ™”๋ฉด

  • ์ฝ”์ธ์˜ ์ž…์ถœ๊ธˆ ํ˜„ํ™ฉ ์ƒํƒœ ํ‘œ์‹œ
  • ์ฝ”์ธ๋ช…, ์‹ฌ๋ณผ ๊ฒ€์ƒ‰ ์‹œ ํ•„ํ„ฐ๋ง
  • ํ˜„ํ™ฉ ์ƒํƒœ์— ๋Œ€ํ•œ ์ „์ฒด, ์ •์ƒ, ์ค‘๋‹จ ๋ชจ์•„๋ณด๊ธฐ
  • ์ฝ”์ธ ์ด๋ฆ„, ์ž…๊ธˆ, ์ถœ๊ธˆ ์ˆœ์œผ๋กœ ์ •๋ ฌ

๋”๋ณด๊ธฐ ํ™”๋ฉด

  • ํŒ€์›๋“ค์˜ ์ •๋ณด ๋ฐ ๋ผ์ด์„ผ์Šค๋ฅผ ํ•œ ํ™”๋ฉด์— ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œ์‹œ

ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

๋„คํŠธ์›Œํฌ

์ฝ”์–ด๋ฐ์ดํ„ฐ

  • CoreDataManger๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•  ์ง€
    • fatalError

์ฝ”์ธ ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด

  • ์ „์ฒด์ฝ”์ธ๋ชฉ๋ก(์›ํ™”)์—์„œ ๊ด€์‹ฌ์ฝ”์ธ๋ชฉ๋ก์œผ๋กœ Coin์„ ๋ณต์‚ฌ๋ฅผ ํ•  ๊ฒฝ์šฐ diffable data source์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

    Coin์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜๋ฉด Coin์˜ hash value๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— Coin์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ ๊ฐ€์ง„ UUID๊ฐ’์ด ๋‹ค๋ฅด๋„๋ก ํ•˜๊ฒŒ ํ•ด์„œ ํ•ด๊ฒฐํ•˜์˜€์Œ

  • ๊ด€์‹ฌ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  data source์— snapshot์„ applyํ•˜์—ฌ๋„ ๊ด€์‹ฌ ๋ฒ„ํŠผ ๋ณ€ํ™”๊ฐ€ ๋ฐ˜์˜์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ

    Diffable data source๋Š” hash value๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š”๋ฐ, ์ด๋•Œ๊นŒ์ง€๋Š” item identifier์„ Hashableํ•˜๊ฒŒ ๋งŒ๋“ค ๋•Œ UUID๋งŒ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํŠผ์˜ select ์ƒํƒœ ๊ฐ์ง€๋ฅผ ๋ชปํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Œ item identifier๋ฅผ Hashableํ•˜๊ฒŒ ๋งŒ๋“ค ๋•Œ item identifier์˜ property ๋ชจ๋‘๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก hash(into hasher:) ํ•จ์ˆ˜์™€ static func == ํ•จ์ˆ˜ ์ •์˜๋ฅผ ์•„์˜ˆ ๋นผ๋ฒ„๋ฆผ์œผ๋กœ์„œ ํ•ด๊ฒฐ

  • coinListCollectionView์˜ datasource ํด๋ž˜์Šค๊ฐ€ ์ฝ”์ธ์˜ ์ •๋ ฌ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ• ์ง€ ๊ณ ๋ฏผ

    datasourceํด๋ž˜์Šค๊ฐ€ ์ •๋ ฌ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๋ฉด ViewController์˜ ์ผ์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์„๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ ๋” ๋‚˜์•„๊ฐ€ datasourceํด๋ž˜์Šค๊ฐ€ ํ†ต์‹  ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๋ฉด ๊ตณ์ด MVVMํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  MVCํŒจํ„ด์—์„œ๋„ ViewController์˜ ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒ

  • ์ฒ˜์Œ์— ํ˜„์žฌ๊ฐ€ ์ •ํ•˜๋ ค๊ณ  ์ „์ฒด ์ฝ”์ธ๋ชฉ๋ก์— ์žˆ๋Š” ์ฝ”์ธ๋งˆ๋‹ค ๋‹ค transaction api๋ฅผ ํ˜ธ์ถœ(192๋ฒˆ)ํ•˜๋ ค๊ณ ํ–ˆ์Œ. ํ•˜์ง€๋งŒ ๋ณด์—ฌ์ง€๋Š” ์…€๋งŒ ํ†ต์‹ ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋ณด์—ฌ์ง€๋Š” ์…€๋งŒ ํ†ต์‹ ์„ ํ•˜๋Š”๊ฑธ๋กœ ๊ตฌํ˜„. ํ•˜์ง€๋งŒ ๋˜ ๊ทธ๋ ‡๊ฒŒํ•˜๋‹ˆ ์ „์ฒด ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ์Œ. ๋‹ค์‹œ 192๋ฒˆ ํ˜ธ์ถœํ•˜๋Š”๊ฑฐ๋กœ ๋ฐ”๊ฟˆ, 192๋ฒˆ ํ˜ธ์ถœ ํ›„ ๋ชจ๋‘ ์™„๋ฃŒ๋์Œ์„ ํ™•์ธ์„ ์–ด๋–ป๊ฒŒ ํ• ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผ

    192๋ฒˆ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ํƒœ์Šคํฌ๋กœ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ๋Š” DispatchGroup์„ ์ด์šฉํ•˜์—ฌ ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Œ

  • ์ฝ”์ธ๋ชฉ๋ก์„ sortํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ์†ŒํŠธํ•  ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ๋„ฃ๊ณ  ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ ๋‹ค์‹œ ์†ŒํŠธํ•  ๋ฆฌ์ŠคํŠธ์— ๋Œ€์ž…ํ•˜๋Š” ๋ฐฉ์‹์„ ์ผ์—ˆ๋Š”๋ฐ, ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์–ด๋ ค์›€์ด ์žˆ์—ˆ์Œ

    Array์˜ private extension์œผ๋กœ filter์™€ sortedํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ™” ์‹œํ‚ด

  • ์ฝ”์ธ๋ชฉ๋ก์„ ์Šคํฌ๋กคํ• ๋•Œ ์„น์…˜ ํ—ค๋” ๋ทฐ๊ฐ€ ๊ฑธ์น˜๋Š” ์‹œ์ ์— ๊ด€์‹ฌ/์›ํ™” ํƒญ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ ํƒ๋˜๋„๋ก ํ•ด์•ผํ•˜๋Š”๋ฐ ์„น์…˜ ํ—ค๋” ๋ทฐ๊ฐ€ ๊ฑธ์น˜๋Š” ์‹œ์ ์„ ์•Œ์•„๋‚ด๊ธฐ๊ฐ€ ์–ด๋ ค์›€

  • ํ˜„์žฌ๊ฐ€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ถ€๋ถ„์˜ DispatchGroup์ ์šฉ์ด ์ž˜ ์•ˆ๋˜์„œ ๋ฐฉ๋ฒ• ์ฐพ๋Š” ์ค‘

  • ์›น์†Œ์ผ“ ์ ์šฉ์‹œ ์ฝ”์ธ ๋ชฉ๋กํ™”๋ฉด์ด ๊ณ„์† ์œ„๋กœ ์กฐ๊ธˆ์”ฉ ์˜ฌ๋ผ๊ฐ€๋Š” ํ˜„์ƒ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ๊ณ ๋ฏผ ์ค‘

  • ์›น์†Œ์ผ“ ์ ์šฉ ์‹œ ์Šคํฌ๋กค ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ

    ์ „์ฒด๋ฅผ data source์— apply ํ•˜์ง€ ์•Š๊ณ  ๋ณด์ด๋Š” visible cell๋งŒ applyํ•จ์œผ๋กœ์„œ ํ•ด๊ฒฐ

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(์ฐจํŠธ)

  • Candlestick API์˜ ๊ฐ€์žฅ ์ตœ์‹  ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๊ธฐ์ค€๊ณผ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋ฌธ์ œ

    ์˜ˆ๋ฅผ๋“ค์–ด, 24์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด ์ œ์ผ ๋งˆ์ง€๋ง‰(์ตœ์‹ ) ๋ฐ์ดํ„ฐ๋Š” ์ด์ „ 12์‹œ(์ž์ •)์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ 1์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„˜์–ด์™”์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด WebSocket Ticker API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•, ํ˜„์žฌ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ์บ”๋“ค์Šคํ‹ฑ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•  ์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ํ•ด๊ฒฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ตœ๊ทผ ๋ฐ์ดํ„ฐ์™€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ์˜ time์„ Epoch timestamp๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ๋‘˜์˜ ํƒ€์ž„์Šคํƒฌํ”„ ๊ฐ„ ์ฐจ์ด๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋‹จ์œ„(30๋ถ„, 1์‹œ๊ฐ„ ๋“ฑ..)๋งˆ๋‹ค์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ๊ณ„์‚ฐ ํ›„ ๋‘˜ ๊ฐ„ ์ฐจ์ด ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์—…๋ฐ์ดํŠธ ํ˜น์€ ์บ”๋“ค์Šคํ‹ฑ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

  • Charts ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ X์ถ•์„ ๋‚ ์งœ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•  ๋•Œ์˜ ๋ฌธ์ œ์ 

    X์ถ•์„ ๋‚ ์งœ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ•ด์ค„ ๋•Œ DefaultAxisValueFormatter ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปค์Šคํ…€์„ ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ•ด๋‹น ํด๋ž˜์Šค๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์บ”๋“ค์Šคํ‹ฑ์˜ ์บ”๋“ค๋ฐ”๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ, X์ถ•์„ Epoch time์œผ๋กœ ์žก์•˜๋Š”๋ฐ X์ถ•์˜ ๊ฐ’์ด ๋„ˆ๋ฌดํฌ๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•  ๋ทฐ์˜ ๋„“์ด๊ฐ€ ์กฐ๊ทธ๋งฃ๊ฒŒ ๋œ๋‹ค๋Š” ๋‹ต๋ณ€์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, X์ถ•์„ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๋ฐ์ดํ„ฐ ํฌ๋งท์€ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ Epoch timestamp ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ IndexAxisValueFormatter๋ฅผ ํ†ตํ•ด ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ์ฒ˜์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹  ํ•  ๋•Œ ๊ทธ๋ž˜ํ”„์— ๋ถ„ํฌํ•œ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ, ์ตœ๊ทผ ๋ถ€๋ถ„์œผ๋กœ ํ™•๋Œ€ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๊ณ ๋ฏผ
    • ๊ธฐ์กด์—๋Š” ๊ทธ๋ž˜ํ”„ ์Šค์ผ€์ผ๋ง์„ ๊ณ ์ •์œผ๋กœ ํ™•๋Œ€ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์ ์€ ๊ฐ ์ฝ”์ธ๋งˆ๋‹ค์˜ ๋ฐ์ดํ„ฐ ์–‘์ด ๋‹ฌ๋ผ ํ™•๋Œ€ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฐ’์ด ๋‹ฌ๋ผ์•ผ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์Šค์ผ€์ผ X, Y ๊ฐ’์˜ ๋ณด์ • ๊ฐ’์„ ์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜ * ๋ณด์ • ๊ฐ’์„ ์Šค์ผ€์ผ๋กœ ์žก์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ ์ฝ”์ธ๋งˆ๋‹ค ๋„ˆ๋ฌด ํ™•๋Œ€๋˜๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ถ•์†Œ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(ํ˜ธ๊ฐ€)

  • ์›น ์†Œ์ผ“์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•

    Orderbook API(Bithumb Public API)๋กœ ํ˜ธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ DataManager์— ์…‹์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. Orderbookdepth ์›น์†Œ์ผ“์œผ๋กœ ์ƒˆ๋กœ์šด ํ˜ธ๊ฐ€ ์ •๋ณด์™€ DataManager์˜ ํ˜ธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ฐ€๊ณต(๊ฐ€๊ฒฉ[key], ์ˆ˜๋Ÿ‰[value]) ๊ฐ€๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๊ฐ€๊ณตํ•œ ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ์ธ merge ์ด์šฉํ•ด ๊ฐ™์€ ๊ฐ€๊ฒฉ[key]๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ์›น์†Œ์ผ“์„ ํ†ตํ•ด ์ƒˆ๋กœ ๋“ค์–ด์˜จ ์ˆ˜๋Ÿ‰[value]์„ ์‚ฌ์šฉํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ€๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. filter๋กœ ์ˆ˜๋Ÿ‰์ด 0์ธ ๋ฐ์ดํ„ฐ๋Š” ๊ฑฐ๋ฅด๊ณ  dropLast ๋ฉ”์„œ๋“œ๋กœ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ 30๊ฐœ๊ฐ€ ๋„˜์ง€ ์•Š๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋งค์ˆ˜ ์ตœ๊ณ ๊ฐ€, ๋งค๋„ ์ตœ์ €๊ฐ€ ๋ทฐ ํ™”๋ฉด ๋…ธ์ถœ

    ํ˜ธ๊ฐ€ ํ™”๋ฉด์„ ์Šคํฌ๋กคํ•˜๋‹ค ๋ณด๋ฉด ๋งค๋„ ๋˜๋Š” ๋งค์ˆ˜ ์…€๋งŒ ํ™”๋ฉด์— ๋…ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ ๋ฐ˜๋Œ€ ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†์–ด ๋งค์ˆ˜ ์ตœ๊ณ ๊ฐ€, ๋งค๋„ ์ตœ์ €๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋ฉด ๊ฑฐ๋ž˜๋Ÿ‰์— ์ด์ ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ๊ฐ€ ํ™”๋ฉด์˜ ์ปฌ๋ ‰์…˜ ๋ทฐ์˜ delegate ๋ฉ”์„œ๋“œ ์ค‘ scrollViewDidScroll๋ฅผ ์ด์šฉํ•ด ์Šคํฌ๋กค๋  ๋•Œ๋งˆ๋‹ค ์ปฌ๋ ‰์…˜ ๋ทฐ์˜ visibleCells๋ฅผ ์ด์šฉํ•ด ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์…€์˜ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๊ณ  ์…€์˜ ์•„์ดํ…œ(Model)์˜ ํƒ€์ž…(๋งค์ˆ˜, ๋งค๋„)์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์ฃผ๋ฌธ์˜ ๋ฐ˜๋Œ€๋˜๋Š” ๋ทฐ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”์ธ ์ƒ์„ธ ํ™”๋ฉด(์ฒด๊ฒฐ ๋‚ด์—ญ)

์ž…์ถœ๊ธˆ ํ˜„ํ™ฉ ํ™”๋ฉด