Skip to content

๐Ÿš› ๋งˆ์ผ“์ปฌ๋ฆฌ ํด๋ก  ์ฝ”๋”ฉ ๐Ÿš›

Notifications You must be signed in to change notification settings

LeeHa-Yeon/MarketKurly_test_iOS_Yeon

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

MarketKurly_test_iOS_Yeon ( ํ•˜์—ฐ -> ์—ฐ )

๊ฐœ๋ฐœ์ผ์ง€

์ฃผ์ œ : ๋งˆ์ผ“์ปฌ๋ฆฌ A์กฐ

ํŒ€์› : ํด ( ์—ฐ ) - ์„œ๋ฒ„ ( ์Šคํ‹ฐ๋ธŒ, ์ƒ๋ฆฌ )

๋‚ด์šฉ : ๋ผ์ด์ง•์บ ํ”„ 2์ฃผ๊ฐ„ ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„ ํ˜‘์—… ํ”„๋กœ์ ํŠธ ์ง„ํ–‰

๊นƒ ๋งํฌ :

https://github.com/mock-rc3/MarketKurly_test_iOS_Yeon

์‹œ์—ฐ ์˜์ƒ

์ „์ฒด

๋งˆ์ด์ปฌ๋ฆฌ ๋ถ€๋ถ„

ํ™ˆ ํ™”๋ฉด ๋ถ€๋ถ„๋งŒ

๊ฐœ๋ฐœ

๊ฐœ๋ฐœ

  • UI
    • ์—ฌ๋Ÿฌ ๋””๋ฐ”์ด์Šค์—์„œ๋„ ๊นจ์ง์ด ์—†๋„๋ก AutoLayout๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ œ์•ฝ์กฐ๊ฑด์„ ์„ค์ •ํ•˜์˜€๋‹ค.
    • ์ƒ‰์ƒ - ์ด๋ฏธ์ง€๋ฅผ ์บก์ณํ•˜์—ฌ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ƒ‰์ƒ์€ โ€œ์›น ์‚ฌ์ดํŠธ(์ด๋ฏธ์ง€์—์„œ ์ƒ‰์ƒ ์ถ”์ถœํ•˜์—ฌ hex๋กœ ๋งŒ๋“ค๊ธฐ)โ€œ ๋ฅผ ํ†ตํ•ด Extension UIColor์— ์ €์žฅํ•ด๋‘๊ณ  ์‚ฌ์šฉํ•˜์˜€๊ณ , ๊ทธ ์™ธ ํ•œ ๋‘๋ฒˆ ์‚ฌ์šฉํ•  ์ƒ‰์ƒ์€ ์Šคํฌ์ด๋“œ๋กœ ์ถ”์ถœํ•˜์—ฌ ์‚ฌ์šฉ
    • ์ด๋ฏธ์ง€ ๋ˆ„๋ผ๋ฅผ ๋”ฐ๊ฑฐ๋‚˜ ๋น„์Šทํ•œ ํ˜•ํƒœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
  • ์ฝ”๋“œ
    • ์ฝ”๋“œ ๊ด€๋ฆฌ๋Š” MARK๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ํ”„๋กœํผํ‹ฐ, Component ๋ถ€๋ถ„, LifeCycle, Functions, objc Functions ๋“ฑ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋‹ˆ ์ฝ”๋“œ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์งˆ ๋•Œ๋„ ์ฐพ๊ธฐ๊ฐ€ ์ˆ˜์›”ํ•˜์˜€๋‹ค.

    • ์ž์ฃผ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์€ ์ฝ”๋“œ ๋นผ๋†“๊ธฐ

      • Extension๋ฅผ ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋”ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ดํ›„ ํ•„์š”ํ•œ ๊ณณ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€๋”๋‹ˆ ๋” ์ฝ”๋“œ์˜ ๊ธธ์ด๋„ ์ค„์–ด๋“ค๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•„๋ณด์˜€๋‹ค ( ํ…œํ”Œ๋ฆฟ์„ ๋ณด๊ณ  ๋ฐฐ์›€ )

        แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-03-13 แ„‹แ…ฉแ„’แ…ฎ 10 45 17
    • ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ด€๋ฆฌ

    • ์ตœ๋Œ€ํ•œ ์ฝ”๋“œ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ์‹œ๊ฐ„์ƒ ์˜ค๋ž˜๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์€ ๋ถ€๋ถ„์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉ ( ๋‹จ, ๋‚ด ํ™”๋ฉด์— ๋งž๊ฒŒ ์ปค์Šคํ…€ํ•˜์—ฌ ์‚ฌ์šฉ )

    • ์„œ๋ฒ„์™€ ์—ฐ๋™ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋”ฐ๋กœ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ

๊ฐœ๋ฐœ๋ฒ”์œ„

๊ฐœ๋ฐœ ๋ฒ”์œ„

  • ํšŒ์›๊ฐ€์ž…
  • ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ
  • ์•„์ด๋””์ฐพ๊ธฐ ( ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ )
  • ๋น„๋ฐ€๋ฒˆํ˜ธ์ฐพ๊ธฐ (์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ )
  • ๋งˆ์ด์ปฌ๋ฆฌ ( ๋น„ํšŒ์›, ํšŒ์› )
    • ํšŒ์› ์ •๋ณด ํ™”๋ฉด ํ‘œ์‹œ
    • ์ „์ฒด๋“ฑ๊ธ‰ ๋ณด๊ธฐ, ๋‹ค์Œ๋‹ฌ ์˜ˆ์ƒ๋“ฑ๊ธ‰ ๋ณด๊ธฐ, ์•Œ๋ฆผ์„ค์ •, ์ฐœํ•œ ์ƒํ’ˆ, ์นœ๊ตฌ์ดˆ๋Œ€, ๋ฐฐ๋„ˆ, ์„ ๋ฌผ๋‚ด์—ญ, ๊ณต์ง€์‚ฌํ•ญ, ๊ณ ๊ฐ์„ผํ„ฐ, ์ด์šฉ์•ˆ๋‚ด
    • ๊ฐ€์ž…ํ˜œํƒ๋ณด๊ธฐ, ์ปฌ๋ฆฌ ํผํ”Œ ๋ฐ•์Šค, ์ปฌ๋ฆฌ ์†Œ๊ฐœ, ์ปฌ๋ฆฌํŒจ์Šค, ๋ฐฐ์†ก์•ˆ๋‚ด
    • ์ƒํ’ˆ ํ›„๊ธฐ( ์ž‘์„ฑ๊ฐ€๋Šฅํ›„๊ธฐ, ์ž‘์„ฑ์™„๋ฃŒํ›„๊ธฐ ) - ๊ตฌ๋งคํ•œ๊ฒŒ ์—†์–ด์„œ ํ™”๋ฉด์ด ์–ด๋–ป๊ฒŒ ๋‚˜์˜ค๋Š”์ง€ ๋ชฐ๋ผ์„œ ๊ธฐ๋ณธํ™”๋ฉด๋งŒ ํ–‡์Œ
  • ๋ฐฐ์†ก์ง€
    • ๋ฐฐ์†ก์ง€ ์„ ํƒ ( ์ƒ๋‹จ ๋งˆ์ปค ํด๋ฆญ )
    • ๋ฐฐ์†ก์ง€ ๊ด€๋ฆฌ
    • ๋ฐฐ์†ก์ง€ ์ถ”๊ฐ€ ( ์ฃผ์†Œ๊ฒ€์ƒ‰, ์ƒ์„ธ์ฃผ์†Œ ์ž‘์„ฑ )
    • ๋ฐฐ์†ก์ง€ ์ˆ˜์ •, ์‚ญ์ œ
    • ์ฃผ๋ฌธ์„œ์—์„œ ๋ฐฐ์†ก์ •๋ณด ์ž…๋ ฅ,์ˆ˜์ • ๋ถ€๋ถ„
  • ์ฃผ๋ฌธ
    • ์ฃผ๋ฌธ์„œ ์ž‘์„ฑ
    • ์ฃผ๋ฌธ ๋‚ด์—ญ ๋ฆฌ์ŠคํŠธ ( ์ฃผ๋ฌธ ๋‚ด์—ญ, ์ž์ฃผ ์‚ฌ๋Š” ์ƒํ’ˆ )
    • ์ฃผ๋ฌธ ๋‚ด์—ญ
    • ์ฃผ๋ฌธ ๋‚ด์—ญ ์ƒ์„ธ
    • ์ฃผ๋ฌธ ์ƒ์„ธ ๋ถ€๋ถ„
    • ์ž์ฃผ ์‚ฌ๋Š” ์ƒํ’ˆ
    • ์ฃผ๋ฌธ ํ›„ ๊ฒฐ๊ณผ ํ™”๋ฉด
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ
  • ํ™ˆ
    • ์ปฌ๋ฆฌ์ถ”์ฒœ ํ™”๋ฉด ( ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ )
      • ํƒ€์ด๋จธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • ์‹ ์ƒํ’ˆ
    • ๋ฒ ์ŠคํŠธ
    • ์•Œ๋œฐ์‡ผํ•‘
    • ํŠน๊ฐ€/ํ˜œํƒ
  • ์นดํ…Œ๊ณ ๋ฆฌ
  • ๊ฒ€์ƒ‰
    • ๊ฒ€์ƒ‰ ์ฒซ ํ™”๋ฉด
    • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ๋งŒ ํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒ€์ƒ‰ ๋ฆฌ์ŠคํŠธ
    • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ ํ›„ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ
  • ์ƒํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€
    • ์ƒํ’ˆ์„ค๋ช…
    • ์ƒํ’ˆ์ •๋ณด
    • ์ƒํ’ˆ ์„ ํƒ (๊ตฌ๋งคํ•˜๊ธฐ ๋ˆ„๋ฅด๋ฉด ๋‚˜ํƒ€๋‚จ )
    • ์ƒํ’ˆ ํ›„๊ธฐ
    • ํ›„๊ธฐ ๋ณด๊ธฐ
    • ์ƒํ’ˆ ๋ฌธ์˜ํ•˜๊ธฐ
    • ๋ฌธ์˜ ์ž‘์„ฑํ•˜๊ธฐ
  • ์ฟ ํฐ
    • ์ฟ ํฐ ๋‹ค์šด๋กœ๋“œ
    • ์ฟ ํฐ ๋“ฑ๋ก
    • ์ฟ ํฐ ๋‚ด์—ญ
  • ์ด๋ฒคํŠธ
    • ์ด๋ฒคํŠธ ๊ตฌํ˜„ ํ™”๋ฉด
  • ์ ๋ฆฝ๊ธˆ ๋‚ด์—ญ

API

API

์—ฎ์€ API

1) ํšŒ์› - ์ƒ๋ฆฌ


ํšŒ์›๊ฐ€์ž… POST

์ „์ฒด์œ ์ €์กฐํšŒ GET

ํŠน์ •์œ ์ €์กฐํšŒ GET

๋กœ๊ทธ์ธ POST

์œ ์ €์ •๋ณด๋ณ€๊ฒฝ PATCH

ํšŒ์› ํƒˆํ‡ด PUT

์ด๋ฉ”์ผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ GET

์ „ํ™”๋ฒˆํ˜ธ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ GET

์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ ๋งŒ๋“ค๊ธฐ PATCH

๋ฐฐ์†ก์ง€ ์ถ”๊ฐ€ํ•˜๊ธฐ POST

๋ฐฐ์†ก์ง€์กฐํšŒ GET

ํŠน์ •๋ฐฐ์†ก์ง€์กฐํšŒ GET

๋ฐฐ์†ก์ง€์ˆ˜์ • PATCH

๋ฐฐ์†ก์ž์‚ญ์ œ DELETE

๋‚ด ์ฐœ ๋ชฉ๋ก ์กฐํšŒ GET

์ฐœํ•˜๊ธฐ POST

์ฐœ์‚ญ์ œ DELETE

๋ ˆ๋ฒจ์กฐํšŒGET

๊ฐœ๋ณ„๋ ˆ๋ฒจ GET

์ด๋ฒคํŠธ์กฐํšŒ GET

์ด๋ฒคํŠธ์ฐธ๊ฐ€ GET

์‚ฌ์šฉ์ž์ฟ ํฐ ์กฐํšŒ GET

์‚ฌ์šฉ์ž์ฟ ํฐId๋“ฑ๋ก GET

์ฟ ํฐ์กฐํšŒ GET

์ ๋ฆฝ๊ธˆ์กฐํšŒ GET

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒ์„ฑ POST

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์กฐํšŒ GET

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ DELETE

๊ฒฐ์ œ์ •๋ณด GET

์ฃผ๋ฌธ POST

์ฃผ๋ฌธ๋‚ด์—ญ์กฐํšŒ GET

์ฃผ๋ฌธ ์ƒ์„ธ๋‚ด์—ญ ์กฐํšŒ GET


2 ) ์ƒํ’ˆ - ์Šคํ‹ฐ๋ธŒ

์ƒํ’ˆ์ชฝ API๊ฐ€ ๊ณ„์† ์ˆ˜์ •๋˜์–ด ์ตœ์ข…๋ณธ์ด ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ๋˜, ๋‹ค๋ฅธ ์—ฐ๊ด€๋œ API์™€ ๋ฐ์ดํ„ฐ ์ •๋ณด๊ฐ€ ๋งž์ง€ ์•Š๊ฑฐ๋‚˜ M์ด ํ‘œ์‹œ๋˜์–ด์žˆ๋Š” ๊ณณ์— null์ด ๋“ค์–ด๊ฐ€๋Š” ๋“ฑ ์ด์Šˆ๋“ค์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜์—ฌ ์ƒํ’ˆ์ชฝ๊ณผ ์—ฐ๊ด€๋œ ์•ฑ ๊ฐœ๋ฐœ์— ์ง€์—ฐ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜, ์†Œํ†ต์˜ ์˜ค๋ฅ˜๋กœ ํ•œ๊ฐœ์˜ API๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” โ€œ์ฃผ์ œ๋ณ„ ์ƒํ’ˆ๋“ค ์กฐํšŒโ€๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ ๋ถ€๋ถ„์„ ๊ฐ™์ด ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ๋” ์†Œ์š”ํ•˜์—ฌ ์ž‘์—…์˜ ์ง„ํ–‰์ด ๋”๋””์–ด์กŒ์Šต๋‹ˆ๋‹ค.


์ „์ฒด ์•„์ดํ…œ ์กฐํšŒ GET

์•„์ดํ…œ ์กฐํšŒ(+๊ฒ€์ƒ‰) GET

์นดํ…Œ๊ณ ๋ฆฌ ๋ฆฌ์ŠคํŠธ GET

๊ณต์ง€ ์‚ฌํ•ญ GET

์นดํ…Œ๊ณ ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ์ƒํ’ˆ๋“ค GET

์ƒ์œ„ ์•„์ดํ…œ ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ GET

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์•„์ดํ…œ ๋ชฉ๋ก ์กฐํšŒ GET

์ƒํ’ˆ ๋””ํ…Œ์ผ GET

์‹ ์ƒ์•„์ดํ…œ๋ชฉ๋ก GET

๋ฒ ์ŠคํŠธ ์•„์ดํ…œ ๋ชฉ๋ก GET

์•Œ๋œฐ์ƒํ’ˆ ์ƒํ’ˆ๋ฆฌ์ŠคํŠธ GET

๋‚ฎ์€ ๊ฐ€๊ฒฉ ์ˆœ ์ƒํ’ˆ๋ฆฌ์ŠคํŠธ GET

๋†’์€ ๊ฐ€๊ฒฉ ์ˆœ ์ƒํ’ˆ๋ฆฌ์ŠคํŠธ GET

์ „์ฒด ์ƒํ’ˆ์„ค๋ช… ์กฐํšŒ GET

์ƒํ’ˆ์„ค๋ช… ์กฐํšŒ GET

์ฃผ์ œ๋ณ„ API GET

์ฃผ์ œ๋ณ„ API ์ „์ฒด GET


๊ทธ ์™ธ ์—ฎ์ง€ ์•Š๊ณ  POSTMAN์—์„œ ์‚ฌ์šฉํ•œ API

์ด๋ฉ”์ผ๋กœ ์•„์ด๋””์ฐพ๊ธฐAPI - ๋งŒ๋“œ์‹œ๊ธฐ์ „์— ์ด๋ฏธ ๋‹ค๋ฅธAPI ์—ฎ์–ด์„œ ์ด๋ฏธ ๊ตฌํ˜„ํ•จ

์ „ํ™”๋ฒˆํ˜ธ๋กœ ์•„์ด๋””์ฐพ๊ธฐ API - ๋งŒ๋“œ์‹œ๊ธฐ์ „์— ์ด๋ฏธ ๋‹ค๋ฅธAPI ์—ฎ์–ด์„œ ์ด๋ฏธ ๊ตฌํ˜„ํ•จ

์•Œ๋ฆผ์„ค์ • ์กฐํšŒ - ํ”„๋ŸฐํŠธ์—์„œ UserDefault๋กœ ๊ตฌํ˜„

๊ฒฐ์ œ์ •๋ณด ์ƒ์„ฑ API - ๋งŒ๋“ค๋•Œ๋งŒ ํฌ๋งจ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋ŸฐํŠธ์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ

๋ ˆ๋ฒจ์ƒ์„ฑAPI - ๋งŒ๋“ค๋•Œ๋งŒ ํฌ๋งจ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋ŸฐํŠธ์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ

์ด๋ฒคํŠธ์ƒ์„ฑ API - ๋งŒ๋“ค๋•Œ๋งŒ ํฌ๋งจ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋ŸฐํŠธ์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ

์ฟ ํฐ ๋“ฑ๋ก API - ๋งŒ๋“ค๋•Œ๋งŒ ํฌ๋งจ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ํ”„๋ŸฐํŠธ์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ

์ „์ฒด ์ฟ ํฐ ์กฐํšŒ API - ํ™•์ธ์šฉ์œผ๋กœ ํฌ๋งจ์—์„œ ์‚ฌ์šฉ

๊ฐœ๋ฐœ์ผ์ง€

๊ฐœ๋ฐœ์ผ์ง€

1์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ๊ธฐํš์„œ ์ž‘์„ฑ ๋ฐ ์ œ์ถœ

    โ€ฃ - 100% ( ํ”ผ๋“œ๋ฐฑ ๋ฐ›์Œ)

    • ์ง€์ผœ์•ผํ•  ์‚ฌํ•ญ

      1์ฐจ ํ”ผ๋“œ๋ฐฑ ์ „, ์ตœ์†Œํ•œ ์ง„ํ–‰ํ•ด์•ผํ•  ์‚ฌํ•ญ๋“ค 
      
      - ๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž… 
      - ํ™ˆํ™”๋ฉด ์ฒซํ™”๋ฉด 
      - ๋‚ด์ •๋ณด ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” UI
      
       ์ด์Šˆ๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด, ๋ฐ”๋กœ ๋ง์”€ํ•ด์ฃผ์„ธ์š”. 
      
       ์ถ”๊ฐ€๋กœ, iOS ๋ผ์ด์ง•ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ ๊ณ ๋ ค์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. 
      
      ## UI
      
      1. UI๋Š” Storyboard base ์ด๊ตฌ์š”. ๋ถ€๋ถ„์ ์œผ๋กœ Code ํ˜น์€ Xib ์‚ฌ์šฉ์€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 
      2. ์˜คํ† ๋ ˆ์ด์•„์›ƒ ์ง„ํ–‰ ์‹œ, ์ตœ์†Œ 2 ๊ธฐ๊ธฐ ํ™•์ธํ•˜์…”์„œ, ๋ ˆ์ด์•„์›ƒ ์—๋Ÿฌ ํ•œ ๋ฒˆ์”ฉ ์ฒดํฌํ•ด์ฃผ์„ธ์š”. 
      (์ถ”์ฒœ๋“œ๋ฆฌ๋Š” ๊ธฐ๊ธฐ๋Š” "iPhone 8" , "iPhone 13 Pro Max" ์‹คํ–‰์„ ํ†ตํ•ด ๋น„๊ตํ•ด๋ณด์„ธ์š”) 
      3. ์•ฑ ์•„์ด์ฝ˜์€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„๊ฒŒ์š”. 
      4. ๋‹คํฌ๋ชจ๋“œ๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  LightMode ๊ณ ์ •์ž…๋‹ˆ๋‹ค. 
      
      ## ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ
      ๋งŒ์•ฝ ์•„ํ‚คํ…์ณ ํŒจํ„ด์ ์šฉํ•˜์‹ ๋‹ค๋ฉด, ํ•ด๋‹น ๋ถ€๋ถ„ ๋ง์”€ํ•ด์ฃผ์„ธ์š”.
      
      ex) MVC / MVP / MVVM ... etc 
       ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” MVC๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 
      
      ## ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 
       Rx ํ˜น์€ Combine์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. 
      
      ## ๋„คํŠธ์›Œํฌ
       Network Layer๋Š” 5์ฃผ์ฐจ ์ˆ˜์—… ๊ทธ๋ฆฌ๊ณ  ํƒฌํ”Œ๋ฆฟ์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Request ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์ฃผ์„ธ์š”. 
      
       ์œ„ ์‚ฌํ•ญ๋“ค์ด ์–ด๋ ต๊ฒŒ ๋ฐ›์•„๋“ค์ด์‹ค ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ง€๊ธˆ๊นŒ์ง€ ํ•ด์˜ค์‹  ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ํ•˜์‹  ๊ฒƒ๋“ค์„ ๊ธ€๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. 
       ํ˜น์‹œ ์งˆ๋ฌธ ์žˆ์œผ์‹œ๋ฉด ์งˆ๋ฌธ์ฃผ์„ธ์š”~!
      
  • ์„œ๋ฒ„์™€ ํšŒ์˜์ง„ํ–‰


  • README - ๊ฐœ๋ฐœ์ผ์ง€ ๋งํฌ ์—ฐ๊ฒฐ

  • ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๊ตฌ์ถ•

    • gitignore file ์ถ”๊ฐ€
    • ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ์ด๋ฏธ์ง€ ์บ์‹ฑ์„ ์œ„ํ•ด Alarmofire, Kingfisher pod install
    • ํด๋”๊ตฌ์„ฑ, ๊ธฐ์ดˆ ์ž‘์—… ์™„๋ฃŒ
    • ๊ธฐ๋ณธ UI ์ž‘์—… ํ•˜๋‹จ ์™„๋ฃŒ
  • UI

    • ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ์™„๋ฃŒ - 100 %
    • ๋งˆ์ด์ปฌ๋ฆฌ ๋น„ํšŒ์› ๊ตฌํ˜„ ์™„๋ฃŒ - 100 %
  • ์„œ๋ฒ„

    ์„œ๋ฒ„๊ฐ€ ์ค€ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž… API Postman์—์„œ ํ…Œ์ŠคํŠธ - ์™„๋ฃŒ

2์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ํ™ˆ ํ™”๋ฉด ์ปฌ๋ฆฌ์ถ”์ฒœ - 90% ๊ตฌํ˜„ ์™„๋ฃŒ โ†’ 100% (MD ๋นผ๊ธฐ๋กœ ํ•จ)
    • ํ™ˆํ™”๋ฉด ํŽ˜์ด์ง•๋ทฐ ๊ตฌํ˜„ ์™„๋ฃŒ
    • ์ด๋ฒคํŠธ ๋ฐฐ๋„ˆ ์ž๋™ ํŽ˜์ด์ง• ๊ตฌํ˜„ ์™„๋ฃŒ
    • ์ƒํ’ˆ - ์—ฌ๋Ÿฌ ์…€๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌํ˜„ ์™„๋ฃŒ
    • MD ์ถ”์ฒœ ๋ถ€๋ถ„์€ ๊ตฌํ˜„ ์•ˆํ•˜๊ธฐ๋กœ ๊ฒฐ์ •
  • ๋งˆ์ด์ปฌ๋ฆฌ
    • ํšŒ์›๊ฐ€์ž… UI ๊ตฌํ˜„ 100%
    • ์•„์ด๋””์ฐพ๊ธฐ UI ๊ตฌํ˜„ 100%
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ UI ๊ตฌํ˜„ 100%
    • ํšŒ์›์ผ๋•Œ UI ๊ตฌํ˜„ 100%
  • ์„œ๋ฒ„์™€ ํšŒ์˜์ง„ํ–‰

3์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • 1์ฐจ ํ”ผ๋“œ๋ฐฑ

  • ํ™ˆ ํ™”๋ฉด

    • ์ปฌ๋ฆฌ์ถ”์ฒœ UI ๊ตฌํ˜„ 100%
    • ์‹ ์ƒํ’ˆ UI ๊ตฌํ˜„ 100%
    • ๋ฒ ์ŠคํŠธ UI ๊ตฌํ˜„ 100%
    • ์•Œ๋œฐ์‡ผํ•‘ UI ๊ตฌํ˜„ 100%
    • ํŠน๊ฐ€/ํ˜œํƒ UI ๊ตฌํ˜„ 100%
  • ๋งˆ์ด์ปฌ๋ฆฌ

    ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… API ๋ถ€๋ถ„ ์—ฐ๋™ ํ›„ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ 100%

  • ๋ฆฌํŒฉํ† ๋ง

    ๋ฆฌํŒฉํ† ๋ง

    ๊ธฐํƒ€ ์ถ”๊ฐ€๋กœ ํ”ผ๋“œ๋ฐฑ ํ›„ ์ „์ฒด ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰

  • ์„œ๋ฒ„์™€ ํšŒ์˜์ง„ํ–‰

4์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

5์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ์„œ๋ฒ„์™€์˜ ํšŒ์˜
  • ๊ฒ€์ƒ‰ํ™”๋ฉด
    • ๊ฒ€์ƒ‰์ฐฝ ์ง์ ‘ ๊ตฌํ˜„ ( ์ปค์Šคํ…€ํ–ˆ์Œ ) 100%
    • ๊ฒ€์ƒ‰ ์ดˆ๊ธฐํ™”๋ฉด UI ๊ตฌํ˜„ 100%
    • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒ€์ƒ‰๋ฆฌ์ŠคํŠธ ํ™”๋ฉด UI ๊ตฌํ˜„ 100%
    • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ™”๋ฉด UI ๊ตฌํ˜„ 100%
      • ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ UI ๊ตฌํ˜„ 100%
      • ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ UI ๊ตฌํ˜„ 100%

  • API ๋ถ€๋ถ„
    • ์„œ๋ฒ„์—์„œ ๋‚˜์˜จ ๋ช…์„ธ์„œ๋ฅผ ํ† ๋Œ€๋กœ Postman์—์„œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ํ•จ

6์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ์„œ๋ฒ„์™€์˜ ํšŒ์˜
  • ์นดํ…Œ๊ณ ๋ฆฌ ํ™”๋ฉด
    • ์นดํ…Œ๊ณ ๋ฆฌ ๋ฆฌ์ŠคํŠธ - ์„ ๋ฌผํ•˜๊ธฐ ๋ถ€๋ถ„ ์™„๋ฃŒ
    • ์นดํ…Œ๊ณ ๋ฆฌ ๋ฆฌ์ŠคํŠธ- ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ƒ์œ„, ํ•˜์œ„ ๋‚˜๋ˆ„์–ด ํ…Œ์ด๋ธ” ํ™•์žฅํ•˜๋„๋ก ๊ตฌํ˜„
    • ์นดํ…Œ๊ณ ๋ฆฌ ๋ฆฌ์ŠคํŠธ - ์ปฌ๋ฆฌ์ถ”์ฒœ ๋ถ€๋ถ„ ์™„๋ฃŒ
    • ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ํ•ด๋‹น ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋””ํ…Œ์ผ ํ™”๋ฉด์œผ๋กœ ์ด๋™ ์™„๋ฃŒ
  • ์„œ๋ฒ„
    • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ
    • ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ
    • ์•„์ด๋”” ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ
    • ์ „์ฒด ์œ ์ € ์กฐํšŒ API ์—ฐ๋™
    • ํŠน์ • ์œ ์ € ์กฐํšŒ API ์—ฐ๋™
    • ์œ ์ € ์ •๋ณด ์ˆ˜์ • API ์—ฐ๋™

7์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ์„œ๋ฒ„์™€์˜ ํšŒ์˜
  • API ์ˆ˜์ • ํ›„ ๋กœ๊ทธ์ธ ์ตœ์ข… ์™„๋ฃŒ
  • API ์ˆ˜์ • ํ›„ ํšŒ์›๊ฐ€์ž… ์ตœ์ข… ์™„๋ฃŒ
  • API ์ˆ˜์ • ํ›„ ์•„์ด๋”” ์ฐพ๊ธฐ ์ตœ์ข… ์™„๋ฃŒ

  • ๋กœ๊ทธ์ธํ• ๋•Œ jwt๋กœ userDefault๋กœ ์ €์žฅํ•˜๋ฉด์„œ ์“ฐ๊ธฐ ( ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•: keychain )

8์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ์„œ๋ฒ„์™€์˜ ํšŒ์˜
  • ๊ณต์œ ํ•˜๋Š” ํ™”๋ฉด ๊ตฌํ˜„ ์™„๋ฃŒ
  • ์ƒํ’ˆ ์„ ํƒ ํ™”๋ฉด - ์ˆ˜๋Ÿ‰ stepper GMStepper ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„
  • ์•„์ดํ…œ ์ƒ์„ธํŽ˜์ด์ง€ ์ƒํ’ˆ์„ค๋ช… ๊ตฌํ˜„ ์™„๋ฃŒ
  • ์ƒํ’ˆ ์„ ํƒ ํ™”๋ฉด ๊ตฌํ˜„ ์™„๋ฃŒ
  • ๋น„๋ฐ€๋ฒˆํ˜ธ์ฐพ๊ธฐ ๊ตฌํ˜„ ์™„๋ฃŒ

9์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ์ฃผ์ œ๋ณ„ API, ์ „์ฒด ์ƒํ’ˆ ์กฐํšŒ API, ํŠน์ • ์ƒํ’ˆ ์กฐํšŒ API .. ๋“ฑ API ๊ตฌ์กฐ ์งœ์„œ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌ
  • ์„œ๋ฒ„์™€์˜ ํšŒ์˜
    • ์„œ๋ฒ„์—์„œ ์™„์„ฑํ•œ API ๊ณ„์† ๋ด์ฃผ๊ธฐ(์Šคํ‹ฐ๋ธŒ)
    • ์„œ๋ฒ„์—์„œ ์ˆ˜์ •ํ•œ API ํ…Œ์ŠคํŠธํ•ด์ฃผ๊ธฐ ( ์ƒ๋ฆฌ )
    • ํšŒ์˜ ) ์ƒ๋ฆฌ๋‹˜๊ณผ ๋ฐฐ์†ก์ง€ ๊ด€๋ จ ๋ถ€๋ถ„ ์ˆ˜์ • ์‚ฌํ•ญ ๋ง์”€๋“œ๋ฆฌ๊ธฐ
  • ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒ๋‹จ์— ๋ฐ”๋ฒ„ํŠผ ์ƒ์„ฑ ํ›„ ๊ฐ„๊ฒฉ ์กฐ์ •

10์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • 2์ฐจ ํ”ผ๋“œ๋ฐฑ
  • ์„œ๋ฒ„์™€์˜ ํšŒ์˜
  • ํ…์ŠคํŠธํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ณณ์€ ํ™”๋ฉด ํ„ฐ์น˜ํ–ˆ์„ ๋•Œ ๋‚ด๋ ค๊ฐ€๋„๋ก ๊ตฌํ˜„ํ•˜๊ธฐ
  • ์•„์ดํ…œ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ• ๋•Œ ์˜†์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ ํ•ด๊ฒฐ
  • ๋ฐฐ์†ก์ง€
    • ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅํ•˜๋Š” ๋ถ€๋ถ„ ํ™”๋ฉด์ด ๋ณต์žกํ•ด์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆผ - ๊ตฌํ˜„ ์™„๋ฃŒ
      • scrollView์— ๋†’์ด๋ฅผ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” stackView๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ
      • ๊ณต๋™ํ˜„๊ด€ ์ถœ์ž…๋ฐฉ๋ฒ•์€ ์ƒ๋žตํ•˜๊ณ  ๋‚˜์ค‘์— ์ˆ˜์ •ํ•˜์ž
  • ์ฃผ๋ฌธ
    • ์ฃผ๋ฌธ๊ฒฐ๊ณผ
    • ์ฃผ๋ฌธ๋‚ด์—ญ
      • ์ฃผ๋ฌธ๋‚ด์—ญ ๋ฆฌ์ŠคํŠธ
      • ์ž์ฃผ์‚ฌ๋Š”์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ
      • ์ž์ฃผ์‚ฌ๋Š” ์ƒํ’ˆ์œผ๋กœ ํ™”๋ฉด ์ด๋™
    • ์ฃผ๋ฌธํ™”๋ฉด
  • ๋ฐœ์ƒ ์ด์Šˆ ํ•ด๊ฒฐ
    • ๋ฐœ์ƒ์ด์Šˆ ํ•ด๊ฒฐ : ํ™”๋ฉด ์ „ํ™˜์‹œ ๋„ค๋น„๊ฒŒ์ด์…˜ ํ™”๋ฉด ์ „ํ™˜ ํšจ๊ณผ์™€ ์ „ํ™˜ ํ›„ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋“ฑ
    • ๋ฐœ์ƒ์ด์Šˆ : ์ฃผ๋ฌธ๋‚ด์—ญ์—์„œ xlpagertabstrip ์ ์šฉ์ด ์•ˆ๋จ ( ์ด์œ ๋ฅผ ์•„์ง๋„ ๋ชจ๋ฅด๊ฒ ์Œ )
      • ๋”ฑ, ๋งˆ์ด์ปฌ๋ฆฌํŽ˜์ด์ง€ โ†’ ์ฃผ๋ฌธ๋‚ด์—ญ์œผ๋กœ ๊ฐˆ๋•Œ๋งŒ ์•ˆ๋˜๊ณ 
      • ๋‹ค๋ฅธ๊ณณ์—์„œ ์ด๋™ํ•ด๋„ ๊ทธ๋Ÿฌ๋Š”์ง€ ๋ดค๋Š”๋ฐ ๊ทธ๋•Œ๋Š” ์ ์šฉ์ด ์ž˜๋จ
      • ๋”ฐ๋ผ์„œ, ์ด ๋ถ€๋ถ„์—์„œ ์‚ฝ์งˆ์„ ์˜ค๋ž˜ํ•˜๊ณ  ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•ˆ ํ›„ ๋ฒ„ํŠผ์„ ํ†ตํ•œ ์ปจํ…Œ์ด๋„ˆ๋ทฐ๋กœ ์ˆ˜์ •ํ–ˆ์Œ

11์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€


  • ์„œ๋ฒ„์™€์˜ ํšŒ์˜ - ์งˆ๋ฌธ ๋‚ด์šฉ ์ „๋‹ฌ, ํ˜„ ์ƒํ™ฉ ๋“ฃ๊ธฐ

    • ์ƒ๋ฆฌ๋‹˜ : ์ฟ ํฐ ๋ถ€๋ถ„, ์ด๋ฒคํŠธ ๋ถ€๋ถ„


      • ์ด๋ฏธ์ง€๋งŒ ๋„์šฐ๋ฉด ๋จ - ์ปฌ๋ฆฌ ํผํ”Œ ๋ฐ•์Šค, ์ปฌ๋ฆฌ ์†Œ๊ฐœ, ์ปฌ๋ฆฌํŒจ์Šค, ๋ฐฐ์†ก์•ˆ๋‚ด, ๊ฐ€์ž…ํ˜œํƒ๋ณด๊ธฐ ( ํ”„๋ŸฐํŠธ์—์„œ ์ž‘์—… )
      • ์ฟ ํฐ API ๋งŒ๋“ค์–ด๋‹ฌ๋ผํ•˜๊ธฐ ok
        • ๋ฌด๋ฃŒ๋ฐฐ์†ก, 3000์› ํ• ์ธ, 10000์› ํ• ์ธ
          • ์ฟ ํฐ์ด๋ฆ„ : [๋ฌด๋ฃŒ๋ฐฐ์†ก] 3000์› ํ• ์ธ ์ฟ ํฐ
          • ์ฟ ํฐ์„ค๋ช… : 20000๋งŒ์› ์ด์ƒ ์ฃผ๋ฌธ์‹œ 3000์› ํ• ์ธ ์ฟ ํฐ
          • ๋งŒ๋ฃŒ์ผ : ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ •ํ•ด์ฃผ์„ธ์š”! ( ๋‚ ์งœ + ์‹œ๊ฐ„ )
          • ํ• ์ธ์œจ : 3000 ( Int๋กœ ๊ณ ์ • )
          • ์ฟ ํฐ์•„์ด๋”” : 10
        • 5000์› ํ• ์ธ
          • ์ฟ ํฐ์ด๋ฆ„ : ์ „ ์ƒํ’ˆ์— ๋ชจ๋‘ ์ ์šฉ๊ฐ€๋Šฅ 5000์› ํ• ์ธ ์ฟ ํฐ
          • ์ฟ ํฐ์„ค๋ช… : ์ฒซ ๊ฐ€์ž…์ž์—๊ฒŒ ์ฃผ๋Š” ํ˜œํƒ์œผ๋กœ์จ ์ „ ์ƒํ’ˆ ์ ์šฉ๊ฐ€๋Šฅํ•œ ์ฟ ํฐ
          • ๋งŒ๋ฃŒ์ผ : ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ •ํ•ด์ฃผ์„ธ์š”! ( ๋‚ ์งœ + ์‹œ๊ฐ„ )
          • ํ• ์ธ์œจ : 5000 ( Int๋กœ ๊ณ ์ • )
          • ์ฟ ํฐ์•„์ด๋”” : 11
        • 10000์› ํ• ์ธ
          • ์ฟ ํฐ์ด๋ฆ„ : [ ์ฑ„์†Œ ํ•œ์ • ์ฟ ํฐ ]ํ”„๋ ˆ์‹œ ์ฑ„์†Œ
          • ์ฟ ํฐ์„ค๋ช… : ์ด ์ฟ ํฐ์€ ํ•œ์ • ์ฑ„์†Œ ์ƒํ’ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
          • ๋งŒ๋ฃŒ์ผ : ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ •ํ•ด์ฃผ์„ธ์š”! ( ๋‚ ์งœ + ์‹œ๊ฐ„ )
          • ํ• ์ธ์œจ : 10000 ( Int๋กœ ๊ณ ์ • )
          • ์ฟ ํฐ์•„์ด๋”” : 12
        • ์ฟ ํฐ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์‚ญ์ œ๋„ ๊ฐ€๋Šฅํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์Œ
      • ์„ค๋‚ ํŠน๊ฐ€ โ†’ ์ฟ ํฐ ์ƒ์„ฑ
      • ์ฐœํ•œ์ƒํ’ˆ ์‚ญ์ œ
    • ์Šคํ‹ฐ๋ธŒ : ์ƒํ’ˆ API ์ˆ˜์ •

      • ์ƒํ’ˆ์— ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” coupon_name์˜ ํƒ€์ž…์„ Int๋กœ ๋ณ€๊ฒฝ ( ์ฟ ํฐId๊ฐ€ ํ•„์š” ) - coupon id๋กœ ๋ณ€์ˆ˜๋ช… ๋ณ€๊ฒฝ, ํƒ€์ž… Int๋กœ ์ˆ˜์ •
      • ๊ฐ™์ด ์ฟ ํฐ์ด ์žˆ๋Š” ์ƒํ’ˆ์— ์–ด๋–ค ์ฟ ํฐ์„ ๋„ฃ์„์ง€ ์–˜๊ธฐ๋‚˜๋ˆ„๊ธฐ
      • ์ฐœํ•œ ๋ชฉ๋ก์— ์•„์ดํ…œ์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ๋˜์„œ ์ƒ๋ฆฌ๋‹˜๊ณผ ์–˜๊ธฐ๋‚˜๋ˆ ๋ณด๋ผ๊ณ  ๋ง์”€๋“œ๋ฆฌ๊ธฐ
      • ๋‚ฎ์€ ๊ฐ€๊ฒฉ์ˆœ, ๋†’์€ ๊ฐ€๊ฒฉ์ˆœ ์ •๋ ฌ๊ธฐ์ค€์ด originPrice๊ฐ€ ์•„๋‹ˆ๋ผ discountPrice์ด๋‹ค. - ์ˆ˜์ • ์™„๋ฃŒ
      • ํŠน๊ฐ€์ƒํ’ˆ ํŠน๊ฐ€์‹œ์ž‘์ผ๋งŒ ์ž‘์„ฑํ•ด์ฃผ์‹œ๊ธฐ๋กœ
  • 10์‹œ๊นŒ์ง€ ์ฃผ๋ฌธ์ƒ์„ธ ๋งŒ๋“ค๊ธฐ

  • ์ฃผ๋ฌธ ์…€ ๋‚˜๋ˆ„๊ธฐ

  • ์ฟ ํฐ

    • ์ด๋ฒคํŠธ์—์„œ ์ฟ ํฐ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ํ™”๋ฉด ๊ตฌํ˜„
    • ์ฟ ํฐ๋‹ค์šด๋กœ๋“œ
    • ์ฟ ํฐ๋“ฑ๋ก ์•Œ๋ฆผ์ฐฝ ๊ตฌํ˜„
    • ์ฟ ํฐ๋‚ด์—ญ ๋ณด์—ฌ์ฃผ๊ธฐ ํ™”๋ฉด ๊ตฌํ˜„
    • ์ฟ ํฐ ๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐ”๋กœ ๊ตฌํ˜„ ( ํ™”๋ฉด ์ด๋™๋งŒ ํ•˜๋ฉด ๋  ๋“ฏ )
  • ์ด๋ฒคํŠธํ™”๋ฉด ( ํŠน๊ฐ€/ ํ˜œํƒ )

    • ํŠน๊ฐ€/ํ˜œํƒ์˜ ์ด๋ฒคํŠธ ์ƒ์„ธํ™”๋ฉด ๊ตฌํ˜„
  • ์ •๋ ฌํ•˜๋Š” ๋“œ๋กญ๋ฐ•์Šค ๊ตฌํ˜„

  • ๋ฐฐ์†ก์ง€ ์„ ํƒ ํ•˜ํ”„ ๋ชจ๋‹ฌ pod 'MaterialComponents/BottomSheetโ€™

  • ํƒ€์ด๋จธ๊ตฌํ˜„

    • ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ํŠน๊ฐ€ ์ƒํ’ˆ ์ค‘ ํŠน๊ฐ€์‹œ์ž‘๋‚ ์งœ๊ฐ€ ์˜ค๋Š˜๋‚ ์งœ์™€ ๋™์ผํ•˜๋‹ค๋ฉด ์˜ค๋Š˜ ๋‚ ์งœ์—์„œ ๋‚จ์€ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๊ธฐ + ํ•ด๋‹น ๋‚ ์งœ์˜ ํŠน๊ฐ€ ์ƒํ’ˆ ๋„์šฐ๊ธฐ

    • ๋งŒ์•ฝ 10๋ถ„ ์ดํ•˜๋กœ ๋‚จ์•˜์„ ๊ฒฝ์šฐ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋„์›€

    • ์‹œ๊ฐ„์ด ์ง€๋‚ฌ์œผ๋ฉด ๋งŒ๋ฃŒํ‘œ์‹œํ•˜๊ณ  ํƒ€์ด๋จธ ์ •์ง€

      แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-01-19 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12.10.19.png

      แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-01-19 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12.10.30.png

  • ๋Ÿฐ์น˜์Šคํฌ๋ฆฐ

  • ์ฃผ๋ฌธ ๋‚ด์—ญ ์ƒ์„ธ์—์„œ ๋ฐฐ์†ก ์กฐํšŒ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ์›น์‚ฌ์ดํŠธ๋กœ ์—ฐ๊ฒฐ

  • ์ฐœํ•œ ์ƒํ’ˆ

12์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ์„œ๋ฒ„๋ถ„๋“ค๊ณผ ํšŒ์˜

    • ์งˆ๋ฌธ ์‚ฌํ•ญ ๋ชจ๋‘ ์—ฌ์ญค๋ณด๊ธฐ
    • ์ƒ๋ฆฌ๋‹˜๊ณผ ํšŒ์˜
      • ์ ๋ฆฝ, ์ฐœ ๋ถ€๋ถ„
    • ์Šคํ‹ฐ๋ธŒ๋‹˜๊ณผ ํšŒ์˜
      • ์นดํ…Œ๊ณ ๋ฆฌ
      • API ์ตœ์ข…๋ณธ์ด ์–ธ์ œ ๋‚˜์˜ค๋Š”์ง€ ์—ฌ์ญค๋ณด๊ธฐ ( ๋Œ€์ถฉ ์ผ์ •์ด๋ผ๋„ )
  • ์•Œ๋ฆผ์„ค์ •

    • ๊ฑฐ๋ถ€, ๋™์˜ ์‹œ ๋‚˜์˜ค๋ฉด ํŒ์—…์ฐฝ ( ์ƒ‰์ƒ์€ ๋ณ€๊ฒฝ ๋ชปํ•จ )
  • ์นœ๊ตฌ์ดˆ๋Œ€, ๋ฐฐ๋„ˆ ์ด๋™,

  • ์ „์ฒด๋“ฑ๊ธ‰ ๋ณด๊ธฐ, ๋‹ค์Œ๋‹ฌ ์˜ˆ์ƒ๋“ฑ๊ธ‰ ๋ณด๊ธฐ

  • ์„ ๋ฌผ๋‚ด์—ญ ํ…… - ์„ ๋ฌผ๋‚ด์—ญ์€ ์„ ๋ฌผ ๋ฐ›๊ณ  ๋‚œ ํ›„ ์–ด๋–ค ํ™”๋ฉด์ธ์ง€ ๋ชฐ๋ผ์„œ ์—†์„๋•Œ ํ™”๋ฉด์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€๊ฒฉ์— ์ฝค๋งˆ ์ ์šฉํ•˜๋Š” ๊ฑฐ ์ฐพ๊ธฐ

  • ์ทจ์†Œ์„  ํ‘œ์‹œ

  • ์ ๋ฆฝ๊ธˆ

  • ๊ฐ€์ž…ํ˜œํƒํ™”๋ฉด ๊ตฌํ˜„

  • ์ปฌ๋ฆฌ์†Œ๊ฐœ

  • ๋ฐฐ์†ก์•ˆ๋‚ด

  • ๊ณต์ง€์‚ฌํ•ญ

  • ๊ณ ๊ฐ์„ผํ„ฐ

  • 1:1 ๋ฌธ์˜ (๋„ค๋น„๋ถ€๋ถ„ ์ˆ˜์ •์•ˆ๋ฌ์ง€๋งŒ ), ๋ฌธ์˜ ์ž‘์„ฑ

  • ์ด์šฉ์•ˆ๋‚ด

  • ์ปฌ๋ฆฌ ํผํ”Œ๋ฐ•์Šค, ์ปฌ๋ฆฌํŒจ์Šค

  • API ์—ฎ๊ธฐ ( ํ˜„์žฌ ์™„์„ฑ๋œ API ์œ„์ฃผ๋กœ )

    • ์ •๋ ฌ๋ฆฌ์ŠคํŠธ ๋ถ€๋ถ„ : ์‹ ์ƒํ’ˆ(์‹ ์ƒํ’ˆ์ˆœ), ๋ฒ ์ŠคํŠธ(์ถ”์ฒœ์ˆœ,ํŒ๋งค๋Ÿ‰์ˆœ), ์•Œ๋œฐ์‡ผํ•‘(ํ˜œํƒ์ˆœ), ๋†’์€๊ฐ€๊ฒฉ์ˆœ, ๋‚ฎ์€๊ฐ€๊ฒฉ์ˆœ
    • ๋ฆฌ์ŠคํŠธ์—์„œ ์‡ผํ•‘์นดํŠธ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ชจ๋‹ฌ๋กœ ๋„์šฐ๊ธฐ
    • ๋ฌธ์ œ : ์ •๋ ฌ ๋“œ๋กญ๋‹ค์šด ์„ ํƒํ•˜๊ณ ๋‚˜์„œ ๋ฐ์ดํ„ฐ์ด ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„๋•Œ๋ฌธ์— ์†์‹ค์ด ๋˜๊ฑฐ๋‚˜, ๋Š๋ฆผ

    • ๊ณต์ง€์‚ฌํ•ญ API ์—ฎ์Œ

13์ผ์ฐจ-14์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€

  • ํšŒ์› ๋ฐ์ดํ„ฐ ์„ค๊ณ„ ( UserInfoManager )
  • ์‚ฌ์šฉ์ž ๋“ฑ๊ธ‰ ์กฐํšŒ API ์—ฐ๋™
  • ํšŒ์› ์ •๋ณด ๋„์šฐ๊ธฐ
    • ๋“ฑ๊ธ‰ ๋„์šฐ๊ธฐ
    • ์ฟ ํฐ๊ฐฏ์ˆ˜ ๋„์šฐ๊ธฐ
  • ์ „์ฒด ์ด๋ฒคํŠธ ์กฐํšŒ API ์—ฐ๋™
  • ์‚ฌ์šฉ์ž ์ฟ ํฐ ๋‚ด์—ญ ์กฐํšŒ API ์—ฐ๋™
  • ์ฟ ํฐ ๋‚ด์—ญ ์ถœ๋ ฅํ•˜๊ธฐ
  • ์‚ฌ์šฉ์ž ์ฟ ํฐ id๋กœ ๋“ฑ๋กํ•˜๊ธฐ API ์—ฐ๋™ ํ›„ ํ™”๋ฉด ์ถœ๋ ฅ ์™„๋ฃŒ
  • ํŠน์ • ์ฟ ํฐ ์ •๋ณด API
  • ํŠน์ • ์ฟ ํฐ ์ •๋ณด API ํ™”๋ฉด ๋„์šฐ๊ธฐ
  • ์ด๋ฒคํŠธ์—์„œ ์ฟ ํฐ ๋‹ค์šด๋กœ๋“œ
  • ๋กœ๋”ฉํ™”๋ฉด , ์ฃผ์ œ๋ณ„ ์ „์ฒด ์กฐํšŒ API ์—ฐ๋™
  • ์ฃผ์ œ๋ณ„ ๋ฆฌ์ŠคํŠธ ์ „์ฒด ์กฐํšŒ โ†’ count ๋ฐ›์•„์˜ค๊ณ  ๊ฑฐ๊ธฐ์˜ ์ฃผ์ œ๋ณ„ ๋ฆฌ์ŠคํŠธ์˜ ์ •๋ณด๋“ค์˜ ์•„์ด๋””๋ฅผ ์ด์šฉํ•ด์„œ
  • ์ฃผ์ œ์˜ ์•„์ดํ…œ ์กฐํšŒ
  • ์•„์ดํ…œ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌ ... - ๋กœ๋”ฉํ™”๋ฉด์—์„œ ์ž‘์—…์„ ์ด๋ฏธ ์‹œ์ž‘ํ•จ ( ItemInfoManager )
  • ํ™ˆํ™”๋ฉด ์ฃผ์ œ๋ณ„๋กœ ๋„์šฐ๋Š” ๋ถ€๋ถ„ API ๋˜์‹œ๋ฉด ์—ฐ๋™ํ•ด์„œ ๋„์šฐ๊ธฐ
  • ์ƒํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€์— API ์—ฐ๋™ํ•ด์„œ ๋„์šฐ๊ธฐ
  • ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ
  • ์•„์ดํ…œ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ ใ…
  • ๊ณต์œ ํ™”๋ฉด
  • ์ƒํ’ˆ ํ›„๊ธฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํ›„๊ธฐ ๋ณด๊ธฐ, ์ƒํ’ˆ ๋ฌธ์˜ ๋ชฉ๋ก, ์ƒํ’ˆ ๋ฌธ์˜ ์ž‘์„ฑ
  • ๋งˆ์ด์ปฌ๋ฆฌ (์ƒํ’ˆํ›„๊ธฐ) - ์ž‘์„ฑ๊ฐ€๋Šฅํ›„๊ธฐ, ์ž‘์„ฑ์™„๋ฃŒํ›„๊ธฐ

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

  • ์ฐœ(์ฐœํ•˜๊ธฐ, ์ฐœ์‚ญ์ œํ•˜๊ธฐ, ์ฐœ๋‚ด์—ญ๋ณด๊ธฐ),
  • ๋ฐฐ์†ก์ง€ ์ถ”๊ฐ€, ๋ฐฐ์†ก์ง€ ์กฐํšŒ, ํŠน์ • ๋ฐฐ์†ก์ง€์กฐํšŒ, ๋ฐฐ์†ก์ง€ ์ˆ˜์ •, ๋ฐฐ์†ก์ง€ ์‚ญ์ œ ์—ฐ๋™

  • ๊ฐ€๊ฒฉ์— ์ฝค๋งˆ ๋ชจ๋‘ ์ˆ˜์ •
  • API ์•ˆ๋‚˜์˜ด
    • ํ™”๋ฉด๋งŒ ๊ตฌํ˜„ํ•จ. ์šฐ์„  ์—ฐ๋™์€ ๋ณด๋ฅ˜ [๊ฐœ์ธ์ •๋ณด ์ˆ˜์ •(๋ณด๋ฅ˜), ๋Œ€๋Ÿ‰์ฃผ๋ฌธ ๋ฌธ์˜(๋ณด๋ฅ˜), ํ›„๊ธฐ ๋ฌธ์˜(๋ณด๋ฅ˜)]
    • ํ™”๋ฉด ๊ตฌํ˜„ ๋ชปํ•จ, API๋„ ์•ˆ๋‚˜์˜ด [ ์ž์ฃผํ•˜๋Š” ์งˆ๋ฌธ ]
    • ๊ฒ€์ƒ‰API ์•ˆ๋‚˜์˜ด
    • ์นดํ…Œ๊ณ ๋ฆฌ API ์ตœ์ข… ์•ˆ๋‚˜์˜ด
    • ๊ธฐํƒ€ ์ƒํ’ˆ๊ณผ ์—ฐ๊ด€๋œ API ์กฐ๊ธˆ์”ฉ ์ˆ˜์ •์ด ํ•„์š”ํ•œ๋ฐ ์‹œ๊ฐ„์ƒ ์•ˆ๋  ๊ฒƒ ๊ฐ™์Œ ( ํ˜„์žฌ ๋‚˜์˜จ API ์—ฎ๋Š”๊ฒŒ ์šฐ์„ ์ธ ๊ฒƒ ๊ฐ™์Œ )

14์ผ์ฐจ ๊ฐœ๋ฐœ์ผ์ง€ ( 21 )

  • ๋งˆ์ผ“์ปฌ๋ฆฌ ์„œ๋น„์Šค์ ๊ฒ€์‹œ๊ฐ„ + ์„œ๋ฒ„์•ˆ๋จ ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šด ์ƒํ™ฉ
  • ๋Œ€๋ณธ์งœ๊ณ  ์˜์ƒ์ฐ์–ด์„œ ์ œ์ถœ - ์œ ํŠœ๋ธŒ
    • ์‹œ๊ฐ„์ƒ ๋Œ€๋ณธ ์งœ์ง€ ๋ชปํ•ด์„œ ๋ฐ”๋กœ ์˜์ƒ์ฐ์–ด ์ œ์ถœ
  • ํŒ€์›๋“ค๊ณผ ์–˜๊ธฐ ๋์— ์ถ”๊ฐ€์ž‘์—…์„ ํ†ตํ•ด ๋งˆ๋ฌด๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋ฃจ ๊ฒฐ์ •
    • ํ”„๋กœ์ ํŠธ ์ž‘์—… ๋” ํ•˜๊ธฐ
    • ํŒ€ ๊นƒ ๋ ˆํฌ ํŒŒ๊ธฐ
      • ๋ฆฌ๋“œ๋ฏธ ์ž‘์„ฑํ•˜๊ธฐ

๊ทธ ์ดํ›„ ๊ฐœ๋ฐœ์ผ์ง€

  • ์„œ๋ฒ„

    • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ๋ถ€๋ถ„๋งŒ url ์ฃผ์†Œ /app ์ด ์—†์Œ
    • ์Šคํ‹ฐ๋ธŒ๋‹˜: ์•„์ดํ…œ 1-3๋ฒˆ๊นŒ์ง€๋ฐ–์— ์—†๋Š”๋ฐ ๋‚˜๋จธ์ง€๋„ ๋ณต๊ตฌ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹น
    • ๊ทธ๋ฆฌ๊ณ  ์•„์ดํ…œ ์ฟ ํฐ๋„ ๋ฆฌ์ŠคํŠธ์—์žˆ๋Š”๋ฐ, ์ƒํ’ˆ๋“ค์–ด๊ฐ€๋ฉด ์—†์–ด์šฉ ( ๋งž์ถฐ์ฃผ์„ธ์š” )
    • ์นดํŠธ์— ๋‹ด์€ ์•„์ดํ…œ ์ •๋ณด๋“ค์ด ํ‹€๋ฆฝ๋‹ˆ๋‹ค !
  • ๋ฐฐ์†ก์ง€ ๊ด€๋ จ ๋ถ€๋ถ„ ๋ชจ๋‘ ๋งˆ๋ฌด๋ฆฌ

  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ด€๋ จ ๋ถ€๋ถ„ ๋ชจ๋‘ ๋งˆ๋ฌด๋ฆฌ

    • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ๋ถ€๋ถ„๋งŒ url ์ฃผ์†Œ /app ์ด ์—†์Œ
  • ์ฃผ๋ฌธ

  • ์ ๋ฆฝ๊ธˆ

  • CartViewController โ†’ CellContent

    ์ด ๋ถ€๋ถ„ Nil์ด ์ˆ˜์ •๋˜๋ฉด ๋ฐ”๊ฟ”์•ผ๋จ - ์ˆ˜์ •๋จ

    if target.getItemRes.discount_rate != nil {
                    
    } else {
                    
    }
  • ์…€ ๋ˆŒ๋ €์„๋•Œ ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ โ†’ cell.selectionStyle = .none ์œผ๋กœ ๋ชจ๋‘ ์ˆ˜์ •

  • ์ฐœํ•œ ์ƒํ’ˆ - ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ ์žˆ์Œ - ๋ฏธ๊ตฌํ˜„

  • ๋ฐฐ์†ก์ง€ ์ƒˆ๋กœ ๋“ฑ๋กํ•  ๋•Œ ์ฃผ์†Œ๊ฒ€์ƒ‰์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ์ž„์˜๋กœ ํ™”๋ฉด ์ˆ˜์ •ํ–ˆ์Œ โ†’ ์ถ”ํ›„ ์นด์นด์˜ค API๋กœ ํ•  ์˜ˆ์ •

  • ๋งˆ์ผ“์ปฌ๋ฆฌ ์•„์ด์ฝ˜ ๋งŒ๋“ค๊ธฐ

  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์•ฝ๊ฐ„ ์ˆ˜์ •์ด ํ•„์š” ( ํ›„์ˆœ์œ„ )

  • ๊ฒ€์ƒ‰์–ด๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™


๋ฐœ์ƒ์ด์Šˆ ํ•ด๊ฒฐ

์งˆ๋ฌธ ( ๋ฐœ์ƒ์ด์Šˆ )

์˜ค๋Š˜ ์„œ๋ฒ„์—๊ฒŒ ๋งํ•˜๊ธฐ

  • ํ˜„์žฌ ์ „์ฒด ํšŒ์› ์กฐํšŒ API ์•ˆ๋จ
  • ์ž์ฃผํ•˜๋Š” ์งˆ๋ฌธ ์ •๋ณด๋งŒ ๋ถˆ๋Ÿฌ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ ( x )
  • ๊ณต์ง€์‚ฌํ•ญ ์ œ๋ชฉ, ๋‚ ์งœ๋งŒ ( ๋‚ด์šฉ๊นŒ์ง€ ํ•„์š”์—†์Œ )
  • ์‹ ์ƒํ’ˆ, ๋ฒ ์ŠคํŠธ, ์•Œ๋œฐ์‡ผํ•‘ API - ๊ธฐ์ค€ ์žก์•„์„œ ๋ง์”€ํ•ด์ฃผ์‹œ๊ธฐ
  • ์ถ”์ฒœ์ˆœ, ๋†’์€๊ฐ€๊ฒฉ์ˆœ, ๋‚ฎ์€๊ฐ€๊ฒฉ์ˆœ.. ๋“ฑ ์ •๋ ฌ ๋ถ€๋ถ„
  • ๋”๋ฏธ๋ฐ์ดํ„ฐ ๋งŽ์ด ์ƒ์„ฑ - ์‹œ๊ฐ„์ƒ ์•ˆ๋  ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์‹ฌ
  • ์ฃผ์ œ๋ณ„๋กœ ๋ฐ์ดํ„ฐ ๋„ฃ์–ด์„œ - 4-5๊ฐœ๊ฐ€ ํ•œ๊ณ„์ผ ๊ฒƒ ๊ฐ™์Œ
  • ์„œ๋ฒ„ ํ•ฉ์น˜๊ธฐ - 5~6์‹œ๊ฐ„์งธ ๊ฑธ๋ฆผ ( ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ ๋ชปํ•จ ..ใ… ใ…  )
  • ๋ฐ์ดํ„ฐ ์†์‹ค๋กœ ๋””์ฝ”๋”ฉ์ด ์•ˆ๋จ - ๋ณต๊ตฌํ•ด๋‹ฌ๋ผ๊ณ ํ•˜๊ธฐ ( ์ž„์‹œ๋กœ 3๊ฐœ๋งŒ ๋ณต๊ตฌํ•จ )
  • ๊ณต์ง€์‚ฌํ•ญ ๋”๋ฏธ๋ฐ์ดํ„ฐ ๋„ฃ์–ด์ฃผ๊ธฐ

๊ฐœ์ธ์ 

  • withIdentifier, identifier ?

  • ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ โ†’ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋™๊ทธ๋ผ๋ฏธ๋กœ ํ‘œ์‹œ

  • ์ทจ์†Œ์„ 

    // MARK: - ์ทจ์†Œ์„ 
        func cancleLine(text: String, targetLabel: UILabel){
            let attributedString = NSMutableAttributedString(string: text)
            attributedString.addAttribute(.strikethroughStyle, value: 1.07, range: (text as NSString).range(of: text))
            targetLabel.attributedText = attributedString
        }

  • ์„ธ์ž๋ฆฌ์ˆ˜๋งˆ๋‹ค ์ฝค๋งˆ๋„ฃ๊ธฐ

    // MARK: - ์„ธ์ž๋ฆฌ ์ˆซ์ž๋งˆ๋‹ค ์ฝค๋งˆ ๋„ฃ๊ธฐ
        func DecimalWon(value: Int) -> String{
            let numberFormatter = NumberFormatter()
            numberFormatter.numberStyle = .decimal
            let result = numberFormatter.string(from: NSNumber(value: value))! + "์›"
            
            return result
        }
  • switch โ†’ assert(false,"์•„๋‹˜")

  • swift๋Š” string์„ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์งœ๋ฅผ ์ˆ˜ ์—†๋‹ค.

    https://ios-development.tistory.com/379

    str.substring(from: 0, to: 2)
  • ํƒ€์ด๋จธ

    https://fdee.tistory.com/entry/iOS-ํ”„๋กœ์ ํŠธTiTi-๊ณต๋ถ€๋ฅผ-์œ„ํ•œ-ํƒ€์ด๋จธiOS-UPDATE

  • ์ƒ๋‹จ ๋ฐฐ์†ก์ง€ ์„ ํƒ ๋ถ€๋ถ„ ( ํ•˜ํ”„ ๋ชจ๋‹ฌ )

    'MaterialComponents/BottomSheetโ€™

    https://material.io/components/sheets-bottom/ios

    https://gonslab.tistory.com/57

  • UICollectionReusableView์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„ ( ์•„์šธ๋ › ์—ฐ๊ฒฐ ) - Xib ๋งŒ๋“ค์–ด์„œ ์—ฐ๊ฒฐ

    • Xib์•ˆ๋งŒ๋“ค๊ณ  ๊ทธ๋ƒฅ ๋„์šธ ๊ฒฝ์šฐ

      //
      //  BestViewController.swift
      //  MarketKurlyApp
      //
      //  Created by ์ดํ•˜์—ฐ on 2022/01/10.
      //
      
      import UIKit
      import XLPagerTabStrip
      
      class BestViewController: UIViewController, IndicatorInfoProvider {
          
          var tabName: String = ""
          
          // MARK: - UIComponents
          @IBOutlet weak var collectionView: UICollectionView!
          
          // MARK: - LifeCycle
          override func viewDidLoad() {
              super.viewDidLoad()
              setUI()
          }
          
          override func didReceiveMemoryWarning() {
              super.didReceiveMemoryWarning()
          }
          
          // MARK: - Functions
          func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
              return IndicatorInfo(title: "\(tabName)")
          }
          
          func setUI(){
              collectionView.dataSource = self
              collectionView.delegate = self
              registerNib(cellNibName: "Product2Cell", cellIdentifier: "product2Cell")
          }
          
          func registerNib(cellNibName: String, cellIdentifier: String){
              let newCellNib = UINib(nibName: cellNibName, bundle: nil)
              self.collectionView.register(newCellNib, forCellWithReuseIdentifier: cellIdentifier)
          }
          
      }
      
      extension BestViewController : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
          func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
              return 50
          }
          
          func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
              switch kind {
              case UICollectionView.elementKindSectionHeader :
                  let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "bestHeaderView", for: indexPath)
                  return headerView
              default :
                  assert(false,"No")
              }
          }
          
          func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
              guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "product2Cell", for: indexPath) as? Product2Cell else {
                  return UICollectionViewCell()
              }
              return cell
          }
          
          
          //์ปฌ๋ ‰์…˜๋ทฐ ์‚ฌ์ด์ฆˆ ์„ค์ •
          func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
              let margin:CGFloat = 25
              let cellRatio: CGFloat = 5/3
              let screenWidth = UIScreen.main.bounds.width
              let cellWidth =  (screenWidth-margin) / CGFloat(2)
              let cellHeight = cellWidth * cellRatio + 50
              return CGSize(width: cellWidth, height: cellHeight)
          }
          
      }
    • Xib ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ...

  • ์ •๋ ฌํ•˜๋Š” ๋“œ๋กญ๋‹ค์šด

    https://github.com/AssistoLab/DropDown

  • ์‹ ์ƒํ’ˆ, ๋ฒ ์ŠคํŠธ, ์•Œ๋œฐ์‡ผํ•‘ ๋ถ€๋ถ„ ์Šคํฌ๋กคํ•˜๋ฉด ํ•œ๊บผ๋ฒˆ์— ๊ฐ™์ด ์˜ฌ๋ผ๊ฐ€๊ณ  ์‹ถ์€๋ฐ ๋”ฐ๋กœ ๋†ˆ

    ScrollView์•ˆ์— collectionView๋ฅผ ์ง€์ •ํ•ด์„œ ์ƒ๊ธด ๋ฌธ์ œ์˜€์Œ

    collection reusable View๋กœ ํ•ด๊ฒฐ

  • ๋กœ๊ทธ์•„์›ƒํ• ๋•Œ ํ˜„์žฌ ๊ฐœ๋ฐœํ•œ ์ƒํƒœ๋กœ๋Š” ์ƒˆ๋กœ๊ณ ์นจ์ด ์•ˆ๋จ

    ๋นˆ VC (์ƒ‰์ƒ์—†์Œ) ์œผ๋กœ viewWillAppear์‹œ dismissํ•˜๊ธฐ

  • ๋น„ ํšŒ์› โ†’ ํšŒ์›์œผ๋กœ ๋กœ๊ทธ์ธํ•  ๋•Œ ํƒญ๋ฐ”๋Š” ๊ณ ์ •์œผ๋กœํ•˜๊ณ  ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผํ•˜๋Š”๋ฐ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Œ

    ์ปจํ…Œ์ด๋„ˆ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ

  • ํ™ˆ ํ™”๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์Šค์™€์ดํ”„

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ XLPagerTabStrip ์‚ฌ์šฉ

  • ํšŒ์›๊ฐ€์ž…ํ•  ๋•Œ ๋ผ๋””์˜ค ๋ฒ„ํŠผ, ์ฒดํฌ๋ฐ•์Šค ๋ถ€๋ถ„

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ DLRadioButton ์‚ฌ์šฉ

    CheckBox โ†’ https://sweetdev.tistory.com/527

  • ์ฃผ๋ฌธ๋‚ด์—ญ์—์„œ ํ…Œ์ด๋ธ”์…€ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ ์กฐ์ ˆ - tableViewCell์— func layoutSubviews ๋ฅผ ์‚ฌ์šฉ

    override func layoutSubviews() {
            super.layoutSubviews()
            contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
    }
  • ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒญ๋ฐ” ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋”๋‹ˆ ๋‹ค์‹œ ๋ฃจํŠธ๋ทฐ๋กœ ๋Œ์•„๊ฐ”์„ ๋•Œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒ‰์ƒ์ด ๋ณ€๊ฒฝ์ด ์•ˆ๋จ

    LifeCycle๋ฅผ ์ด์šฉํ•˜์—ฌ ํ˜ธ์ถœ๋˜๋Š” ํƒ€์ด๋ฐ์— ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Œ, ๋˜, ์• ์ดˆ์— ํ™”๋ฉด์ด๋™ํ•˜๋Š” ์ฝ”๋“œ์—์„œ ๋‹ค์Œ ํ™”๋ฉด์˜ NavigationVC๋กœ ์ด๋™ํ• ์ง€ ( present ), NavigationVC๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ณธ์ธ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ• ์ง€ ( presnet , push ) ๋“ฑ์—์„œ ๊ผฌ์˜€๋˜ ๋ถ€๋ถ„๋„ ์žˆ์Œ - ํ๋ฆ„์„ ์ž˜๋ชป ํŒŒ์•…ํ•ด์„œ ์‚ฝ์งˆ์„ ๋งŽ์ดํ•จ

  • ์ƒํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ํ™”๋ฉด ์ „ํ™˜ํ• ๋•Œ Pushํ•˜๋ฉด ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์ด ์•ˆ๋‚˜ํƒ€๋‚จ

    Left Items Supplment๋ฅผ ์ฒดํฌํ•ด์ฃผ๊ณ , Back Button ๊ณต๋ฐฑ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅ

    Untitled

  • stepper ๋ชจ์–‘์ด ๋‹ค๋ฆ„ - ์ปค์Šคํ…€

    ์ด ๋ถ€๋ถ„์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ปค์Šคํ…€ํ•˜์—ฌ ๋งŒ๋“ฌ

    ์Šคํƒฌํ”„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    https://github.com/gmertk/GMStepper

  • ๋กœ๊ทธ์ธ ์ƒ๋‹จ ํŒ์—… ์•Œ๋ฆผ์ฐฝ - ์ปค์Šคํ…€

    https://github.com/wxxsw/GSMessages

  • ํ…Œ์ด๋ธ” ์…€์„ ๋ˆ„๋ฅด๋ฉด ํ™•์žฅ๋˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

    https://github.com/okhanokbay/ExpyTableView

  • ํ…Œ์ด๋ธ”๋ทฐ ์„ ํƒ ์ƒ‰์ƒ ์—†์• ๊ธฐ

    cell.selectionStyle = .none
  • ์ƒํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€, ์ฐœ, ๊ตฌ๋งค๋ถ€๋ถ„ ๋งจ ์•ž์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ

    **self**.view.bringSubviewToFront(**self**.fixView)
  • ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ

    @IBAction func allAgreementBtn(_ sender: UIButton!) {
            sender.isSelected.toggle()
        }
  • url์„ ์ด๋ฏธ์ง€๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ( kingfisher )

    if let url: URL = URL(string: "https://i.ibb.co/TTQhmV2/047e9de093bf48d2953e8b2d64a95120.png" ){
                imageDetailImgView.kf.indicatorType = .activity
                imageDetailImgView.kf.setImage(with:url)
            }
  • ๋ทฐ ์•ˆ์— ์„  ๊ธ‹๊ธฐ

    import UIKit
    
    extension CALayer {
        func addBorder(_ arr_edge: [UIRectEdge], color: UIColor, width: CGFloat) {
            for edge in arr_edge {
                let border = CALayer()
                switch edge {
                    case UIRectEdge.top:
                    border.frame = CGRect.init(x: 0, y: 0, width: frame.width, height: width)
                    break case
                    UIRectEdge.bottom:
                    border.frame = CGRect.init(x: 0, y: frame.height - width, width: frame.width, height: width)
                    break case
                    UIRectEdge.left:
                    border.frame = CGRect.init(x: 0, y: 0, width: width, height: frame.height)
                    break case
                    UIRectEdge.right: border.frame = CGRect.init(x: frame.width - width, y: 0, width: width, height: frame.height)
                    break default:
                    break
                }
                border.backgroundColor = color.cgColor;
                self.addSublayer(border)
            }
        }
    }
    
    //์ ์šฉ ๋ฐฉ๋ฒ• 
    your_view.layer.addBorder([.top, .bottom], color: UIColor.white, width: 1.0) 
    
    //์ฃผ์˜! viewDidAppear()<- ์— ์ ์šฉํ•ด์•ผ ์„ ์ด ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€์—์„œ ์ƒ‰์ƒ ์ถ”์ถœํ•˜์—ฌ hex๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์‚ฌ์ดํŠธ

    https://ko.rakko.tools/tools/64/

  • ํ•œ์ค„๋กœ ์กฐ๊ฑด๋ฌธ ์“ฐ๊ธฐ

    var msg = number >= 20 ? "higger" : "lesser"
  • ์ƒˆ๋กœ๊ณ ์นจ

    https://scshim.tistory.com/149

  • ํ…์ŠคํŠธํ•„๋“œ ์•ก์…˜

    https://42kchoi.tistory.com/272

  • ํƒœ๊ทธ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

    https://apple-apeach.tistory.com/74

    https://magi82.github.io/ios-intrinsicContentSize/

    https://velog.io/@seondal/iOS-Collection-View-Cell-ํฌ๊ธฐ๋ฅผ-์ปจํ…์ธ ์—-๋”ฐ๋ผ-๋ฐ”๋€Œ๊ฒŒ-ํ•˜๊ธฐ

    https://github.com/seondal

  • ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋ฒ„ํŠผ ๊ฐ„๊ฒฉ - ์ปค์Šคํ…€

    ๋ฒ„ํŠผ 2๊ฐœ๋กœ ํ–ˆ์Œ

    • ์ฒซ๋ฒˆ์งธ ๋ฐฉ์‹

      func customNaviBarItem(btnColor: UIColor, naviItem: UINavigationItem){
      
              lazy var mapLeftBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then {
                  $0.setImage(UIImage(systemName: "map"), for: .normal)
                  $0.tintColor = btnColor
                  $0.addTarget(self, action: #selector(self.addressBarBtnTapped(_:)), for: .touchUpInside)
              }
              lazy var cartRightBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then {
                  $0.setImage(UIImage(systemName: "cart"), for: .normal)
                  $0.tintColor = btnColor
                  $0.addTarget(self, action: #selector(self.cartBarBtnTapped(_:)), for: .touchUpInside)
              }
              let leftBarBtnItem = UIBarButtonItem(customView: mapLeftBtn)
              let rightBarBtnItem = UIBarButtonItem(customView: cartRightBtn)
              
              rightBarBtnItem.imageEdgeInsets = UIEdgeInsets(top: 0, left: -10, bottom: 0, right: 10)
              naviItem.rightBarButtonItems = [rightBarBtnItem,leftBarBtnItem]
              
          }
          
          
          @objc func addressBarBtnTapped(_ sender: AnyObject) {
              
          }
          
          @objc func cartBarBtnTapped(_ sender: AnyObject) {
              
          }
    • ๋‘๋ฒˆ์งธ ๋ฐฉ์‹

      func customNaviBarItem(btnColor: UIColor, naviItem: UINavigationItem){
      
              lazy var mapLeftBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then {
                  $0.setImage(UIImage(systemName: "map"), for: .normal)
                  $0.tintColor = btnColor
                  $0.addTarget(self, action: #selector(self.addressBarBtnTapped(_:)), for: .touchUpInside)
              }
              lazy var cartRightBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 10, height: 10)).then {
                  $0.setImage(UIImage(systemName: "cart"), for: .normal)
                  $0.tintColor = btnColor
                  $0.addTarget(self, action: #selector(self.cartBarBtnTapped(_:)), for: .touchUpInside)
              }
              let leftBarBtnItem = UIBarButtonItem(customView: mapLeftBtn)
              let rightBarBtnItem = UIBarButtonItem(customView: cartRightBtn)
              
              let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: self, action: nil)
              space.width = 15
              naviItem.rightBarButtonItems = [rightBarBtnItem,space,leftBarBtnItem]
              
          }
          
          
          @objc func addressBarBtnTapped(_ sender: AnyObject) {
              
          }
          
          @objc func cartBarBtnTapped(_ sender: AnyObject) {
              
          }
  • ๊ธฐ๋ณธ ์ฝ”๋“œ

    • ๊ธฐ๋ณธ ์ฝ”๋“œ

      class AddressListCell: UITableViewCell {
          
      		// MARK: - Components
      
          // MARK: - LifeCycle
          override func awakeFromNib() {
              super.awakeFromNib()
              setUI()
          }
          
          override func setSelected(_ selected: Bool, animated: Bool) {
              super.setSelected(selected, animated: animated)
          }
          
          // MARK: - Functions
          func setUI(){
              
          }
      }
      extension AddressManagmentViewController: UITableViewDelegate, UITableViewDataSource {
          func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
              return 2
          }
          
          func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
              guard let cell = tableView.dequeueReusableCell(withIdentifier: "AddressListCell", for: indexPath) as? AddressListCell else {
                  return UITableViewCell()
              }
              return cell
          }
          
      }
      // MARK: - Components
          
          // MARK: - LifeCycle
          override func viewDidLoad() {
              super.viewDidLoad()
              setUI()
          }
          
          // MARK: - Functions
          func setUI(){
              
          }
    • ํ™”๋ฉด ์ด๋™

      let storyboard = UIStoryboard(name: "Item", bundle: nil)
      let ItemDetailVC = storyboard.instantiateViewController(identifier: "ItemDetailSB")
      ItemDetailVC.modalPresentationStyle = .fullScreen
      let storyboard = UIStoryboard(name: "Login", bundle: nil)
      guard let IdResultVC = storyboard.instantiateViewController(identifier: "IdResultSB") as? IdResultViewController else { return }
      IdResultVC.userId = self.findUserIdx!
      self.navigationController?.pushViewController(IdResultVC, animated: true)

์šฐ๋…ธ ( ๋ฉ˜ํ†  )

  • ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒญ๋ฐ”์— ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์–ด์„œ ์ปค์Šคํ…€ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ํฌ๊ธฐ ์กฐ์ •์ด ์‹คํŒจํ•จ ( ํ›„์ˆœ์œ„ ) - ok

  • ์šฐ๋…ธ - ์ด ์ƒํ’ˆ ์–ด๋•Œ์š” ํŠน์ • ์…€์˜ ์ œ๋ชฉํ…์ŠคํŠธ ๋ณด์ด๋Š” ์ƒํƒœ๊ฐ€ ์‹ค์ œ์•ฑ์ด๋ž‘ ์ข€ ๋‹ค๋ฆ„( ํ›„์ž‘์—… ) - ok

  • ๋ฐฐ์†ก์ง€ ์ƒˆ๋กœ ๋“ฑ๋กํ•  ๋•Œ ์ฃผ์†Œ๊ฒ€์ƒ‰์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ์ž„์˜๋กœ ํ™”๋ฉด ์ˆ˜์ •ํ–ˆ์Œ โ†’ ์ถ”ํ›„ ์นด์นด์˜ค API๋กœ ํ•  ์˜ˆ์ •

  • ๋ฐฐ์†ก์ง€ ์„ ํƒ ํ•˜ํ”„ ๋ชจ๋‹ฌ

    ๋ฐ”ํ…€์‹œํŠธ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ


  • delegate, MVVM ํŒจํ„ด ๊ฐ•์˜๋ฅผ ํ•ด์ฃผ์‹ฌ ๐Ÿ‘

  • ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ๋ถ€๋ถ„ ๋ถ„๋ฆฌ

    • ์„œ๋ฒ„์™€ ์—ฐ๋™ํ•˜๊ธฐ ์ „ ํ™”๋ฉด ๊ตฌ์ƒํ•  ๋•Œ ๋”๋ฏธ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์•ผ ๋  ํ…๋ฐ
  • ํ™ˆ ํ™”๋ฉด์—์„œ MD์˜ ์ถ”์ฒœ ๋ถ€๋ถ„ ๋นผ๊ณ  ์ง„ํ–‰ํ•˜๊ธฐ

  • ์ตœ๊ทผ ๊ฒ€์ƒ‰์–ด ํƒœ๊ทธ ๋ถ€๋ถ„ ๋„ˆ๋น„๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹น

    ํ…์ŠคํŠธ์˜ ๊ธธ์ด๋ฅผ ๋ฐ›์•„์™€์„œ ๋„ˆ๋น„ ์ง€์ •

  • ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ณ€๊ฒฝ

    func customNavigationBarAttribute(_ backgroundColor: UIColor,
                                          _ titleColor: UIColor) {
            let appearance = UINavigationBarAppearance()
            appearance.configureWithOpaqueBackground()
            appearance.backgroundColor = backgroundColor
            appearance.titleTextAttributes = [.foregroundColor: titleColor]
            appearance.shadowColor = .clear
            self.navigationController?.navigationBar.standardAppearance = appearance
            self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
        }
  • API ๋ช…์„ธ์„œ ๋ณด์—ฌ์ฃผ๋ฉด์„œ ์ •๋ ฌ(์‹ ์ƒํ’ˆ,๋ฒ ์ŠคํŠธ,์•Œ๋œฐ์‡ผํ•‘,์ถ”์ฒœ์ˆœ... ๋“ฑ)ํ•˜๋Š” ๋ถ€๋ถ„

    • ์„œ๋ฒ„์—์„œ ํ•˜๋Š” ๊ฒŒ ๋งž๋Š”์ง€, ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•˜๋Š” ๊ฒŒ ๋งž๋Š”์ง€ โ‡’ ์„œ๋ฒ„
  • ์•„์ดํ…œ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ ์˜†์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

    • push ๋™์ž‘์ด ๋˜์–ด์•ผํ•˜๋Š”๋ฐ ํƒญ๋ฐ”๊ฐ€ ์•„๋ž˜์— ๊ทธ๋Œ€๋กœ ๋‚จ์Œ - ํƒญ๋ฐ” ์ˆจ๊ธฐ๋ฉด ๋จ

      ๋„์šธ ํ™”๋ฉด์˜ WillAppear, Disapper์— ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋จ

      self.tabBarController?.tabBar.isHidden = true
    • modal๋กœ ๋„์šฐ๊ณ , pushํ•  ๋•Œ์™€ ๊ฐ™์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋™์ž‘ - ๋น„์ถ” ( ์ตœํ›„์˜ ์ˆ˜๋‹จ )

  • ๋„ค๋น„๊ฒŒ์ด์…˜ ํ™”๋ฉด์ „ํ™˜(push)ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์™ผ์ชฝ ๋ฐฑ๋ฒ„ํŠผ ๋ถ€๋ถ„

    ์ž๋™์œผ๋กœ ์™ผ์ชฝ ๋ฐฑ๋ฒ„ํŠผ์ด ๋‚˜์˜ค๋ฉด, ์ƒ‰์ƒ๊ณผ navigationBar์˜ ํƒ€์ดํ‹€์„ ์—†์• ๋ฉด ๋จ.

    func naviTitleDelete(navi: UINavigationController){
            navi.navigationBar.tintColor = .black
            navi.navigationBar.topItem?.title = ""
        }
  • ์Šคํฌ๋กค๋ทฐ์—์„œ ๋™์ ์œผ๋กœ ๋†’์ด ์กฐ์ ˆ์„ ํ•˜๊ณ  ์‹ถ์Œ

    ๋™์ ์œผ๋กœ ๋†’์ด๊ฐ€ ์กฐ์ ˆ๋˜๋Š” StackView๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋จ

  • ์…€๋งˆ๋‹ค ๋™์ ์œผ๋กœ ๋†’์ด ์กฐ์ ˆํ•˜๊ณ  ์‹ถ์Œ

    UITableView.automaticDimension ์„ ์ ์šฉํ•ด์ฃผ๋ฉด ๋จ ( ๋‹จ, ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์ œ์•ฝ์กฐ๊ฑด์„ ์ž˜ ์„ค์ •๋˜์•ผ๋จ )

  • ๋ฒ„์ „ 15์ด์ƒ์ผ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐฐ๊ฒฝ์ƒ‰์ƒ, ํƒ€์ดํ‹€์ƒ‰์ƒ ์ด์Šˆ

    self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]

About

๐Ÿš› ๋งˆ์ผ“์ปฌ๋ฆฌ ํด๋ก  ์ฝ”๋”ฉ ๐Ÿš›

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 99.8%
  • Ruby 0.2%