Smile Blog๐Ÿ˜€

Smile Blog : ์›ƒ๊ณ  ์‚ฝ์‹œ๋‹ค ๐Ÿ˜€

Index

๊ธฐ๋Šฅ ๋ฐ ์†Œ๊ฐœ

๋ฉ”์ธ ํŽ˜์ด์ง€

์‚ฌ์šฉ์ž์˜ ๋ฐฐ๊ฒฝ ํ™”๋ฉด๊ณผ ๋ธ”๋กœ๊ทธ ๊ธ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

keyword: UITableView, CustomView

๊ธ€ ๋“ฑ๋ก

TabBarController๋ฅผ ํ†ตํ•œ ๋ชจ๋‹ฌ ๋ทฐ ์ „ํ™˜ ํ›„ ์ƒˆ ๊ธ€ ์ž‘์„ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ž…๋ ฅํ•ด์•ผํ•  ํ•ญ๋ชฉ์ด ์ „๋ถ€ ์ž‘์„ฑ๋˜์–ด์•ผ ๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ธ€์ด ์ž‘์„ฑ๋˜๊ฑฐ๋‚˜, ์ทจ์†Œ๋˜๋ฉด ์ด์ „ ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜๋œ๋‹ค.

keyword: UITabBarController-Modal, DB Query

์ƒˆ ๊ธ€ ์“ฐ๊ธฐ ์ผ๋ถ€ ๋ฏธ์ž…๋ ฅ ์‹œ ํ™”๋ฉด ์ „ํ™˜

๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ

๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๊ธ€์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ˆ˜์ • ์‹œ์—” ๊ฒŒ์‹œ๊ธ€ ๋ทฐ ์ „ํ™˜๋˜๊ณ , ์‚ญ์ œ ์‹œ์—” ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๋กœ ํ™”๋ฉด์ด ์ „ํ™˜๋œ๋‹ค.

keyword: Notification Center, ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ, DB Query

์ˆ˜์ • ์š”์ฒญ ๊ธ€ ์ˆ˜์ • ํ™”๋ฉด ์™„๋ฃŒ ์‹œ ํ™”๋ฉด ์ „ํ™˜
์‚ญ์ œ ์š”์ฒญ ์š”์ฒญ ์‹œ ์–ผ๋Ÿฟ ๋ทฐ ๋„์›€ ์™„๋ฃŒ ์‹œ ํ™”๋ฉด ์ „ํ™˜

๋Œ“๊ธ€ ๊ธฐ๋Šฅ

์„ ํƒ๋œ ํฌ์ŠคํŠธ์— ๋Œ“๊ธ€์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

keyword: NotificationCenter, ScrollView, DB Query

ํ‚ค๋ณด๋“œ ON ํ‚ค๋ณด๋“œ OFF ๋Œ“๊ธ€ ๋“ฑ๋ก

๋งˆ์ด ํŽ˜์ด์ง€

์ด๋ฏธ ๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์œ ์ € ์„ค์ •์„ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ตฌํ˜„ํ•จ. ์ •๋ณด ์ˆ˜์ • ์š”์ฒญ์— ๋”ฐ๋ฅธ ์–ผ๋Ÿฟ ๋ทฐ ๊ตฌํ˜„ ์™ธ
์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•˜์ง„ ์•Š์•˜์Œ.

๋งˆ์ด ํŽ˜์ด์ง€ ์ •๋ณด ์ˆ˜์ • ์š”์ฒญ

์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ ์‚ฌํ•ญ


Project Smile Blog
UI ๊ตฌํ˜„ UIKit
์•„ํ‚คํ…์ณ MVC
๋กœ์ปฌ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ SQLite

๐Ÿ‘‰ UML

UML

UML ๋‚ด ๋ทฐ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ œ์™ธ.

๐Ÿ‘‰ ๋ฐ์ดํ„ฐ Flow

๋ธ”๋กœ๊ทธ ์„œ๋น„์Šค๋Š” ์‹ค์ œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ณผ์ •์ด ์š”๊ตฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๊ฐ€ ๊ตฌํ˜„๋˜์ง„ ์•Š์•˜์œผ๋‚˜, ์‹ค์ œ ์„œ๋ฒ„ ๊ตฌ์ถ•์ด ๋  ๊ฒƒ์ž„์„ ๊ณ ๋ คํ•˜์—ฌ, ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์œ„ํ•œ ๊ณผ์ •์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ–ˆ๋‹ค.

ํ—ˆ๋‚˜ MOCK์„ ์‚ฌ์šฉํ•œ ํ†ต์‹  ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋”๋ผ๋„ ์‹ค์ œ ํ†ต์‹  ์—†์ด๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€์— ๋Œ€ํ•œ CRUD๊ฐ€ ์–ด๋ ต๋‹ค๊ณ  ํŒ๋‹จ์ด ๋˜์–ด,
๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ
  • sqlite3 [O]
  • coreData [X]

=> SQLite

์„ ์ • ๊ธฐ์ค€

  • CoreData๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜ โญ•๏ธ
    ๋”ฐ๋ผ์„œ SQLite๋„ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฌธ์„ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” SQLite ์‚ฌ์šฉํ•ด DB๋ฅผ ๊ตฌ์„ฑ.
    ๋‚ด๋ถ€์ ์œผ๋กœ SQLite ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜์ง€๋งŒ, ์ง์ ‘ ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค! ์ด๋ฒˆ ๊ธฐํšŒ์— ๋งŽ์ด ๋‹ค๋ค„๋ณด์ž!
  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„
  • Post Table

    column ๋‚ด์šฉ ์†์„ฑ
    post_num ๊ธ€ ๋ฒˆํ˜ธ ์ €์žฅ / AutoIncrease INTEGER
    post_title ๊ธ€ ์ œ๋ชฉ ์ €์žฅ TEXT
    post_content ๊ธ€ ๋‚ด์šฉ ์ €์žฅ TEXT
    post_date ๊ธ€ ์ž‘์„ฑ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ €์žฅ TEXT
  • comment Table

    column ๋‚ด์šฉ ์†์„ฑ
    comment_num ๋Œ“๊ธ€ ๋ฒˆํ˜ธ ์ €์žฅ / AutoIncrease INTEGER
    comment_user ๋Œ“๊ธ€ ์ž‘์„ฑ์ž ์ €์žฅ TEXT
    comment_post ๋Œ“๊ธ€์ด ์ž‘์„ฑ๋œ ๊ธ€ post_num ์ €์žฅ INTEGER
    comment_content ๋Œ“๊ธ€ ๋‚ด์šฉ ์ €์žฅ TEXT
    comment_date ๋Œ“๊ธ€ ์ž‘์„ฑ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ์ €์žฅ TEXT

๐Ÿ‘‰ ์•„ํ‚คํ…์ณ

MVC(Model-View-Controller)

MVC ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ, ViewController๊ฐ€ ํ•˜๋Š” ์—ญํ• ์ด ๋งŽ์•„์ง€๋Š”๋ฐ(Massive View Controller)
ํ•ด๋‹น ๊ตฌ์กฐ์—์„œ ์ตœ๋Œ€ํ•œ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ณตํ†ต๋œ ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ, Protocol์˜ Extension์„ ํ™œ์šฉํ–ˆ๋‹ค.

๐Ÿ‘‰ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ

  • ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•œ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ

    => ํ˜‘์—… ์‹œ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์˜ ์‚ฌ์šฉ์œผ๋กœ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ๊ฐ„ ์ถฉ๋Œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋‹จ์  ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•จ.

๐Ÿ‘‰ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์„ฑ ๋ฐ ์—ญํ• 

Scene

protocol ์—ญํ• 
ViewConfiguration ViewController์—์„œ ์ฑ„ํƒ ํ›„ ๋ทฐ์˜ ๊ณ„์ธต, ์ œ์•ฝ, ์„ค์ •์„ ํ•˜๋„๋ก ํ•จ.
PostReloadable Post๋ฅผ ๊ฐ€์ง„ ์ผ๋ถ€ ViewController์—์„œ ์ฑ„ํƒ ํ›„ MainView ๋‚ด ํ…Œ์ด๋ธ”๋ทฐ Reload ์š”์ฒญ.
class ์—ญํ• 
IntroduceCell MainViewController์—์„œ ๋ธ”๋กœ๊ทธ ์†Œ๊ฐœ ์…€์„ ๊ตฌ์„ฑ
MainTableViewCell MainViewController์— ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์…€์„ ๊ตฌ์„ฑ
DetailViewContentCell DetailViewController ๋‚ด ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๊ตฌ์„ฑ
DetailViewCommentCell DetailViewController ๋‚ด ๋ธ”๋กœ๊ทธ ๋Œ“๊ธ€์„ ๊ตฌ์„ฑ
class ์—ญํ• 
MainTabBarController ํƒญ ๋ฐ” ๊ตฌ์„ฑ
MainViewController ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ๋ฆฌ์ŠคํŠธ ํ™”๋ฉด ๊ตฌ์„ฑ
NewPostViewController ์ƒˆ ๊ธ€ ์ž‘์„ฑ ํ™”๋ฉด ๊ตฌ์„ฑ
DetailViewController ํฌ์ŠคํŠธ ํ™”๋ฉด ๊ตฌ์„ฑ
UpdatePostViewController ํฌ์ŠคํŠธ ์ˆ˜์ • ํ™”๋ฉด ๊ตฌ์„ฑ
UserSettingViewController ์‚ฌ์šฉ์ž ํ™”๋ฉด ๊ตฌ์„ฑ(๋ฏธ๊ตฌํ˜„)

Model

struct ์—ญํ• 
Post ๊ธ€ ๊ตฌ์„ฑ
Comment ๋Œ“๊ธ€ ๊ตฌ์„ฑ

Module

class ์—ญํ• 
FMDBManager SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ ํ›„, ๋ฐ์ดํ„ฐ CRUD

๐Ÿ‘‰ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋„๊ตฌ ์‚ฌ์šฉ

SPM(Swift Package Manager)

  • FMDB : DB ๊ตฌ์„ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ
    • ๋‚ด๋ถ€์ ์œผ๋กœ SQLite3๋ฅผ ์‚ฌ์šฉ.

Trouble shooting

1. ๋ชจ๋‹ฌ ๋ทฐ์˜ ๋ถ€์žฌ

Navigation Controller1 – (root 1) -> View Controller A -(modal)-> Navigation Controller 2 -(root 2)-> View Controller B(UIVIewController) ์˜ ๊ณผ์ •์œผ๋กœ ๋ชจ๋‹ฌ์„ ๋„์šฐ๋Š” ๊ณผ์ •์—์„œ root 2์— ํ•ด๋‹นํ•˜๋Š” navigation Controller์—์„œ navigation Item์ด ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. View Controller B๋ฅผ Navigation Controller 2๋ฅผ root๋กœ ๊ฐ์‹ธ์คฌ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ œ๋Œ€๋กœ ์ถœ๋ ฅ์ด ๋˜์ง€ ์•Š์•„์„œ ๋‹นํ™ฉํ–ˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ ์›ํ•˜๋Š” ๋ชจ์Šต

๋„ค๋น„๊ฒŒ์ด์…˜2๋ฅผ ๋ชจ๋‹ฌ๋กœ ๋„์šธ ๋•Œ, View Controller B์—์„œ๋Š” NavigationBar์ด ๋‚˜์˜ค์งˆ ์•Š๋Š”๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ƒˆ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๋ทฐ๋Š” ์ƒˆ๋กœ์šด ํ๋ฆ„์„ ๊ฐ€์ ธ๊ฐ€์•ผํ•˜๋Š”๋ฐ, ๊ธฐ์กด ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ทฐ์˜ ๊ตฌ์„ฑ์—์„œ ์ผ๊ด€์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด modal ๋ทฐ๋กœ์˜ ๊ตฌํ˜„์„ ์ƒ๊ฐํ–ˆ์Œ.
ํ•˜์ง€๋งŒ ๋ณธ ๋ชจ๋‹ฌ์€ ์•ฑ์—์„œ ์ƒˆ ๊ธ€ ์ž‘์„ฑ ์™ธ์— ํƒ€ ๊ธฐ๋Šฅ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์ƒํ™ฉ์„ ๋ทฐ์— ์ง์ ‘ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด ๋ทฐ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.
Modal ์ œ๋Œ€๋กœ ๋œจ์ง€ ์•Š๋Š” ๋ฌธ์ œ์™€ ๊ด€๋ จ ์ฐธ๊ณ  ๋งํฌ

2. ํ‚ค๋ณด๋“œ์— ์˜ํ•œ ํ…์ŠคํŠธ๋ทฐ ๊ฐ€๋ ค์ง

๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์ด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ, ํ•˜๋‹จ์˜ ํ‚ค๋ณด๋“œ ์˜์—ญ์— ์˜ํ•ด ๋ณธ๋ฌธ์˜ ์˜์—ญ์ด ์ œ๋Œ€๋กœ ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ.
ํ‚ค๋ณด๋“œ๊ฐ€ ์˜ฌ๋ผ์™€ ์žˆ๋Š” ๊ฒฝ์šฐ, NotificationCenter์„ ํ™œ์šฉํ•ด ํ•ด๋‹น ํ…์ŠคํŠธ ๋ทฐ์˜ ์ตœํ•˜๋‹จ์ด ํ‚ค๋ณด๋“œ๋ณด๋‹ค ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.
๋˜ํ•œ ํ‚ค๋ณด๋“œ๊ฐ€ ๋‚ด๋ ค๊ฐ€๋Š” ์ƒํ™ฉ์—” ์ด์™€ ๋ฐ˜๋Œ€๋กœ ํ…์ŠคํŠธ ๋ทฐ๊ฐ€ ๋‹ค์‹œ ๋ถ€๋ชจ ๋ทฐ์˜ ์ตœํ•˜๋‹จ ์˜์—ญ๊ณผ ๋™์ผํ•œ ๋ ˆ์ด์•„์›ƒ ์ œ์•ฝ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ–ˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ ํ•ด๊ฒฐ ์ƒํ™ฉ
ํ‚ค๋ณด๋“œ ์ด์Šˆ ํ‚ค๋ณด๋“œ ์ด์Šˆ ํ•ด๊ฒฐ

๊ธ€ ์ž‘์„ฑ, ์ˆ˜์ •, ๋Œ“๊ธ€ ์ž‘์„ฑ ๋ชจ๋‘ ํ‚ค๋ณด๋“œ์— ์˜ํ•œ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜์•ผ ํ•ด์„œ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ๋งŽ์ด ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ NotificationCenter์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, Listener ๋ชจ๋‘์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, ์ฝ”๋“œ ์ ํ•‘์ด ๋งŽ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด delegate Pattern๋„ ๊ณ ๋ คํ•ด๋ด์•ผ๊ฒ ๋‹ค.

GitHub

View Github