👨💻 프로그래밍/🍎 iOS 개발 15 사이드 프로젝트 장애 회고 사이드 프로젝트 장애 회고 발단...틈틈이 주말마다 제가 출시한 앱들을 업데이트하고 있는데요. 어느 때와 다름없이 주말에 업데이트를 하고 편하게 쉬고 있었습니다. 그런데 다음날 이런 메일이 왔습니다.그리고 앱에 들어가서 확인해 보니 정말로 그랬습니다! 🥲 💀프로그래밍적 원인원인은 의외로 간단했습니다. 제가 새로 추가한 기능이 이미 추가된 구독을 UI에 표시해 주는 기능이었는데요.그런데 추가됨을 판단하는 로직이 생각보다 복잡해서 (미리 이 기능을 고려해서 데이터에 추가하지 않았기 때문에) 이걸 Main Thread에서 돌리니 앱의 반응성이 너무 느려진다는 것이었습니다. 속도를 개선하기 위해서 여러 가지를 시도해 봤습니다.Lazy 하게 하기도 하고UserDefaults에 저장해서 Cache를 쓰기도 하고계산 결과를 UI 진입 전에.. 2024. 12. 30. 🍎 SwiftUI에서 Local Notification URL 처리하기 🍎 SwiftUI에서 Local Notification URL 처리하기 뭐 하려는 거야?APN을 통해 서버로 알림을 보내는 게 아닌, Local에서 UNNotificationCenter를 써서 알림을 보낼 수 있습니다. 이 경우 알림을 등록하는 시점에 이 알림이 언제 가야 하는지를 미리 알아야 하는 단점이 있긴 하지만 라마인더나 타이머 같은 앱들은 알림을 보내고자 하는 시점에 언제 알림을 보낼지 다 알 수 있기 때문에 Local Notification을 사용합니다. 1번째 사진와 같이 알림이 와서 클릭하면 기본적인 동작은 2번째 사진처럼 앱의 메인 화면에 가는 겁니다. 하지만 3번째 사진처럼 원하는 특정 화면에 가고 싶다면 어떻게 해야 할까요?전체적인 그림일단 이 기능은 SwiftUI에서 자체적으로 지원하지 않습니다. 그래서 UIKit을 끌고 와야 하는데요.이를 위해 UN.. 2024. 12. 7. 🍎 Tipkit을 사용해서 앱의 숨겨진 기능을 유저에게 넛지 주기 🍎 Tipkit을 사용해서 앱의 숨겨진 기능을 유저에게 넛지 주기 TipKit이 뭐고 꼭 필요할까?iOS 17부터 사용 가능한 앱을 쓰면서 새로운 기능, 숨겨진 기능, 꿀팁들을 슬쩍 알려주는 UI를 띄워주는 Framework입니다.아래와 같이 리스트를 꾹 눌러서 순서를 조정할 수 있는 건 보통 알기 힘든 경우가 많기 때문에 슬쩍 알려주는 형식입니다.물론 이걸 직접 구현할 수도 있습니다. Tooltip 정도는 간단한 UI이니 공수도 그렇게 많이 들지 않겠죠? 하지만 Tipkit에서는 저 Tip 언제 어떤 조건으로 보여줘야 하는지, 너무 많은 팁이 노출되면 유저가 피로하니 너무 많이 노출되지 않게 조절하는 등의 편리한 추가 기능이 있어서 굳이 안 쓸 이유는 없습니다.너무 과하게 쓰면 안 됨! 😵애플의 Human Interface Guideline을 보면 Tipkit의 역.. 2024. 9. 23. 🍎 Stanford iOS 강의 (CS193P) 수강 후기 🍎 Stanford iOS 강의 (CS193P) 수강 후기 이게 뭐야?말 그대로 미국의 1류 대학인 스텐포드 대학에서 제공하는 강의입니다. 스텐포드 대학은 실리콘 벨리 근처에 있는데, 그래서 그런지 컴퓨터 과학 학과가 특히 유명합니다. 오죽하면 애플에서는 신입이 스텐포드 출신이 아니면 이력서에서 거른다는 소문이 있을 정도입니다. (사실은 아니겠지만...) 스텐포드 뿐만 아니라 많은 미국 대학이 강의를 공짜로 공개해 놓는데, 코로나 시국을 거치면서 특히 더 활발해 졌습니다. 하지만 인터넷에 공개된 모든 대학 강의가 수강할 가치가 있지는 않습니다. 꼭 내용만을 말하는건 아닌데요. 저는 아래 조건중에 1개라도 해당되면 듣지 않습니다.오디오, 카메라 품질이 좋지 않음강의 자료가 많이 제공되지 않음제 경험상 일류 대학들의 강의는 어렵기 때문에 많은 시간을 들여 수강해야 .. 2024. 9. 14. 🍎 Swift의 mutating 알아보기 (feat. Cannot assign to property: 'self' is immutable) 🍎 Swift의 mutating 알아보기 (feat. Cannot assign to property: 'self' is immutable) Swift에서 structSwift에는 class와 struct으로 객체를 표현합니다. struct은 SwiftUI의 기본이 되기도 하고, 현대 프로그래밍의 개념들에 영향을 많이 받은 단위입니다. 현대 프로그래밍의 개념들이라 하면 흔히 아래와 같은 특징들을 말합니다.최대한 변하지 않게 한다유용한 문법 설탕을 많이 제공한다명시적이다 struct도 비슷하게 value type이라 주고받을 때 새로운 값을 만들고,Computed Property로 개념상으로는 property인데 내부적인 계산을 해야 하는 값을 property처럼 다룰 수 있게 하고,내부 property를 변화시키는 건 명시적으로 mutating을 붙이도록 돼 있습니다. 여기서 3번째 mutating에 대해 자세히 알아 보겠습니다!struct은.. 2024. 9. 1. 🍎 Swift Testing: 보기 싫은 XCTest는 이제 안녕!! 🍎 Swift Testing: 보기 싫은 XCTest는 이제 안녕!! Swift Testing이 뭐야?애플이 Object-C를 대체할 Swift를 발표한 이후로 Swift 언어의 기능을 적극 활용하는 새로운 API들을 출시하고 있습니다. SwiftUI나 SwiftData는 기존의 UIKit이나 CoreData에 비하면 쓰기가 매우 편하고 깔끔해서 확실하게 생산성이 올라갔습니다.Swift Testing도 비슷하게 XCTest를 대체하기 위한 Swift에 최적화된 API입니다.하지만 솔직히 SwiftUI나 Swift Data 정도로 다르지는 않고 그냥 더 깔끔하고 빠르다 정도이긴 하지만, 그래도 XCTest 보다는 나으니 사용했습니다. Swift Testing | Apple Developer DocumentationCreate and run tests for your Swif.. 2024. 8. 15. 🍎 Swift Package에서 Localization 처리하기 🍎 Swift Package에서 Localization 처리하기 뭘 하려는 걸까?🐜 Package란?여러 개의 iOS 프로젝트를 하다 보면 공통으로 쓰게 되는 코드들이 많아지게 됩니다.예를 들어 저의 경우는 숫자를 입력할 때 실시간으로 ,를 넣어주는 TextField가 필요해서 만든 적이 있는데, 이건 사실 도메인에 상관없이 공통적으로 필요한 기능입니다. 그래서 SwiftUI 자체적으로 있으면 좋겠지만... 아쉽게도 직접 만들어서 써야 합니다. 🍎 SwiftUI에서 숫자 입력하면 실시간으로 구분자(,) 붙이기하려는 것숫자가 길어지면 읽기가 힘듭니다.1000000000와 1,000,000,000가 있다면 전자는 일십백천만... 하면서 1개씩 세야 겠지만 숫자를 자주 다루신 분들이면 후자가 10억이라는걸 바로 알 수 있습니jinkpark.tistory.com물론 직.. 2024. 8. 10. 🍎 나만의 Swift Package 만들기! - 개인 프로젝트에서 중복되는 코드 없애기 🍎 나만의 Swift Package 만들기! - 개인 프로젝트에서 중복되는 코드 없애기 Swift Package가 뭐고 이게 왜 우리 프로젝트에 필요할까코딩을 하다보면 중복되는 코드가 나옵니다. 이럴 경우 일반적으로 함수나 클래스로 나눠서 관심사를 분리하고 중복을 줄입니다. 하지만 문제는 중복되는 코드가 프로젝트 단위로 나올 때 발생합니다. 분명 중복되는 코드인데, 다른 프로젝트니 import 할 수 없고, 결국 복붙을 하게 됩니다. 이 경우 문제가 여러가지 있습니다.당연히 중복되는 코드의 문제가 해결되지 않는다.변경점이 있으면 프로젝트 별로 적용해 줘야 한다.같은 역할을 하는데 미묘하게 변수나 사용법이 다른 경우가 있어 헷갈린다.사실 프로젝트나 1개~2개 정도면 괜찮지만 10개, 20개, 심지어 100개가 된다면? 상상하기도 싫습니다. 제 현재 상황은 앱스토어에 출시 해 판매중인 앱이 2.. 2024. 8. 8. 🍎 Swift UI에서 홈 화면 Context Menu 추가하기 🍎 Swift UI에서 홈 화면 Context Menu 추가하기 하려는 것iOS에서는 앱 아이콘을 길게 누르면 앱 내에서 자주 쓰는 동작들을 바로 실행할 수 있는 기능이 있습니다. 아래 사진은 토스의 Context Menu인데요, 토스에서 가장 자주 쓰는 기능인 소비, 송금, 주식, 만보기 등이 있습니다. 당연하지만 위의 Context Menu는 단축키 일 뿐이라 Context Menu의 존재를 전혀 몰라도 앱을 문제 없이 사용할 수 있습니다. 실제로 애플의 Human Interface Guideline에서도 Context Menu를 앱을 자주 사용하는 헤비 유저들이 편하게 사용하는 기능이 될 수는 있어도 똑같은 동작을 앱에서도 제공할 것을 권고하고 있습니다. 😅 Although a context menu provides convenient access to fre.. 2024. 8. 5. 🍎 iOS에서 서버를 거치지 않고 알림 보내기 (UserNotifications) 🍎 iOS에서 서버를 거치지 않고 알림 보내기 (UserNotifications) 뭘 하려는 건지?한 마디로 아래와 같이 앱에서 알림을 보내려 하는 겁니다. 보통 이러한 알림을 보내기 위해서는 APN이라는 서버를 따로 둬서 보내야 하는데요. (참고) 서버쪽에서 로직을 돌려야 하거나 인터넷의 특정 정보를 조건으로 알림을 보내야 한다면 여전히 그렇게 해야 합니다. 예를 들어 특정 책이 나올 때 알림을 보낸다고 하면 인터넷의 특정 정보를 주기적으로 확인해서 그 조건이 만족되면 알림을 보내야 하니 이 경우는 APN을 써야 합니다.하지만 그렇지 않고 간단하게 반복되는 알림이라면 APN을 거치지 않고 비교적 간단하게 처리할 수 있습니다. 매일 특정 시간에 보낸다던가, 유저가 등록한 날짜마다 반복해서 보낸다던가...UserNotification API핵심은 UserNotification이라는 A.. 2024. 8. 2. 🍎 XCTest로 Swift에서 Unit Test 하기 🍎 XCTest로 Swift에서 Unit Test 하기 단위 테스트 (Unit Test)가 뭐임?코딩에서 개발 그 자체만큼 중요한게 테스트입니다. 버그를 1개도 만들지 않으면서 코딩할 수 있는 개발자는 없기 때문에 테스트를 하지 않으면 버그가 많은 질 낮은 소프트웨어를 만들어내는 뱃 개발자 입니다. 💦보통은 가장 기초적인 테스트는 내가 작성한 소프트웨어를 실행해 보면서 요구사항이 맞는지 확인하는 겁니다. 하지만 이 방법에는 치명적인 단점이 있습니다. 노가다라는 겁니다...요구사항이 엄청 많아지면? 100개가 된다면 수정할 때 마다 이 100개의 요구사항이 모두 맞는지 확인해야 합니다.위의 이유로 테스트를 자주할 수 없습니다.재현이 어려운 경우는 테스트 하기가 힘듭니다.여기서 단위 테스트가 나옵니다. 단위 테스트는 소프트웨어를 테스트할 수 있는 가장 작은 단.. 2024. 7. 28. 🍎 SwiftUI에서 숫자 입력하면 실시간으로 구분자(,) 붙이기 🍎 SwiftUI에서 숫자 입력하면 실시간으로 구분자(,) 붙이기 하려는 것숫자가 길어지면 읽기가 힘듭니다.1000000000와 1,000,000,000가 있다면 전자는 일십백천만... 하면서 1개씩 세야 겠지만 숫자를 자주 다루신 분들이면 후자가 10억이라는걸 바로 알 수 있습니다.,를 붙여서 보여주는건 간단합니다. 문제는 유저가 숫자를 입력할 때 입니다. 입력할 때는 어떻게 ,를 넣을 수 있을까요?문제를 나눠서 생각해 보자우선, 유저가 입력하는 값은 모두 숫자일지 모르겠지만 보여야 되는 값은 숫자 뿐만 아니라 ,를 포함하기 때문에 문자입니다.가장 단순한 해결책은 유저가 보는 값을 저장하는 변수와 유저가 입력하는 값을 저장하는 변수를 따로 두고, 각자 업데이트를 하면 됩니다. 유저가 입력하면 입력값 저장하는 변수 업데이트 -> 필요하면 , 삽입 후 유저가 보는 값 .. 2024. 7. 21. 🍎 WidgetKit 이용해서 애플 위젯 개발하기 🍎 WidgetKit 이용해서 애플 위젯 개발하기 WidgetKit이 뭐야iOS, iPadOS, MacOS 등에 제공할 Widget을 개발할 수 있는라이브러리 Extension?WidgetKit은 사실 원래 앱에 Library 처럼 단순히 추가되는 추가 기능이 아닙니다. Extension이라는 형태로 추가되는데, 같은 앱이지만 앱과 상호작용할 수 있는 곳을 추가로 제공해 주는 개념이라고 생각하시면 됩니다. Widget 외에도 Siri나 Appclip 같이 앱을 실행하고 상호작용하는 형태 외의 여러 형태의 extension을 사용할 수 있습니다. 문제는 Extension은 애플의 정책상 Sandbox화 돼 있어 다른 앱 처럼 취급 돼 원래 앱의 여러 Class나 데이터를 접근할 수 없다는 겁니다. 이건 뒤에서 자세히 알아보겠습니다. 위젯은 앱이 아니다애플.. 2024. 6. 22. 🍎 Swift Data를 써서 iCloud 연동 기능 만들기 🍎 Swift Data를 써서 iCloud 연동 기능 만들기 Swift Data 간단 소개Apple의 ORM (Object Relational Mapping) ORM이란 Application 내부 객체와 DB 상의 객체를 연결시켜 주는 기술입니다. 어떤 언어나 어떤 DB를 써도 쉽게 찾아볼 수 있는 기술이지만, Apple의 레전드라면 이게 이번년도 (2023년)에 나왔다는 것입니다...즉, Swift Data를 쓴 프로젝트를 구동하려면 iOS 15 이상이 필요하고, 자연스럽게 개인 토이 프로젝트 아니면 현실적으로 쓸 수 없습니다. 하지만 저는 토이 프로젝트를 하니 과감하게 iOS 15 미만은 고객에서 포기하고 써 봤습니다.Swift Data를 쓰기 위해서는 3가지 단계를 거치면 됩니다.Model을 정의ModelContainer를 주입context나 Property.. 2023. 12. 24. 🍎 취미 iOS 앱 개발 후기 🍎 취미 iOS 앱 개발 후기 최근 너무 웹 개발만 한거 같아 Refresh 겸, 또 평소 iOS 앱을 만들고 싶었기에 취미로 iOS 앱을 만들어 보기로 했습니다. 간단히 공부해 보니 iOS는 Objective-C + UIKit 에서 Swift + SwiftUI로 넘어가고 있는 상태였습니다. 취업을 위해서라면 다 공부해야 하겠지만, 취미로 하는거니 당연히 Swift + SwiftUI 조합을 사용했고, iOS 버전도 가장 최신인 iOS 15를 기준으로 하고, 나머지 솔루션도 애플에서 기본 제공하거나 가장 편한 걸 사용했습니다. (Persistence에 CoreData + CloudKit, CI/CD에 XCode Cloud 등) Apple 제품을 쓰면서 느꼈던 장단점이 개발에서도 나타난다 개발이 아니라 Apple 제품의 장단점이 뭘까요?.. 2023. 8. 3. 이전 1 다음