본문 바로가기

TIL

(11)
[TID] #10 - Tuist로 DemoApp 설정하기, Globs Pattern으로 SourceFile 관리하기 오랜만에 올리는 글이라 새로 알게 되어 올리고 싶은 내용이 많지만, 지금 당장 잘 써질 것 같은 주제는 Tuist를 이용한 DemoApp 설정인 것 같다. 얼마 전에 진행한 sync-swift에 좋은 발표들이 많았고, 요즘 관심이 있는 modular architecture에 대한 내용도 꽤 있었다. 그 중에서 KangHoon님의 발표 내용이 도움이 많이 되었고, DemoApp을 구현해보고 싶다는 생각이 들었다. https://github.com/OhKanghoon/sync-swift-2022 일단은 이전에 봐둔 소스코드가 있어서, Project를 extension하여 bool parameter를 통해 demoApp이 필요하면 target을 추가해주는 식으로 진행하려 했다. 아래 코드가 그 뼈대이다. pu..
[TID] #9 - Nibmle, Quick, RxTest, RxNimble로 UseCase 및 ViewModel 테스트 코드 작성 Testable한 코드, 책임의 분리, 아키텍쳐의 중요성.. 등등 이런 말은 많이 했지만 '구조'의 중요성에서 항상 언급되는 테스트 코드의 작성에는 소홀했던 것 같다. 따라서 Nimble, Quick 등 테스트를 도와주는 라이브러리 및 RxTest를 통해 UseCase와 ViewModel의 일부 기능에 대한 테스트 코드를 작성해 보았다. 1 .XCTest + RxTest 우선 가장 기본적인 XCTest를 이용해서 작성했다. RxBlocking보다는 이벤트를 직관적으로 나열해서 볼 수 있는 RxTest를 이용했다. Setup과 TearDown에서 새로운 인스턴스를 주입하고 제거해준다. import XCTest import RxSwift import RxTest @testable import BasicTes..
[TID] #8 - Tuist Project에 Firebase 의존성 추가하기 Tuist에 Firebase 의존성 추가 Tuist를 적용한 프로젝트에 FCM 세팅을 하느라 Firebase 의존성을 추가해야 했는데, 또 듣도보도 못한 에러를 만났다. 처음에는 undefined symbol _gulisloggablelevel 요런 에러가 15줄 이상 떴다... dynamic framework로 구성한 ThirdPartyLib에서 뭔가 문제가 발생하는 듯 했는데 여러가지 시도를 해보다가 Firebase 의존성 문제라는 것을 알았고, 여차저차 해서 메인 앱 프로젝트에 FirebaseMessaging을 의존성으로 추가해줬더니... 이번에는 아래와 같이 뜨면서 앱이 강제종료된다.... +[FBLPromise onQueue:do:]: unrecognized selector sent to cla..
[TID] #7 - Protocol Conforms to Hashable / DiffableDataSource의 Header Reload / Combine 사용한 Clean Architecture 감상 / Contributor가 되고 싶다! 1. 특정 Protocol 자체를 Hashable하게 만드는 방법 특정 Protocol을 채택하기만 해도 Hashable을 Conforming하게 할 수 있도록 시도를 해보았다.. 프로토콜 초기구현을 통해서 할 수 있을 줄 알았는데... 오개념으로 인해 잘못된 시도를 했는데.. 뭘 몰랐던 것인지 보자! DiffableDataSource의 요구사항 @available(iOS 13.0, tvOS 13.0, *) @preconcurrency @MainActor open class UICollectionViewDiffableDataSource : NSObject, UICollectionViewDataSource where SectionIdentifierType : Hashable, SectionIdentifie..
[TID] #6 - MVVM에서 Cell 내부 Control의 Binding / List API에 대한 생각 MVVM에서 Cell 내부 Control을 Binding하는 깔끔하고 합리적인 방법에 대해 고민중이다. 기존에는 ViewModelType이라는 Protocol을 채택하여 Input과 Output을 미리 정의하여 ViewModel과 ViewController의 관계를 확실히 정의하고자 했다. 이러한 방식에서는 cell 내부에 존재하는 Observable에 대한 Binding을 해주기 위한 몇 가지 장치가 필요하다. 물론 이러한 장치는 스스로 생각해본 것들이고, 무엇이 좋은 방법인지 아직 확신이 서지 않는다. 처음에는 Cell 내부의 Control에 대한 Binding에서부터 시작해서 테이블뷰와 컬렉션뷰 구조에 대한 재고...까지 오게 되었다. 1. ViewModelType 사용을 고수하며 Cell Bind..
[TID] #5 - UseCase와 Interface Provider / Repository Pattern 아키텍쳐에 대한 내용이 어느정도 익숙해지기 시작하면서 UseCase와 Repository에 대해 고민중이다. UseCase의 추상화, 그리고 구현체의 존재 위치는 어디가 좋을까? 그리고 UserCaseProvider를 사용하면 좋은 점이 무엇일까? UseCase를 정말 기능별로 세세하게 하나씩 나누는 것이 좋을까? 모바일 앱의 특수성을 고려하여 Scene 별로 가는 것이 좋을까? 딱 UseCase 하나에 대해서만 정리할 필요성이 느껴진다. Repository Pattern에서는 Repository를 제네릭화하여 하나의 클래스를 사용하는 방식도 있고 단순하게 의존성 역전을 통해 구현한 경우도 있었다. 고민해야 할 부분이 많다.. https://github.com/sergdort/CleanArchitectu..
[TID] #4 - Tuist, Bundle, 동적/정적 라이브러리 문제 상황 : Tuist에서 external dependencies를 사용하는데 문제가 생겼다. 기존에 spm에서 외부 의존성을 가져와서 사용하고 있었는데, Tuist가 아닌 일반 프로젝트에서라면 ImageSlideShow를 import해서 사용하는데에 문제가 없었겠지만 Tuist를 사용하면 번들을 가져올 수 없어서 문제가 생겼다. 해결책 : 이유는 Tuist는 ThirdParyLib이라는 서브모듈을 dynamic framework로 두고, 이 모듈이 다양한 external dependencies를 가지는 것으로 세팅했기 때문에 link만 가지고서는 Resource에 접근할 수 없었다. 그래서 고민 고민 하다가 스토리보드에 있는 UI 요소들을 코드베이스로 바꿔야하나까지 생각했는데... 지푸라기 잡는 심정..
[TID] #3 - 나는 오늘도 개발한다? 내가 오늘 개발한 것? 꽤 오래전에 TIL을 열심히 써보려다가... 깃헙 이슈에 기록하는 것이 더 좋은 것 같아서 그만뒀었는데...! 깃헙 이슈가 가독성이 좋고 주제별로 정리해놓기가 편해서 최근에는 그렇게 하고 있었고, 정리를 아예 제대로 하고 싶은 내용은 TIL보다는 블로그에 정제해서 올리고 싶었기에 TIL의 필요성을 느끼지 못하고 있었습니다. 그런데 갑자기 TIL에 왜 돌아왔냐...? 그리고 TID는 무엇이냐 하면! 요약하면 기록의 방식을 조금 바꿔보려 합니다! 이전에 #2까지지만 쓰면서 느꼈던 점은 정제된 지식을 올려야 하는 다른 카테고리의 글과는 달리 생각, 느낀점, 어려웠던 점, 더 공부하고 싶던 점을 마음 편하게 기록할 수 있었다는 점입니다! 덕분에 그 시기의 내가 어떤 것을 공부하고 어떤 지식이 부족했으며, 이후로..
[TIL] #2 - ALU 제작, 백준 2751번(정렬), 이산수학(function, counting, algebras) ALU 만들고 FPGA에 Implement하기 논리설계 과제로 ALU(Arithmetic and logical unit)을 Verilog code로 구현하고 FPGA 보드에 Implement해 보았다. ALU : Control(Operation) Input으로 AND, OR, XOR, ADD와 같은 논리연산의 종류를 정하고, 각 Input에 따른 결과값을 구하는 조합 논리 회로이다. FPGA : Field programmable gate array, 설계 가능한 논리 소자와 프로그래밍이 가능한 내부 회로가 포함된 반도체 소자 - 라고 정의되어 있다. 논리값에서 새로운 논리값을 얻는 것을 논리연산이라 하고, 논리연산의 기본이 되는 소자를 논리소자(logic element)라 한다. AND, OR소자 등이 ..
[TIL] #1 - 스택으로 Infix to Postfix 계산기 만들기(Java) 학교 자료구조 수업 과제로 스택 자료구조를 이용하여 Infix to Prefix 계산기를 만들어 보았다. 오늘 새벽부터 시작해서 먹고 쉬고 자고 하면서 집중한 시간만 치면 한 10시간? 정도 소요된 것 같다. 구현 과정 Infix에서 Postfix로 식을 만들어야 하는 이유는, 컴퓨터가 Operator의 우선순위를 구분하지 못하기 때문에 한 줄로 주어지는 식의 값을 내기 위해서는 Postfix 형태로 전환한 후 계산시켜야 하기 때문이다. 처음에는 왜 스택으로 이러한 기능을 구현하려고 할까 하는 의문이 들었는데, 스택의 peek(), push(), pop()은 순서대로 주어지는 연산자를 비교하여 우선순위를 정해주고, 우선순위에 따라 언제 스택에 쌓아둔 다음 순서대로 꺼내서 postfix에 위치시킬 수 있다..