본문 바로가기

분류 전체보기

(20)
@Published 변수를 재사용하는 문제와 해결 앱에서 발생했던 버그 중 하나가 어떤 게시물에 좋아요를 눌렀을 때 피드에 있는 모든 게시물이 다 함께 좋아요가 눌리는 현상이었습니다. 문제의 원인을 찾아보니 각각의 게시물마다 @Published 변수를 같이 사용하고 있는 것이 문제였습니다. 모든 게시물 뷰가 load(onAppear)될 때 매번 해당 게시물을 현재 사용자가 좋아요를 눌렀는지 서버로부터 받아오지만 그 값을 모두가 공유하는 Published 변수에 담다보니 결국 다른 게시물들과 좋아요 상태를 공유하는 버그가 발생했습니다. 문제 발생 class LikeStore: ObservableObject { // 좋아요를 저장하는 배열 @Published var likes: [Like] = [] // likes를 서버에서 받아서 likes에 넣어주는 기..
[Swift] 함수의 재사용성을 높이기 위한 Protocol 도입 및 모델 추상화 Market Model과 MyNote Model이 분리되면서 생겼던 문제와 해결들 기존에는 마켓에 올라가는 노트와 마이 노트를 같은 모델로 사용했지만 앱의 볼륨이 커지면서 각각의 컬렉션마다 필요한 필드들이 조금씩 더 추가되거나 달라지기 시작했습니다. 따라서 우리 앱은 마켓에 쓰이는 모델과 마이노트에 쓰이는 모델을 분리했고, 해당 과정에서 몇몇 메서드들의 재사용성이 좋지 않아지는 문제가 발생했습니다. 즉, 각각 모델에 맞는 함수를 따로따로 만들어줘야 하는 문제가 발생했습니다. 이를 해결하기 위해 마켓 모델과 마이 노트 모델이 공통으로 갖고 있는 속성들을 한 곳에 모아 NoteProtocol을 만들어주었고, 두 모델을 ‘추상화’ 시켰습니다. 결과적으로, 두 가지 모델 타입을 모두 받을 수 있는 메서드를 만들..
CoreData MultiThreading과 Delete Rule 코데 사용시 겪었던 문제 저희 앱은 MultiPlatform 환경의 사용자 또는 MultiDevice 사용자를 위한 Data Migration 작업이 필요했다. 예를 들어, 사용자가 A기기에서 B기기로 사용 기기를 바꾼다면 저희 앱은 서버에 백업용으로 저장해왔던 해당 유저의 암기장 데이터들을 사용해서 재로그인 시 동기화 작업을 수행했습니다. 이 과정에서 서버에 있는 많은 Note와 그에 포함되어 있는 Word들을 불러오고 거의 동시에 그 데이터들을 코데에 저장하는 과정에서 지속적으로 CoreData에 저장시키지 못하고 누락되는 버그들이 생겼습니다. 찾았던 문제점들 NoteEntity와 WordEntity의 Relationship 설정이 1 : N 관계였는데 이 데이터들을 삭제하는 규칙(Delete Rul..
내장 DB(CoreData)와 외부 DB(FireStore) 모두 프로젝트에 적용한 이유와 마주했던 문제점들 이번 프로젝트 '메모라이징'에서는 데이터를 저장하고 관리하기 위해 내장 DB(CoreData)와 외부 DB(FireStore)를 모두 사용하였습니다. 이는 다음과 같은 이유로 결정되었습니다. 내장 DB(CoreData) 사용 이유 오프라인 상태에서도 데이터를 사용할 수 있습니다. 앱 자체에서 데이터를 관리하므로, 서버와의 통신이 필요하지 않습니다. 데이터를 빠르게 로딩할 수 있습니다. 외부 DB(FireStore) 사용 이유 추후 다양한 플랫폼에서 데이터를 공유할 수 있습니다. 서버에서 데이터를 관리하므로, 다른 기기에서도 동일한 데이터를 사용할 수 있습니다. 무엇보다 Firebase라는 Cloud 플랫폼을 사용하면서 무분별하게 사용량을 늘렸던 경험이 있었고, 이는 실제로 낭비에 가까운 비용 발생의 주원..
SwiftUI Property Wrapper (@StateObject, @ObservedObject, @EnvironmentObject) 차이점 및 코드 예시 SwiftUI에서 property wrapper는 view의 상태를 관리하는 데 사용됩니다. SwiftUI에서 객체를 관리하는 데 사용되는 주요 property wrapper는 @StateObject, @ObservedObject 및 @EnvironmentObject입니다. @StateObject @StateObject는 뷰 전체에서 사용 될 새 객체를 생성하는 데 사용됩니다. 객체는 한 번만 생성되며 뷰의 전체 수명주기 동안 유지됩니다. 이것은 뷰의 다른 부분에서 사용할 새 객체를 만들고자 할 때 유용합니다. struct ContentView: View { @StateObject var viewModel = ViewModel() var body: some View { Text(viewModel.name..
ios 앱 심사 과정 경험 (리젝 사유와 대응) 메모라이징 앱의 첫 번째 심사에서 리젝을 받았다. 그 이유는 크게 3가지 였으며 다행히 엄청 큰 볼륨의 수정이 필요하지 않아서 빠르게 다시 수정할 수 있었다. 지금보면 예상 가능했던 리젝도 있었고, 덕분에 새롭게 알게된 사항들도 있다. 리젝 사유 3가지 ‘Apple ID로 시작하기’라는 워딩이 사용자들에게 ID만으로도 로그인이 가능하다는 오해를 불러일으킬 수 있기 때문에 (Guideline 4.0 - Design) 회원가입 후 한번더 사용자 이름 or ID를 묻는 것은 좋지 않다. 이미 apple로그인 시 해당 데이터들을 받아올 수 있기 때문에 (Guideline 4.0 - Design) 앱 내에서 포인트가 존재하기 때문에 ‘유저가 포인트를 획득할 수 있는 방식들에 대한 설명’을 요구 (Guideline..
MVVM 패턴이란? (ios) MVVM 패턴은 웹, 앱과 같은 유저 인터페이스를 통한 **이벤트 기반 프로그래밍**을 잘 할 수 있도록 고안된 아키텍처 패턴 중 하나입니다. 이 패턴은 기존의 MVC, MVP, VIPER, RIBs와 같은 아키텍처 패턴의 문제점과 한계를 해결하기 위해 탄생했습니다. MVC에서 파생된, Model과 View 간의 의존성뿐만 아니라 Controller와 View 간의 의존성도 고려하여 각 구성 요소가 독립적으로 작성되고 테스트될 수 있도록 설계된 아키텍처 패턴 1) 구조 Model : 어플리케이션에서 사용되는 데이터와 그 데이터를 처리하는 부분입니다. View : 사용자에서 보여지는 UI 부분입니다. View Model : View를 표현하기 위해 만든 View를 위한 Model입니다. View를 나타내 ..
[Swift] 코테를 위한 문자 타입(String, Character) 문법, 메서드 총정리🧙‍♀️ (지속 업로드 예정) - String.count : 문자열의 글자수를 리턴 let str = "안 녕 하 세 요" str.count // 9 띄어쓰기 포함 - Array(String) : 한 글자씩 배열의 요소로 변환하여 리턴 (주의: 각 요소의 타입은 Character로 바뀜) let str = "안녕하세요" Array(str) //["안", "녕", "하", "세", "요"] let strArray = Array(str) //["안", "녕", "하", "세", "요"] type(of: strArray) // Array.Type -String[num] : num번째 글자를 리턴 X (swift에서는 해당 방법 불가) -> Array(str)[num] let str = "안녕하세요" Array(str)[3]//"세" - S..