Skip to content

๐Ÿ› ํฌ๋ˆ„๋งˆ์ผ“ (๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๊ณต๋™๊ตฌ๋งค ํ”Œ๋žซํผ)

Notifications You must be signed in to change notification settings

kevinkim2586/KNU_Market-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ํฌ๋ˆ„๋งˆ์ผ“ (๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๊ณต๋™๊ตฌ๋งค ํ”Œ๋žซํผ)

mockup-of-four-floating-iphone-screens-against-a-customizable-background-2904

๐Ÿ’กย ๋ฌด์Šจ ์•ฑ์ด์•ผ?

  • ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๊ณต๋™๊ตฌ๋งค ์ปค๋ฎค๋‹ˆํ‹ฐ
  • ๋Œ€๋Ÿ‰์œผ๋กœ ์‚ฌ๋ฉด ์ €๋ ดํ•œ ์ƒํ™œ์šฉํ’ˆ ์‚ด ๋•Œ, ํ•™๊ต ๊ธฐ์ˆ™์‚ฌ์—์„œ ๋ฐฐ๋‹ฌ ์Œ์‹์ด ๋จน๊ณ  ์‹ถ์€๋ฐ ๋ฐฐ๋‹ฌํŒ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ๋น„์‹ธ ๋น„์šฉ์„ ๋‚˜๋ˆ„๊ณ  ์‹ถ์„ ๋•Œ, 1+1 ํ–‰์‚ฌํ•˜๋Š” ์‡ผํ•‘๋ชฐ ์˜ท์„ ํ•˜๋‚˜๋งŒ ์‚ฌ๊ณ  ์‹ถ์„ ๋•Œ ๊ฐ™์ด ์‚ด ํ•™์ƒ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์„œ๋น„์Šค

๐ŸŽ‰ย  ์ด ๋‹ค์šด๋กœ๋“œ ์ˆ˜ 727 (2022.03.02์ผ ๊ธฐ์ค€) ๋‹ฌ์„ฑ!

  • ์•ˆ๋“œ๋กœ์ด๋“œ ์ „์šฉ ์•ฑ๊ณผ ํ•ฉํ•˜๋ฉด ์ด ๋‹ค์šด๋กœ๋“œ ์ˆ˜ 1200 ์ด์ƒ!
  • ์ด ํšŒ์›๊ฐ€์ž…์ž ์ˆ˜ 1000 ์ด์ƒ ๋‹ฌ์„ฑ!
  • ์•ฑ์Šคํ† ์–ด ์†Œ์…œ ๋„คํŠธ์›Œํ‚น ์นดํ…Œ๊ณ ๋ฆฌ 110์œ„ ๋‹ฌ์„ฑ! (2021.09.15์ผ ๊ธฐ์ค€)
  • iOS, Android, ๋ฐฑ์—”๋“œ, ๊ธฐํš์ž, ๋งˆ์ผ€ํ„ฐ๋กœ ์ง„๋กœ๋ฅผ ํฌ๋งํ•˜๋Š” ๊ฒฝ๋ถ๋Œ€ ํ•™์ƒ๋“ค์ด ๋ชจ์—ฌ ์• ๋งคํ•œ ๊ฐ•์˜ ํ”„๋กœ์ ํŠธ๋ง๊ณ  ์ œ๋Œ€๋กœ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ํ•ด๋ณด์ž ํ•˜๊ณ  ํƒ„์ƒํ•œ ์•ฑ

โ“ย ์™œ ๋งŒ๋“ค์—ˆ์–ด?

  • ๋Œ€ํ•™์ƒ๋“ค์˜ ์ง€๊ฐ‘์€ ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค. ์˜ท, ์ƒํ™œ์šฉํ’ˆ, ๋ฐฐ๋‹ฌ์Œ์‹,

    ์–ด๋–ค๊ฑธ ์‚ฌ๋”๋ผ๋„ ์ตœ๋Œ€ํ•œ ์‹ธ๊ณ  ๊ฐ€์„ฑ๋น„ ์ข‹๊ฒŒ ๊ตฌ๋งคํ•˜๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๋Ÿฐ๋ฐ ์ €๋ ดํ•˜๊ฒŒ ๊ตฌ๋งคํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋Œ€๋Ÿ‰์œผ๋กœ ๋˜๋Š” 1+1์œผ๋กœ ๊ตฌ๋งคํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

    ๊ทธ๋ž˜์„œ ๊ณต๋™๊ตฌ๋งค๋ผ๋Š”๊ฒŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ๋ถ๋Œ€ํ•™๊ต์—๋Š” ๊ณต๊ตฌ์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ๋งŽ์•„ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์นด์นด์˜คํ†ก ์˜คํ”ˆ์ฑ„ํŒ…๋ฐฉ ํ˜•ํƒœ๋กœ ๊ณต๊ตฌ ๋ชจ์ง‘์ด ๋งŽ์ด ์ด๋ฃจ์–ด์ ธ ์™”์Šต๋‹ˆ๋‹ค.

  • ํ•˜์ง€๋งŒ ์˜คํ”ˆ์ฑ„ํŒ…๋ฐฉ์€ ๊ฒŒ์‹œ๊ธ€ ํ˜•ํƒœ๋กœ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์•„ UI/UX์ ์œผ๋กœ ๋งŽ์€ ๋ถˆํŽธํ•จ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

    • ํ•œ ๋ฒˆ์— ๋งŽ์€ ๊ธ€์ด ์˜ฌ๋ผ์˜ค๋ฉด ๊ธ€์ด ๋ฌปํžˆ๊ธฐ ์ผ์‘ค
    • ์žก๋‹ด๊ณผ ์„ž์—ฌ ๊ณต๊ตฌ ๋ชจ์ง‘ ๊ธ€ ๊ตฌ๋ถ„์ด ์–ด๋ ค์›€
    • ๊ณต๊ตฌ ์ฐธ์—ฌ์ž์™€ ๋ณ„๋„ ์ฑ„ํŒ…๋ฐฉ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋” ๊ฐœ์„คํ•ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ
    • ์‚ฌ๊ธฐ ๋˜๋Š” ์ž ์ˆ˜์— ๋Œ€ํ•œ ์œ„ํ—˜์„ฑ ๅคš

Screen Shot 2021-12-28 at 4 55 25 PM

โœป ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ๊ณผ ์ˆ˜์š”๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๋งŒ๋“  ์•ฑ์ด ๋ฐ”๋กœ ํฌ๋ˆ„๋งˆ์ผ“์ž…๋‹ˆ๋‹ค.

โญ๏ธ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ๊ณต๊ตฌ ๋ชจ์ง‘ ๊ธ€ ํ™•์ธ ๋ฐ ์‹ ๊ทœ ๋ชจ์ง‘ ๊ธ€ ๊ฐœ์„ค ๊ธฐ๋Šฅ
    • ๋ชจ์ง‘ ์ค‘์ธ ๊ณต๊ตฌ์™€ ๋ชจ์ง‘ ์™„๋ฃŒ๋œ ๊ณต๊ตฌ ๊ตฌ๋ณ„ ๊ฐ€๋Šฅ
    • ๋งˆ๊ฐ๋œ ๊ณต๊ตฌ๋Š” ๋ณ„๋„ ๋งˆ๊ฐ์ฒ˜๋ฆฌํ•˜์—ฌ ๋” ์ด์ƒ ์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ์ด ๋˜์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„
    • ๊ณต๊ตฌ ๊ธ€ ์ˆ˜์ • ๊ธฐ๋Šฅ
    • ๊ณต๊ตฌ ๊ธ€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
  • ์ฑ„ํŒ… ๊ธฐ๋Šฅ
    • ๊ณต๊ตฌํ•˜๊ณ  ์‹ถ์€ ํ’ˆ๋ชฉ์„ ์˜ฌ๋ฆฌ๋ฉด ์ž๋™์œผ๋กœ ์ฑ„ํŒ…๋ฐฉ ๊ฐœ์„ค โ†’ ํฌ๋ง์ž๊ฐ€ ์ฑ„ํŒ…๋ฐฉ์— ์ฐธ์—ฌํ•˜๋Š” ๋ฐฉ์‹
    • WebSocket๊ณผ StarScream ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ
    • Socket์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด FCM์„ ํ†ตํ•ด ๊ฐœ์ธ ์•Œ๋ฆผ ๋ฐœ์†ก ๊ฐ€๋Šฅ
    • ์ฑ„ํŒ… ์ฐธ์—ฌ, ๋‚˜๊ฐ€๊ธฐ, ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž Ban ๊ธฐ๋Šฅ
    • ์‚ฌ์ง„ ๋ณด๋‚ด๊ธฐ ๊ธฐ๋Šฅ

๐ŸŒ„ย ์Šคํฌ๋ฆฐ์ƒท ๋ฐ ๋ฐ๋ชจ ์˜์ƒ

๋ฐ๋ชจ ์˜์ƒ ๋งํฌ : https://drive.google.com/file/d/1AWt3Opp9z7dmQ26cTil_KCyJ1GYzKdyv/view?usp=sharing

โš™๏ธย Architecture

  • MVVM (ReactorKit)

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ปย Team

  • iOS ๊ฐœ๋ฐœ์ž 1๋ช…
  • Android ๊ฐœ๋ฐœ์ž 2๋ช…
  • ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž 1๋ช…
  • ๊ธฐํš์ž 2๋ช…

โœ‹๐Ÿปย ๋งก์€ ๋ถ€๋ถ„

  • iOS ์•ฑ ์ „์ฒด ๊ฐœ๋ฐœ
    • v 1.1 ์ถœ์‹œ ์ดํ›„ iOS ๊ฐœ๋ฐœ์ž 1๋ช…์ด ๋” ํˆฌ์ž…๋˜์–ด ํ˜‘์—… ์ค‘
  • ๊ฐœ๋ฐœํŒ€์žฅ
    • ์ „์ฒด ๊ฐœ๋ฐœ ์ผ์ • ์กฐ์œจ ๋ฐ ํŒ€ ์ „์ฒด์™€ ํ•จ๊ป˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐฉ์•ˆ ํ† ๋ก  ์ฃผ๋„
    • ๋ชจ๋‘๊ฐ€ ์ดˆ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— iOS, Android์™€ ๋ฐฑ์—”๋“œ ๋‹ด๋‹น ํŒ€์›๋“ค๊ณผ ์ˆ˜๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์›ํ™œํ•œ ์ค‘์žฌ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ˆœ์กฐ๋กœ์šด ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋””์ž์ธ
    • ์ดˆ๊ธฐ์— ๋””์ž์ด๋„ˆ๋ฅผ ๊ตฌํ•˜์ง€ ๋ชปํ•ด ์ œ๊ฐ€ Figma๋กœ ํ”„๋กœํ† ํƒ€์ดํ•‘์„ ์ง„ํ–‰ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽ™ย ์œ ์ € ํ”ผ๋“œ๋ฐฑ ๋ฐ›๊ณ  ๊ฐœ์„ ํ•œ ์ 

  • ์‹ค์ œ ์œ ์ €์˜ ํ”ผ๋“œ๋ฐฑ์„ ์ง€์†์ ์œผ๋กœ ๋ฐ›๊ณ  ์‹ถ์–ด โ€œ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฑด์˜์‚ฌํ•ญ ๋ณด๋‚ด๊ธฐโ€๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฑด์˜์‚ฌํ•ญ์ด ์ ‘์ˆ˜๋˜๋ฉด ํŒ€์ด ์“ฐ๋Š” ํ˜‘์—…ํˆด๊ณผ ์ฆ‰์‹œ ์—ฐ๋™์ด ๋˜์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ์–ด๋–ค ๋ถˆํŽธํ•จ์„ ๋Š๋ผ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

[ ํ”ผ๋“œ๋ฐฑ ๋ฐ›๊ณ  ๊ฐœ์„  ๋ฐ ์ถ”๊ฐ€ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ ]

  • ์ฑ„ํŒ…๋ฐฉ์—์„œ ์‚ฌ์ง„ ๋ณด๋‚ด๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ์ฑ„ํŒ…๋ฐฉ/๊ณต๊ตฌ๊ธ€์—์„œ ์ƒ๋Œ€๋ฐฉ์ด ๋งํฌ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด URL๋กœ ์ธ์‹ํ•˜๊ณ  ์ด๋ฅผ ํƒญํ–ˆ์„ ๋•Œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ด๋™
  • ๊ธฐ์กด ๋‹จ๋ฐฉํ–ฅ์ด๋˜ ๊ฑด์˜์‚ฌํ•ญ ๋ณด๋‚ด๊ธฐ ๊ธฐ๋Šฅ์„ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”๊ฟ” ๊ฐœ๋ฐœํŒ€๊ณผ ์‹ค์ œ 1:1 ๋ฌธ์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ๋ณ€๊ฒฝ
  • ๊ธฐ์กด ํ•™์ƒ ์ธ์ฆ ๋ฐฉ์‹์ธ ์›น๋ฉ”์ผ ์ธ์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ถˆํŽธ ์ ‘์ˆ˜๊ฐ€ ๋งŽ์•„ ๋ชจ๋ฐ”์ผ ํ•™์ƒ์ฆ ์บก์ณ (OCR ๊ฒ€์‚ฌ) ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • Firebase Dynamic Link๋ฅผ ์ด์šฉํ•œ ๊ณต๊ตฌ๊ธ€ ๊ณต์œ  ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ๊ณต๊ตฌ๊ธ€ ์ •๋ ฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (โ€™๋ชจ์ง‘ ์ค‘ ์šฐ์„ โ€™, ์ตœ์‹ ์ˆœโ€™)

๐Ÿ› ย v 1.0 ์ถœ์‹œ ์ดํ›„ ์ฝ”๋“œ ๊ฐœ์„ ์‚ฌํ•ญ (Refactoring)

โœ…ย  ์Šคํ† ๋ฆฌ๋ณด๋“œ โ†’ 100% Code-based layout์œผ๋กœ ์ „ํ™˜

  • ํ˜‘์—… ์‹œ ๋ฐœ์ƒํ•˜๋Š” conflict ์ตœ์†Œํ™”, ๋นŒ๋“œ ํƒ€์ž„ ๋‹จ์ถ•๊ณผ code based UI์— ๋Œ€ํ•œ ๊ฐ๊ฐ์„ ์ตํžˆ๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋˜ 40๊ฐœ ์ด์ƒ์˜ Storyboard VC์™€ XIB๋ฅผ ์ „๋ถ€ SnapKit, Then, BaseViewController๋ฅผ ์ด์šฉํ•˜์—ฌ ์ „ํ™˜

Screen Shot 2022-01-10 at 2 13 29 PM

โœ…ย  Git Flow๋ฅผ ์ด์šฉํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—… ์—ฐ์Šต

  • ์ขŒ์ธก ์‚ฌ์ง„: Git Flow ์‚ฌ์šฉ ์ „
  • ์šฐ์ธก ์‚ฌ์ง„: Git Flow ์‚ฌ์šฉ ํ›„

Screen Shot 2022-01-10 at 2 14 12 PM Screen Shot 2022-01-10 at 2 14 22 PM

โœ…ย  ํŒ€์›๊ณผ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹ค์‹œ

  • ์„œ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ด์ฃผ๊ณ  ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์—†๋Š”์ง€ ์ฒดํฌํ•˜์—ฌ ์ „์ฒด์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Screen Shot 2022-01-10 at 2 40 37 PM

โœ…ย  Shared Instance ์‚ฌ์šฉ ์ง€์–‘ ๋ฐ Dependency Injection ์ ์šฉ

  • Thread-safe ํ•˜์ง€ ์•Š์€ Shared instance ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ณณ์—์„œ ์ง์ ‘ ์ƒ์„ฑ ํ›„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ
  • ํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋‹ด์„ ์ค„์—ฌ์ฃผ๊ณ , ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋–ค ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์˜์กดํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด Dependency Injection ์ ์šฉ

Screen Shot 2022-01-10 at 2 22 48 PM Screen Shot 2022-01-10 at 2 47 58 PM

โœ…ย ย ReactorKit ์ „ํ™˜

  • ๊ธฐ์กด์—๋Š” View Controller์™€ ViewModel์˜ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ Delegate Pattern์„ ์ด์šฉ
  • ํ•˜์ง€๋งŒ Delegate protocol์ด ์ปค์งˆ์ˆ˜๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ ธ RxSwift๋ฅผ ์ด์šฉํ•œ ๋ฐ”์ธ๋”ฉ์ด ์ ˆ์‹คํ•ด ๋ณด์˜€์Œ
    • ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉํ•ด ๋‚˜๊ฐ€๊ธฐ ์‰ฝ๊ณ  ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•œ ReactorKit์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ์„ ํƒ ํ›„ ์ง€๊ธˆ๊นŒ์ง€ 80% ์ด์ƒ ์ „ํ™˜ ์™„๋ฃŒ
    • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋ˆˆ์— ๋„๊ฒŒ ์ข‹์•„์กŒ๊ณ , ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฆฌ์ €๋ฆฌ ํŒŒ์ผ์„ ์ฐพ๋Š” ํšŸ์ˆ˜๊ฐ€ ํ˜„์ €ํžˆ ๊ฐ์†Œ

Screen Shot 2022-01-10 at 2 28 29 PM Screen Shot 2022-01-10 at 2 30 14 PM

โœ…ย  Alamofire โ†’ Moya ์ „ํ™˜

  • ๋ชจ๋‘ ๋ณ„๊ฐœ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋˜ API ํ†ต์‹  ํ•จ์ˆ˜๋Š” ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์ง€๋‚˜์น˜๊ฒŒ ์ฝ”๋“œ์˜ ์–‘์„ ๋Š˜๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— Moya ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋ถ€ ๋ฆฌํŒฉํ† ๋ง ์™„๋ฃŒ
  • ์ขŒ์ธก ์‚ฌ์ง„: Moya ์‚ฌ์šฉ ์ „
  • ์šฐ์ธก ์‚ฌ์ง„: Moya ์‚ฌ์šฉ ํ›„

Screen Shot 2022-01-10 at 3 04 47 PM Screen Shot 2022-01-10 at 3 04 07 PM

๐ŸŽขย ๋” ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„

  • Coordinator Pattern ์ ์šฉ

    • ๊ธฐ์กด MVVM ๊ตฌ์กฐ์—์„œ Coordinator ํŒจํ„ด์„ ์ ์šฉ์‹œํ‚จ MVVM-C ๊ตฌ์กฐ๋ฅผ ์ ์šฉํ•ด Navigation Logic์„ ViewController์™€ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ
      • RxFlow ์ ์šฉ ์™„๋ฃŒ
  • ์ฑ„ํŒ… Local Caching

    • ์ฑ„ํŒ… ๋ชฉ๋ก ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๊ฐ€ ํ˜„์žฌ๋Š” API ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, Local Caching์„ ์ด์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์—ฌ ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ด ๋ณด์ธ๋‹ค.
      • Realm ๋˜๋Š” CoreData๋ฅผ ์ด์šฉํ•œ Local Caching ์ ์šฉ ์˜ˆ์ •
  • Unit Test ์ ์šฉ

    • ๊ธฐ๋Šฅ์ด ์ ์  ๋งŽ์•„์ง€๋ฉด์„œ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ๋„ ๋งŽ์•„์ง€๊ณ  ๊นœ๋นกํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†ํ›„
    • Index out of range error, UI error, nil ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ์—๋Ÿฌ๋ฅผ ์ž๋™์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ Unit Test ๊ฐ€ ์ ˆ์‹คํ•ด๋ณด์ž„
      • Unit Test ์ ์šฉ ์˜ˆ์ •
  • Fast Lane ๋„์ž…์œผ๋กœ ๋ฐฐํฌ ์ž๋™ํ™”

    • v1.0, 1.0.1, 1.1, 1.1.1 ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์„ ์•ฑ์Šคํ† ์–ด์— ๋ฐฐํฌํ•˜๋ฉด์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ญ๋น„๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์—…๋กœ๋“œ ์‹œ๊ฐ„๊ณผ ์‹ฌ์‚ฌ ์ œ์ถœ ์ค€๋น„ ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์Œ
    • ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚ญ๋น„๋˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ผ ํ•„์š”๊ฐ€ ์žˆ์–ด๋ณด์ž„.
      • Fast Lane ๋„์ž… ์˜ˆ์ •

๐Ÿง ์–ด๋ ค์› ๋˜ ์ 

โœ…ย  ๋ฐฑ์—”๋“œ์™€ ์ฒซ ํ˜‘์—…

  • ์ฒ˜์Œ์œผ๋กœ ๋ฐฑ์—”๋“œ์™€ ํ˜‘์—…์„ ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์˜€์Šต๋‹ˆ๋‹ค. iOS ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด์„œ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ํˆฌ์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฒ˜์Œ ๋“ค์–ด๋ณด๋Š” ์ˆ˜๋งŽ์€ ์šฉ์–ด๋“ค ๐Ÿคฏ: JWT, AccessToken, RefreshToken, MultipartFormData, JSON Encoding, PostMan, ERD, FCM ๋“ฑ๋“ฑ..
    • ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ๊ณต๋ถ€ํ•˜๊ณ , ํŒ€์›๊ณผ ํ•จ๊ป˜ ๋‚˜์•„๊ฐ„๋‹ค๋Š” ๋งˆ์ธ๋“œ๋กœ ์ •๊ธฐ์ ์œผ๋กœ ์Šคํ„ฐ๋”” ์„ธ์…˜์„ ์—ด์–ด ๊ฐœ๋…์„ ์ตํžˆ๊ณ  ํ”„๋กœ์ ํŠธ์— ๊ฐœ๋…์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์ˆ˜์‹ญ๊ฐœ์˜ ๊ฐ๊ฐ ๋‹ค๋ฅธ API..์–ด๋–ค๊ฑด query string, ์–ด๋–ค๊ฑด multipartFormData, ๋˜ ์–ด๋–ค๊ฑด json string.. ์ฒ˜์Œ์—๋Š” ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฌ์› ์ง€๋งŒ ๋ฐฑ์—”๋“œ ํŒ€์›๊ณผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ด์•ผ๊ธฐํ•˜๊ณ  ์ธํ„ฐ๋„ท์„ ๋’ค์ ธ๊ฐ€๋ฉฐ ์–ด๋–ป๊ฒŒ๋“  API ํ†ต์‹ ์ด ์ด๋ค„์ง€๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฌด์—‡๋ณด๋‹ค, ํ˜‘์—…์ด ์ฒ˜์Œ์ด๋‹ค๋ณด๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด ํ”„๋ก ํŠธ ๋ฌธ์ œ์ธ์ง€ ๋ฐฑ์—”๋“œ ๋ฌธ์ œ์ธ์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์— ์ œ์ผ ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐฑ์—”๋“œ ๋ฌธ์ œ๋ผ๋„ ์™œ ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ ๊ฐ™์€์ง€, ๋‚˜๋Š” ๋ฌด์—‡์„ ์‹œ๋„ํ•ด๋ดค๊ณ  ์ด๋ ‡๊ฒŒ ํ•ด๋„ ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฑ์—”๋“œ ํŒ€์›์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•˜๋ฉฐ ์†Œํ†ตํ•˜๋Š” ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฅด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

โœ…ย  ์ฑ„ํŒ… ๊ธฐ๋Šฅ (WebSocket)

  • ์ œ์ผ ๋ง‰๋ง‰ํ–ˆ์—ˆ๊ณ  ์ œ์ผ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ๋‹จ์ˆœํžˆ ์ฑ„ํŒ… ๋‚ด์šฉ์ด ์™”๋‹ค๊ฐ”๋‹คํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ์‹ค์‹œ๊ฐ„์„ฑ ๋ณด์žฅ + ์ด์ „ ์ฑ„ํŒ… ๋ถˆ๋Ÿฌ์˜ค๊ธฐ + Socket์ด ๋Š๊ธฐ๋ฉด FCM ๋ณด๋‚ด๊ณ  ์•Œ๋ฆผ ๋ฐ›๊ธฐ ๋“ฑ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•˜๊ณ  ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์•„ ์ดˆ๋ณด ์ž…์žฅ์—์„œ ๋งŽ์ด ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
  • ๊ด€๋ จ ๋ฌธ์„œ๋‚˜ ๋ธ”๋กœ๊ทธ๋„ ๊ฑฐ์˜ ์—†์–ด ๋งจ ๋•…์— ํ—ค๋”ฉํ•˜๋“ฏ ์ˆ˜ ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ๋งž๋‹ฅ๋œจ๋ฆฌ๋ฉด์„œ ๊ตฌํ˜„์— ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

โœ…ย  ์ˆ˜ ๋งŽ์€ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ƒ๊ฐ

  • ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ๋Š” ํ•ญ์ƒ Golden Path์„ ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‹ค์ œ ์œ ์ €๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์ƒํ•˜์ง€๋„ ๋ชปํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์•ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ชธ์†Œ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.
  • 1.0 ์ถœ์‹œ ํ›„ ์ˆ˜๋ฐฑ๋ช…์ด ๋ชฐ๋ ธ์„ ๋•Œ ๊ฐ์ข… crash/error ๋กœ๊ทธ๊ฐ€ Crashlytics์™€ ์ž์ฒด ์„œ๋ฒ„์— ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹์€ ๋•€์„ ํ˜๋ ธ์Šต๋‹ˆ๋‹ค.
    • iOS, Android, ๋ฐฑ์—”๋“œ ํ•  ๊ฒƒ ์—†์ด ์‚ฌ์ „์— ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ฌธ์ œ๊ฐ€ ๋‹ค์ˆ˜ ๋ฐœ์ƒํ•ด ๊ธ‰ํ•˜๊ฒŒ 1.0.1, 1.0.2 ๋ฒ„์ „ ๋“ฑ์„ ๋ฐฐํฌํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

โ†’ ๋‹ค์–‘ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์„ ๋Š๊ผˆ๊ณ  ๊ฐ ์—๋Ÿฌ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์žํ•œํ…Œ ์ ์ ˆํ•˜๊ฒŒ UI๋กœ ํ‘œ์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œย ๋ฐฐ์šด ์ 

  • REST API ์—ฐ๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ๊ณ  ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Web Socket์„ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Storyboard์™€ Code-Based Layout ๋‘ ๊ฐœ ๋ชจ๋‘ ํ™œ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ ๋‘˜ ์‚ฌ์ด์˜ ์žฅ๋‹จ์ ์„ ๋ชธ์†Œ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • BaseViewController, Moya ๋“ฑ์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ณ ๋ฏผ์„ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Dependency Injection์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์™œ ํ•„์š”ํ•œ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Delegate Pattern์˜ ํ•œ๊ณ„๋ฅผ ๋Š๋ผ๊ณ  RxSwift์™€ ReactorKit์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ง์ ‘ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • โ€œ ํ•˜์œ„ ํ˜ธํ™˜ "๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๊ณ ๋ฏผํ•˜๊ณ  ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (ํฌ๋ˆ„๋งˆ์ผ“ ์•ฑ ๋ฒ„์ „ & iOS ๋ฒ„์ „)
    • ๋ฌด์กฐ๊ฑด ์ตœ์‹  ์•ฑ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ์ €๋งŒ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ , ์ด์ „ ๋ฒ„์ „ ๊ณผ ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ์ž๋“ค์ด ์„œ๋กœ ํ˜ธํ™˜๋  ์ˆ˜ ์žˆ๊ฒŒ UI์™€ Model ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐ŸŽ‰ย  ๊ทธ ์™ธ ๋งˆ์ผ€ํŒ… ํ™œ๋™

โœ…ย  ์ธ์Šคํƒ€๊ทธ๋žจ ํ™๋ณด ๊ณ„์ • ๊ฐœ์„ค

โœ…ย  ์ธํ„ฐ๋ทฐ ์˜์ƒ ์ดฌ์˜

โœ…ย  ๊ฒฝ๋ถ๋Œ€ ์‹ ๋ฌธ ์ธํ„ฐ๋ทฐ

Screen Shot 2022-01-12 at 1 34 03 PM


โš ๏ธย โ€ํฌ๋ˆ„๋งˆ์ผ“โ€ ์•ฑ์„ ์ง์ ‘ ๋‹ค์šด ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜์‹œ๋ ค๋ฉด ๊ฒฝ๋ถ๋Œ€ํ•™๊ต ํ•™์ƒ ์ธ์ฆ์„ ๊ฑฐ์ณ์•ผ์ง€๋งŒ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

-> ๋”ฐ๋ผ์„œ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด [email protected] ์œผ๋กœ ์„ฑํ•จ๊ณผ ์‚ฌ์œ ๋ฅผ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์‚ฌ์šฉํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ๋„๋ก ํ…Œ์ŠคํŠธ ๊ณ„์ •์„ ์ž„์‹œ๋กœ ๋ณด๋‚ด๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

-> ํ˜„์žฌ ๋ณด๊ณ  ๊ณ„์‹œ๋Š” Repository๋Š” Fork๊ฐ€ ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์‹ค์ œ Repo๋Š” private organization์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ง€์† ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋ฐ‹ ๊ธฐ๋ก๊ณผ ์ฝ”๋“œ๋Š” ์‹ค์ œ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

About

๐Ÿ› ํฌ๋ˆ„๋งˆ์ผ“ (๊ฒฝ๋ถ๋Œ€ํ•™๊ต ๊ณต๋™๊ตฌ๋งค ํ”Œ๋žซํผ)

Resources

Stars

Watchers

Forks

Packages

 
 
 

Languages