Unit Test 할 때 @testable의 역할이 뭘까?
·
Swift
반갑습니다 집주인들 기술팀장 박효준입니다~이번에 테스트 코드를 작성하면서 testable이 무엇인가!에 대해 궁금해져서 정리해보았습니다!레츠 기릿~~문제 상황MHDomain이라는 모듈 안에 MHDomain 동적 라이브러리와 MHDomainTests 정적 라이브러리가 있고,MHPresentation 모듈 안에 MHPresentation 동적 라이브러리와 MHPresentationTests 정적 라이브러리가 있다.테스트를 진행할 때 import MHDomain 을 해주어야 하는데,이 때 import 앞에 @testable 키워드를 사용할 수 있다.무슨 역할을 하는 지 알아보자문제 해결@testable 키워드테스트 대상 모듈의 접근 수준에 영향을 주는지 여부이다.테스트 접근성 증가:Swift의 기본 접근 수준..
DIContainer 사용 시 Actor Isolation 문제 해결하기
·
iOS
안녕하세요~! 집주인들의 미래 박효준입니다!이번에는 저희가 Swift6환경에서 DIContainer를 Singleton으로 사용하려고 했는데...!actor와 isolation문제가 발생해서 해결과정을 적었습니다! 그럼 슈웃~문제 상황UIKit을 사용하면서 actor를 기반으로 한 DIContainer를 구현하던 중, 아래와 같은 에러를 마주했다.Call to actor-isolated instance method 'register(_:object:)' in a synchronous main actor-isolated context왜 이런 지 알아보도록 하자문제 해결시도한 방법들actor로 DIContainer를 구현하고, register와 resolve 메서드를 사용하려 했더니 위와 같은 에러가 발생했..
DIContainer 도입 논의 과정
·
Architecture, Design Pattern
안녕하세요 집주인들입니다.DIContainer를 어떻게 도입해야할지에 대해 정말 많은 고민을 했습니다..아래는 저희의 고민과정입니다! 바로 보러가시죵문제 상황현재 상황에서 DIContainer를 도입하는 것이 적절한지에 대해 논의가 필요했다.의존성 주입을 누가 해줄 것인지, 모듈화되어 있는 구조에서 어떻게 의존성을 주입할 것인지 결정이 필요함문제 해결DIContainer 도입 계기클린 아키텍처가 적용을 함에 따라 아래와 같이 뷰컨트롤러 하나를 띄우더라도 viewModel부터 useCase, Repository를 다 만들어주고 최종적으로 viewModel을 뷰컨트롤러에 넣어주면서 띄워준다.let issueRepository = IssuesRepository()let fetchIssuesUseCase = F..
MVVM 아키텍처 도입, 우리의 ViewModel 사용법
·
Architecture, Design Pattern
안녕하세요!! 집주인들 중 가장 잘생긴 박효준입니다!이번에는 MVVM의 도입여부 논의를 하면서 결정한 ViewModel등의 사용법을 공유하고자 합니다.거두절미하고 바로 들어가겠습니다~~문제 상황MVC 패턴의 코드 길어짐과 수많은 의존성을 컨트롤러가 갖는 문제,또한 View와 비즈니스 로직 분리 등을 위해 MVVM 도입했다.우리 팀에서 MVVM의 ViewModel을 어떻게 사용하기로 정의했는지 설명하겠다.문제 해결MVVM 도입 결정MVC에선 Controller가 View와 Model 일을, MVP에선 Presenter와 View가 서로 일 주고받음 MVVM에서 ViewModel은 Model하고만 소통함 즉, 관심사 분리를 잘 해낼 수 있음위 특징 때문에 테스트 가능한 구조가 되어 테스팅도 가능MVC 패턴의..
드래그 앤 드랍 시 카테고리가 변경되어도 일관성 유지하기
·
iOS
반갑습니당 집주인 Kyxxn 박효준입니다 !지난 편에 이어서 이번에는 드래그 앤 드랍 시 카테고리가 변경되어도 일관성을 유지해보려는데요, 문제 상황부터 자세히 봐보시죠 〰️  문제 상황지난 편에서 CollectionView Drag Drop 델리게이트를 통해서 드래그 앤 드랍을 구현했었다.근데 우리는 책 커버를 한 번에 모아볼 수 있는 “전체”도 있고, 특정 카테고리에 대한 책 커버만 보여줄 수도 있다.이것에 대한 일관성 처리를 어떻게 할 지 알아보자.문제 해결시나리오가족, 친구 두 카테고리와 책들이 다음과 같이 있다고 가정해보겠다. 이 상황에서 “가족” 카테고리에서 책1을 책3으로 옮겼다고 하자.나는 그러면 “전체”에서 볼 때도 책1은 책3 뒤에 있어야 한다고 생각한다.위처럼 말이다. 또한, 반대로 “..
NotificationCenter의 removeObserver를 해야할까?
·
UIKit
음... 또 글을 쓰는 임정현씨...노티센터 오랜만에 쓰는 친군데요...removeObserver 어떻게 해야할까요?아라봅시다...문제 상황NotificationCenter에서 addObserver를 한 ViewController를 removeObserver를 해주어야하는지에 대한 논의가 있었다.문제 해결잠깐 생각해봤을 때 이것은 맞는 말이다!왜냐하면 코드상으로 addObserver를 할 때 self를 명시적으로 사용하기 때문이다.이러한 코드는 보통 메모리 낭비를 초래한다.NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillHide), name: UIRespo..
로컬 DB 결정 논의 (CoreData ~ FileManager)
·
iOS
안녕하세요! 집주인들입니다...로컬저장을 어떤 방식으로 활용할까에 대한 논의를 진행했습니다!구조화된 데이터 - 비구조화된 데이터 (주로 대용량)을 어떻게 나누어 정리할까 고민했습니다~문제 상황우리 앱은 처음에 서버가 없고, 로컬 DB를 사용한다.멀티미디어를 어떻게 어떤 DB로 관리할 지에 대한 논의를 작성했다.모델을 만들고나서, 이 모델들에 대한 데이터들을 어떻게 저장해야할지에 대해 논의가 필요했다.영상, 사진, 음성 등 용량이 큰 데이터들을 저장해야 함텍스트도 저장해야 함우리가 고민한 기술들은 아래와 같다.UserDefaults vs CoreData vs SwiftData vs FileManager(Realm도 고려를 했으나, 요구사항에 맞추어 서드파티 없이 해결하기로 하였다.)문제 해결우리의 상황에 ..
무지성 MainActor를 붙인 상황에서 데이터가 로드되기 전에 뷰가 그려지는 문제 해결
·
UIKit
안녕하세요! 집주인의 얼굴천재 박효준입니다!MainActor를 여기저기 쓰다가 보니 문제가 발생한 부분을 공유드리고자합니다!가봅시다~~ ᕦ(ò_óˇ)ᕤ문제 상황input.sink { [weak self] event in switch event { case .viewDidLoad: do { self?.fetchMemorialHouse() try self?.fetchCategory() self?.output.send(.fetchedMemorialHouseAndCategory) } catch { self?.output.send(.fetchedFailure("데이터 로드 중 에러가 발생했습니다.")..
뷰 그리는 방식에 대한 논의(Factory vs MH커스텀 vs VC에서 설정)
·
UIKit
뷰를 그리는 컨벤션에 대해 심도있는? 논의를 하였다.다들 생각하는 것이 달라도 한번 맞출 필요가 있다고 판단하였다.아래는 날것.... 의 내용이다...문제 상황아래 3개 중에 뭘 선택할지UILabel을 생성하는 팩토리생성자로 모든 걸 받는 MHLabelUIFont만 커스텀 하고, UILabel을 써서 ViewController에서 설정문제 해결UILabel+ Factory생성만 한다면, 서브클래싱을 안하고 Factory로 생성 가능UILabel이라는 것을 알려서 UIKit관련 동작 외에 없음을 알릴 수 있음생성에 대해서 확장성, 유지보수성을 꾀할 수 있음UILabel관련 버그만 발생해서 디버깅 용이기능적인 측면에서의 확장성이 적음UI테스트에서 용이한가?MHLabelViewController에서 생성자 ..
CollectionViewCell들 간의 Drag & Drop 구현하기
·
UIKit
반갑습니다 집주인 Kyxxn 박효준입니당이번에는 CollectionView에서 Cell들 간의 Drag & Drop을 구현해볼 건데요,델리게이트들을 어떻게 사용했고 어떤 특성이 있는지 알아봅시당 문제 상황컬렉션 뷰의 셀들을 드래그 앤 드랍해야 할 일이 생겨서이에 대한 공부를 하고 정리해보려 한다 !문제 해결주요 메소드우리는 아래의 두 델리게이트 프로토콜을 사용할 것이고,델리게이트에서 총 3개의 메소드를 사용하여 드래그 앤 드랍을 구현할 거다.UICollectionViewDragDelegateUICollectionViewDropDelegate시작: collectionView(_:itemsForBeginning:at:)먼저 Drag 델리게이트의 메소드이다.처음 드래그가 시작될 때 호출되는 메소드로 말 그대로..