전체 글 45

[iOS] MVVM 디자인 패턴에 대한 고찰

안녕하세요. 모리스입니다.😀많진 않지만 velog에서 티스토리로 이사를 드디어 완료했네요.핑계 아닌 핑계로 일하면서 블로그 쓰기 쉽지 않은 것 같아요..😂(매일 연재하시는 분들 존경해요👍)본론으로 들어가서... 이번 노트에서는현재 회사의 iOS 앱은 전통적인 Cocoa MVC 패턴으로 디자인 되어있는데이번에 이 MVC 디자인 패턴을 MVVM디자인 패턴으로 리팩토링을 진행하게 되었습니다.리팩토링을 진행하면서 했던 고민들과 새로 알게된 점들을 작성해 보려 합니다. 사실 iOS에서의 MVVM 패턴은 swiftUI가 나오면서 많은 개발자 분들이 사용하기 시작한 것 같아요.왜냐하면 swiftUI + MVVM(feat. RxSwift)는 Apple에서 권장하는 조합이기도하고거의 국룰처럼 자리잡은 듯 싶어요. ..

iOS 2025.09.02

[iOS] SnapKit 라이브러리 사용하기

안녕하세요. 모리스입니다.😀 이번 노트에서는 iOS의 AutoLayout을 쉽게 설정할 수 있도록 해주는 SnapKit 라이브러리에 대해서 기술해 보려 합니다.SnapKit?SnapKit은 iOS, OS X등의 앱 개발에서 AutoLayout을 코드로 구현할 때 사용하는 강력한 라이브러리에요. 기존의 복잡한 NSLayoutConstraint 코드를 더 읽기 쉽고 유지보수가 용이한 레이아웃 코드를 작성할 수 있게 해줘요. 자, 사실 우리에게 중요한건 SnapKit이 무엇이냐보단 어떻게 쓰느냐일 태니.. 본론으로 들어가 볼게요.설치 방법SnapKit 라이브러리 문서에서는 세 가지 설치 방법을 제공해요.CocoaPods터미널에서 프로젝트 디렉토리로 이동pod init 명령어로 Podfile 생성 (Podfi..

iOS 2025.08.26

[iOS] 오픈소스 라이센스 명시하기

안녕하세요. 모리스입니다.😀 이번 노트에서는 앱에서 사용하는 오픈소스 라이센스를 명시하는 방법에 대해서 기술하려 한다.앱에서 사용하는 오픈 라이브러리를 명시하는 방법에는 크게1) 앱 내에 설정 화면 등에 명시하는 방법과2) iOS 설정 > 앱 목록 > 해당 앱에 라이센스 정보를 명시할 수 있다.이 노트에서는 2번의 경우를 알아보려 한다.LicensePlist 라이브러리앱에서 사용중인 오픈소스 라이센스들의 정보를 자동으로 추출해주는 라이브러리이다. 해당 라이브러리는 Homebrew를 통해 서만 설치가 가능하다. (Homebrew가 설치되어 있지 않다면 다음을 참고.)터미널에 다음 명령어로 LicensePlist 라이브러리를 설치한다.brew install licenseplist licensePlist 설..

iOS 2025.08.26

[Swift] NotificationCenter

안녕하세요. 모리스입니다.😀 이번 노트에서는 데이터를 간단하게 주고 받을 수 있는 NotificationCenter에 대해서 알아보려고한다.먼저 Apple에서는 NotificationCenter에 대해 이렇게 설명하고 있다. 등록된 관찰자에게 정보를 방송할 수 있도록 하는 알림 발송 메커니즘....? 이게 무슨말이냐 역시 직독직해는...쉽게 말해서 유튜브 구독 알림 설정이라고 생각하면 쉽다.내가 좋아하는 유튜버의 새로운 영상을 놓치지 않기위해 알림 설정을 하는 우리(구독자)는 NotificationCenter에서는 관찰자 즉 Observer라고 한다. 그럼 새로운 영상을 업로드해서 우리에게 알림을 보내주는 동작을 NotificationCenter에서는 posting Notification이라고 한다...

swift 2025.08.26

[iOS] URL Scheme으로 지도 앱 연동하기 (TMap, kakaoMap, naver지도)

안녕하세요. 모리스입니다.😀 iOS 지도 앱 연동 (URL Scheme)이번 노트에서는 URL Scheme을 사용하여 한국에서 대표적으로 많이 쓰이는 지도 앱들을 연동하는 방법에 대해 기술하려한다.앱이 설치돼 있으면 앱을 실행 시켜 절정한 위치가 노출되도록 하며, 설치되어 있지 않다면 app store로 이동해 앱 설치를 유도한다.🛠 사전 설정URL Scheme을 사용하려면 Project file > TARGETS > Info 탭에서 Queried URL Schemes 항목을 추가해야 한다.설정하지 않으면 앱이 Scheme을 인식하지 못해 동작하지 않는다.🚗 티맵 연동func openTMap(latitude: Double, longitude: Double) { let urlString = "t..

iOS 2025.08.26

[iOS] Main Thread Checker: UI API called on a background thread: 오류

안녕하세요. 모리스입니다.😀 이번 노트에서는 UI 업데이트 시 한 오류에 관해 작성해보려한다.Main Thread Checker: UI API called on a background thread: 위 오류는 UI를 Main Thread가 아닌 다른 Thread로 접근하려 할때 노출되는 에러 메시지이다.앱의 퍼포먼스를 위해 UI 업데이트 관련 작업은 Main Thread에서 작업을 수행하도록 해야한다.DispatchQueue.main.async {} 구문을 통해 해당 UI작업이 Main Thread에서 구동되도록 해야 다음 에러가 해결된다. 기존 velog에 글을 옮겨오다보니.. 티스토리에서는 구어체로 쓰고 싶었지만 기존엔 문어체로 써놔서..글이뒤죽박죽입니다..!(양해부탁드립니다..😂)

iOS 2025.08.26

[Firebase] - dSYM 파일 누락 업로드하기

안녕하세요. 모리스입니다.😀 firebase에서 메일이 하나 왔다. dSYM 누락 - com.xxxx.1.0.5(xx)dSYM 파일이 누락되었으니 업로드 해야한다고..이번 노트에서는 dSYM파일 업로드에 대해서 기술하려 한다.dSYM?업로드 방법에 앞서 dSYM이 뭔지와 왜 필요한지에 대해 알아보자. firebase의 crashlytics에서는 앱에서 비정상 종료에 대한 통계를 보여준다. 앱이 비정상 종료 즉, crash가 나면 숫자로 가득한 crash report를 주는데, 이 그래쉬 리포트를 해석할 수 있게 해주는 파일이 바로 dSYM 파일이다. firebase는 이 파일이 없어 크래쉬 리포트를 해석할 수 없으니 당연히 에러를 내는것이다.dSYM(debug symbol file)dSYM은 컴파일러가..

Firebase 2025.08.26

[iOS] WKWebView로 JavaScript의 이벤트 받기

안녕하세요. 모리스입니다.😀 회사에서 webView의 특정 버튼을 누르면 앱 UI의 변화를 줘야하는 기능을 구현해야 했다.그중 생각한 것이 webView의 특정 버튼을 눌렀을 때, 이벤트를 받아와 처리해주면 되겠다는 생각을 했다.그래서 프론트개발자에게 버튼을 누르면 이벤트를 앱으로 보내주는 방법을 설명해 해당 함수를 작성해 달라고 요청했고, 나는 front에서 보낸 메시지를 받는 방법을 구현했다.이번 노트에서는 WKWebView가 javascript의 함수를 호출해 메시지를 받아오는 방법에 대해 작성해 보려한다.웹에서 앱으로 보내는 방법 또한 기술하면 좋겠지만.. 아직 front기술에 무지한 터라 앱에서 이벤트를 받는 방법에 대해서만 기술하려한다. 추후 스택이 더 쌓이면 추가 포스트 해보겠다.impor..

iOS 2025.08.26

[swift] abs와 magnitude 차이점

안녕하세요. 모리스입니다.😀 swift에서 절댓값을 구하는 방법으로는 보통 abs를 사용한다. 그렇지만 절댓값 변환 방법에는 abs말고도 magnitude라는 방법이 존재한다. 그렇다면 이 둘의 차이는 무엇일까?let number: Int = -5 위와 같이 음수로 되어진 -5로 정의된 음수가 있다고 보자.let convertWithAbs = abs(number) // Int 5let convertWithMagnitude = number.magnitude // UInt 5 두 값 모두 -5의 절댓값인 5가 출력된다.여기서 abs와 magnitude의 차이점은 자료형에 있다. Int형으로 선언된 값을 abs를 통해 절댓값으로 변환하면 Int 자료형으로 값을 반환한다.반면 magnitude의 경우에는 UI..

swift 2025.08.26

[iOS] SQLite 사용하기

안녕하세요. 모리스입니다.😀기존 velog에 글을 옮겨오다보니.. 티스토리에서는 구어체로 쓰고 싶었지만 기존엔 문어체로 써놔서..글이뒤죽박죽입니다..!(양해부탁드립니다..😂)그럼 시작하겠습니다.... 이번 노트에서는 앱 내에서 database를 사용해 보려한다. 여러 방법이 있지만 sqlite를 사용하여 데이터 CRUD하는 방법을 알아보려 한다.importimport SQLite3sqlite3는 기본 내장 되어있어 import만 해주면 된다.createvar database: OpaquePointer?let tableName: String = "dbTable"func createTable() { let fileURL = try! FileManager.default.url( for: ..

iOS 2025.08.26