๐ ๊ฐ๋ฐ29 [iOS]Unit Test์ ์ฌ์ฉ ์ด๋ฒ ๊ณผ์ ๋ฅผ ์งํํ๋ฉด์ ๊ฐ์ฅ ํ์์ฑ์ ์ ์คํ ๋๊ผ๋ ๊ฒ์ด ๋ฐ๋ก ์ด test์๋ค. ์ฌ๊ธฐ๊น์ง๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์, ์์ ํ๋ค๋ ๊ฒ์ ํ์ ํ๊ณ ๋ค์ ์ฝ๋๋ฅผ ์ง๊ณ ์ถ์ ๊ทธ ๋ง์..!! ๊ทธ๋ฐ๋ฐ ๋ง์นจ ํ๋ํ์ต์์ Unit Test์ TDD๊ฐ ๋์๊ธธ๋, ์ ๋ฆฌํด๋ณด์๋ค. Unit Test Unit Test๋ ๋ฉ์๋๋ณ ๊ธฐ๋ฅ์ด ์๋ํ ๋๋ก ๊ตฌํ๋์ด ์๋์ง ๊ฒ์ฆํ๋ ๊ฒ์ด๋ค. ์์ค ์ฝ๋์ ํน์ ๋ชจ๋์ด ์๋๋๋๋ก ์ ํํ ์๋ํ๋์ง ๊ฒ์ฆํ๋ ์ ์ฐจ๋ฅผ ํตํด ์์ฑํ ์ฝ๋์ ์์ ์ฑ์ ๋ถ์ฌํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค Test๋ฅผ ์์ฑํด์ผ ํ ๊น? FIRST ์์น Fast ๋น ๋ฅด๊ฒ Independent / Isolated ๋ ๋ฆฝ์ ์ผ๋ก Repeatable ๋ฐ๋ณต ๊ฐ๋ฅํ Self-Validating ์ค์ค๋ก ๊ฒ์ฆํ๋ Timely ์ ์์ F. ํ ์คํธ๋ผ๋ ๋ชฉ์ ์ ๋ง.. 2024. 2. 5. [iOS] UICollectionViewFlowLayout์ผ๋ก Pinterest Layout ๊ตฌํํ๊ธฐ ์ฒ์ ๊ณผ์ ๋ก ๋ฐ์ ํผ๊ทธ๋ง์ Pinterest๋ก ๊ตฌํ๋ View๋ฅผ ๋ณด๊ณ , Compositional๋ก ๋์ ํด์ผ์ง! ๋ผ๊ณ ํธ๊ธฐ๋กญ๊ฒ ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ Compositional์ ๋ฒฝ์ ๋์๊ณ .. item๊ณผ group, section์ผ๋ก ํฌ๊ธฐ๋ฅผ ์ฃผ๋ ๊ฒ์์ item ํฌ๊ธฐ๋ค์ ์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ ์ค์ผ ํ ์ง ๊ฐ์ด ์ ์กํ๋๋ผ. Section๋ณ๋ก๋ ์ฌ์ด๋ฐ!! ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊น๋ณด๋ฉด, Compositional + Combine์ ์กฐํฉ์ผ๋ก pinterest๊ฐ ๊ตฌํ๋์ด ์์๋ค. ๊ทธ๋ฌ๋ RxSwift๋ Combine์ ์์ง ์ ๋ชจ๋ฅด๋๋ฐ, ๊ณผ์ ๊ธฐ๊ฐ์ ๋งค์ฐ ์งง์๊ธฐ์ ์ฐจ๋ง ์ด๋ฒ์ ๋์ ํ ์์ ์ ์์๋ค. ์ด๋ฏธ collectionView, diffable data source, compositional ๋ฑ ์ฒ์ ์จ๋ณด๋ ๊ฒ์ด ์ฐ๋๋ฏธ..... 2024. 1. 31. [NSCache&URLCache]์ ์ด๋ฏธ์ง ํ์ผ์ด URLCache์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๋์คํฌ์ ์ ์ฅ๋ ๊น? ์๋ ํ์ญ๋๊น, ๋ฏผํธ์ ๋๋ค. ๐๋ฐ์ดํฐ๋ค์ ์ด๋์ ์ ์ฅ๋๊ณ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ๊น์?๋จผ์ ํ๋ ๋์คํฌ์ ์ฐ๋ฆฌ์ ๋ฐ์ดํฐ๋ค์ด ์ ๋ถ ์ ์ฅ๋ฉ๋๋ค. ๋๋ฌธ์ ํ๋ ๋์คํฌ๋ ์ฉ๋์ด ๋งค์ฐ ํฌ๊ณ , ๊ธฐ์ต์ ํ๋ ๊ฒ์ ์น์ค๋์ด ์์ต๋๋ค.RAM, ๋ฉ๋ชจ๋ฆฌ๋ ๊ทธ๋ฌํ ํ๋ ๋์คํฌ์์ ์ฑ์ ์คํํ๋๋ฐ์ ํ์ํ ์ค์ ๋ฐ์ดํฐ๋ค์ ๋ค๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋ด์ฉ์ ๋ฐฉ๋ํ๊ณ , RAM์ ๋์คํฌ๋ณด๋จ ๊ธฐ์ตํ ์ ์๋ ์์ด ์ ๊ณ , CPU์ ๊ฐ๊น์์ ๋น ๋ฅด์ง๋ง ์ด์ฐ ๋์๊ฑด ๊ธฐ์ต์ ํ๋ ๊ฒ์๋ง ๋ฅ๋ ฅ์ด ์น์ค๋์ด ์์ต๋๋ค.CPU๋ RAM์์ ๋ฐ์ ๋ฐ์ดํฐ๋ค์ ์ด์ฉํด ์ฑ์ ์คํํฉ๋๋ค. ๊ธฐ์ต๋ณด๋ค๋ ์ฑ๋ฅ์ด ์ค์ํด, ๊พธ์คํ๊ฒ ์ฑ๋ฅ์ด ์ ๊ทธ๋ ์ด๋ ๋์ด ์์ต๋๋ค. ๋๋ฌธ์ RAM๊ณผ CPU๋ ๊ธฐ์ต๊ณผ ์ฑ๋ฅ์ผ๋ก ๊ฐ์์ ๋ชฉ์ ์ด ๋ค๋ฅด๊ธฐ์ ์๋ก์๋ก ์ฑ๋ฅ์ฐจ์ด๊ฐ ์ ์ ์ฌํ๊ฒ ๋๊ฒ ๋ฉ๋๋ค. .. 2024. 1. 28. [iOS] Test ํ์ผ์ ๋ฃ์ Asset ์์ฑ์ ์ค๋ฅ_ Bundle ์ฌ์ฉ ํ ์คํธ์ฉ JSON ํ์ผ์ ์ดํ์๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๊ธฐ์ test ํด๋์ ๋ฐ๋ก Asset catalog๋ฅผ ๋ง๋ค์ด์ ๊ทธ๊ณณ์์๋ง ๋ฃ์ด๋๊ณ ์ฌ์ฉํ๊ณ ์ถ์๋ค. ๋๋ฌธ์ ํด๋๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ด๋ฆ์ Json.xcassets ์ผ๋ก ์ ์ธํ๊ณ ๊ทธ ์์ ํ์ผ์ ๋ฃ์๋ค. ๊ทธ๋ฐ๋ฐ asset catalog์ ๋ชจ์์ด ๊ธฐ์กด์ ๊ฒ๊ณผ๋ ๋ฌ๋๋ค. ํ์ธํด๋ณด๋ asset catalog๋ฅผ ๋ง๋ค๋๋ ๋จ์ํ๊ฒ ํด๋๋ฅผ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ File → New → File์ ํ๊ณ ๋ค์ด๊ฐ Resource์ Asset Catalog๋ฅผ ์ ํํ์ฌ ๋ง๋ค์ด์ผ ํ๋ค. ๊ทธ ํ test code๋ฅผ ์์ฑํ์ฌ ๋๋ฆฌ๋๋ฐ ์ด๋ฒ์๋ NSDataAsset์ ๊ฐ์ ธ์ค๋ guard๋ฌธ์์ ๊ณ์ retrun์ผ๋ก ๋น ์ง๋ฉฐ ์ข ๋ฃ๋์๋ค. guard let json = NSDataAsset(n.. 2024. 1. 28. [UIKit]loadView์ view๋ ์ธ์ ํ ๋น๋ ๊น? ์๋ ํ์ญ๋๊น, ๋ฏผํธ์ ๋๋ค. ๐loadView์ View๋ ์ธ์ ํ ๋น๋ ๊น์?์ฝ๋๋ฒ ์ด์ค๋ก ์ง ์ฝ๋์์ ์คํํด ๋ณธ ๋ด์ฉ์ ๋๋ค. ์์์ผ๋ก๋, super.loadView()๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋ view๊ฐ nil์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋๋ฌธ์ LLDB๋ก view๋ฅผ loadView() ํจ์ ๋ด๋ถ์์ ์ฐ์ด๋ณด์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์์๊ณผ๋ ๋ค๋ฅธ ์ผ์ด ์์์ต๋๋ค. super.loadView()๊ฐ ๋ถ๋ฆฌ๊ธฐ ์ ์ po view๋ก ์ฐ์ด๋ณด๋, loadView์ loadView๋์ด ์ฐํ๋๋, ๊ฐ์ด ๋จ๋ ๊ฒ์ ๋๋ค! ์ฐธ๊ณ ๋ก ์์ UIViewController์ view๋ (id) 0x0์ผ๋ก ํ ๋น๋์ด ์์ง ์์์ต๋๋ค. ์ค๋ฅ์ธ๊ฐ? ์ view๊ฐ ์ฐํ์ง?๊ทธ๋์ loadView()๋ฅผ ์ฌ๋ฌ๋ฒ ์ฐ์ด๋ณด๊ณ ํ๋์ฉ ๋ด๋ ค๊ฐ๋ฉด์ po v.. 2024. 1. 27. [๋์์ธ ํจํด]Delegate Pattern delegate pattern์ ์ฃผ๋ก ํ๋ฉด์ ์ ํ์์ ์ฌ์ฉ๋๋ค. ํ๋ฉด์ ์ด๋ป๊ฒ ์ ํ๋ ๊น? 1๋ฒ ํ๋ฉด๊ณผ 2๋ฒ ํ๋ฉด์ด ์๋ค. ๋ค์ ๋งํด, 1๋ฒ view controller์ 2๋ฒ view controller๊ฐ ์๋ค. 1๋ฒ view controller์์ ๋ฒํผ์ ๋๋ฌ 2๋ฒ view controller๋ก ํ๋ฉด์ด ๋์ด๊ฐ ๋, 1๋ฒ ํ๋ฉด์ ๋จ์ํ ์ฌ๋ผ์ง๋ ๊ฒ์ด ์๋๋ค. 2๋ฒ ํ๋ฉด์ด 1๋ฒ ํ๋ฉด์ ์์ ์์ด๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๋ 2๋ฒ ํ๋ฉด์ด ์๊ธฐ๋ฉด์ 2๋ฒ view conroller๋ ์ด๊ธฐํ๋์ด ์์ฑ๋๋ ๊ฒ์ผ๋ก 1๋ฒ view controller๋ก๋ถํฐ ์ ๋ณด๋ค์ ๋ฐ์์ค๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ผ 2๋ฒ ํ๋ฉด์์ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ผ๋ก ๋ค์ 1๋ฒ ํ๋ฉด์ผ๋ก ๋์๊ฐ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น? 1๋ฒ ํ๋ฉด์ด ๋์ค๋ฉด์ ์๋กญ๊ฒ 1๋ฒ view contro.. 2024. 1. 27. [๋์์ธ ํจํด]Observer Pattern ์ท๊ฐ๊ฒ์์ ์ผํ ๋ ์์๋ ์ผ์ด๋ค. ์ฐ๋ฆฌ๋ ๋ฌด์์์ ์ผ๋ก ํ ์ธ ํ์ฌ๋ฅผ ์ด์๋๋ฐ ํ์ด๋ฐ์ ๋์น ์๋๋ค์ด ํ๊ฒฐ๊ฐ์ด ํฌ๋๊ฑฐ๋ฆฌ๊ณ ๋ ํ๋ค. ํ ์ธ ํ ๋ ๋ฌธ์ ์ข ์ฃผ๋ฉด ์ข๊ฒ ๋ค๊ณ . ๋งค๋ฒ ๋ฉฐ์น ์ ๊น์ง ํ ์ธ ํ๋ค๋ ๊ฑธ ์๊ณ ๋๋ฉด ์์ํ๋ค๊ณ . ์ต์ ๋ฒ ํจํด์ ์ด๋ฌํ ์๋๋ค์ ์ํ ๋ฌธ์ ๋ฐ์ก๊ณผ ๊ฐ๋ค. “๊ด์ฐฐ์”๋ผ๋ ๋จ์ด๋ฅผ ๋ณด๋ฉด ํด๋น ์ด๋ฆํ๋ฅผ ๋ฌ๊ณ ์๋ ๊ฐ์ฒด๋ ์ด๋ ํ ์ญํ ์ ์ํํ ๊ฒ ๊ฐ์๊ฐ? ๋๊ตฐ๊ฐ๋ฅผ ๋ฉด๋ฐํ ์ง์ผ๋ณด๋ ์ญํ ์ ์๋๊น? ์ต์ ๋ฒ ํจํด์์๋ ์ด ์ต์ ๋ฒ์ ์๋ฏธ๊ฐ ์กฐ๊ธ ๋ค๋ฅด๋ค. ๋จ์ํ ์ง์ผ๋ณธ๋ค, ๋ณด๋ค๋ `์ฐ๋ฝ์ ๊ธฐ๋ค๋ฆฐ๋ค`๋ผ๋ ๊ฒ์ด ๋ ์ณ์ ํํ์ผ ๊ฒ์ด๋ค. ๋ง์น ์ท๊ฐ๊ฒ ํ ์ธ ํ์ฌ ๋ฌธ์๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์๋๊ณผ ๊ฐ๋ค. ์ท๊ฐ๊ฒ๋ฅผ ์ฃผ์ํ๊ณ , ๊ด์ฐฐํ์ง๋ง ๊ฒฐ๊ตญ ์ท๊ฐ๊ฒ์์ ๋ฌธ์๋ฅผ ๋ณด๋ด์ฃผ์ด์ผ ์๋์ ํ๋์ ๊ฒฐ์ ํ ์ ์๋ค. ์ท๊ฐ๊ฒ๋ฅผ ๋ค๋ฆด์ง, .. 2024. 1. 27. [iOS] TableViewCell์์ layoutMarginsGuide ์ฌ์ฉ ํ ์ด๋ธ๋ทฐ์ Custom Cell์ ์ค์ ํ ๋ ์ฒ์์ ์ ์ฝ์กฐ๊ฑด์ ContentView์๋ง ๋ง์ท๋ค. private func configureCellConstraint() { NSLayoutConstraint.activate([ contentStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), contentStackView.topAnchor.constraint(equalTo: contentView.topAnchor), contentStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), contentStackView.bottomAnchor.constraint(e.. 2024. 1. 6. [iOS] CoreData์์ ํน์ Entity ๋ด๋ถ์ ์๋ Entity์ ํน์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋(NSPredicate) ์ฝ์ด๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐ์ตํ๋ค๊ฐ ์๊ธด ์ผ์ด๋ค. ๋จผ์ entity๋ก๋ UserMO์ JokeMO ๋๊ฐ๊ฐ ์๋ค. User์ Joke๋ Model๋ ์๋ค. ์ฌ๊ธฐ์ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด User๋ Joke ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ์๋ค. ๋๋ฌธ์ ํน์ ํ User์ ํน์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ฐ๋ Joke๋ง ์ ๋ณํ๊ณ ์ถ์ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์์๋ค. func fetchWithPredicate(currentUser: User, currentCategory: Category) -> [Joke] { var jokes = [Joke]() let fetchRequest: NSFetchRequest = UserMO.fetchRequest() let idPredicate = NSPredicate(format: "id = %@", currentUs.. 2023. 12. 20. ์ด์ 1 2 3 4 ๋ค์