네트워크 통신을 통해 이미지를 받아와야 하는 경우지금까지는 Kingfisher라는 라이브러리를 사용해 해당 이미지를 처리했었다. 그러던 와중에 외부 라이브러리를 쓰지 않고, 이미지를 로드하고 캐싱하는 기능을 구현하고 싶었다. 이번 글에서는 이미지 캐싱에 대해 알아보고, MemoryCash와 DiskCashe를 실제로 구현해보도록 하겠다.이미지 캐싱이란?먼저 캐시라는 개념에 대해 알아보도록 하자.캐시는 컴퓨터 과학 에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다.캐시에 데이터를 미리 복사해 놓으면 계산이나 접근 시간없이 더 빠른 속도로 데이터에 접근할 수 있다.즉, 캐싱이란 데이터를 미리 캐시라는 별도에 장소에 복사해놓고, 이후에 접근할 때 더 빠른속도로 접근할 수 있게 하는 것을 말한다. 예를..
Combine을 살펴보면 RxSwift에서 용어만 바뀐 느낌이 든다.예를 들어RxSwift에서의 Observable은 Combine에서 Publisher이고,Observer는 SubscriberDisposable은 AnyCancellable...이런 식으로 말이다. 물론 더 깊이 들어가면,RxSwift는 class기반이고, Combine은 protocol 기반,Combine에서는 에러 대응을 항상 해줘야 함.. 등차이점은 더 있을 수 있겠으나, 대부분 RxSwift와 1:1로 대응해서 생각하면 이해하기는 어렵지 않았다. 그런데, 그 중 궁금증이 생긴 부분이 있었다.RxSwift에서의 `.disposed(by: disposeBag)` 부분에 해당하는 코드가 Combine에서는 `.store(in: &can..
Swift의 의존성 주입과 관련해서 DI와 DIP라는 용어를 듣게 될 것이다.처음에는 DI나 DIP나 그냥 의존성 주입을 하는 애구나.. 정도로만 알고있었다.그런데, 좀 더 자세히 알아보니 이 둘은 (당연히) 서로 다른 개념이며, 의존성 주입을 해야하는 이유에 대해서도 생각해보게 되었다. 이번 글에서는 DI와 DIP에 대해 알아보도록 하겠다. DI (Dependency Injection)DI는 Dependency Injection의 약어로, 의존성 주입을 뜻한다.먼저 DI가 필요한 상황과, 그 방법에 대해 알아보자. A클래스가 B클래스에 의존하는 상황이라면, B클래스에서 변화가 일어날 때 A클래스에까지 영향을 미치는 상황이 있다./*Guest 클래스는 A_Restaurant 에, A_Restaurant는..
이전에 프로젝트를 진행하면서 '네트워크 응답값을 담는 struct 정도로 DTO라는 용어를 사용한 적이 있었다.그러나, 공부를 하다보니 이는 DTO에 대한 이해가 없이 사용했던, 잘못된 표현이었다. 이번 글에서는 DTO 그리고 Entity에 대해서 간단히 알아보도록 하겠다.DTO란?DTO는 Data Transfer Objcet의 약자로, 우리말로 '데이터 전송 객체'라는 뜻을 가지고 있다.그렇다면 데이터 전송 객체는 무엇인가?찾아보니 조금씩 다른 말로 설명하고 있지만,쉽게 말해 네트워크 통신에서 클라이언트와 서버간 데이터 전달을 위한 객체라고 생각하면 될것같다. 다음과 같은 식당 정보가 담긴 JSON 응답값이 온다고 가정해보자.{ "documents": [ // ... { "address_name..
Realm에서 특정 데이터를 삭제할때 지금까지는 전체 데이터를 fetch해와서 필터링하는 방법을 사용해왔다.한마디로 비효율적이고 귀찮은 방법을 사용했던 것이다. 그런데 찾아보니 PK를 통해 삭제하는 더 쉽고 간편한 방법이 있어서 소개하려고 한다.데이터를 필터링해서 id를 비교 - 이전에 사용하던 방식앱에서 즐겨찾기 버튼의 동작을 구현하고 있었다.즐겨찾기 버튼을 탭할때, 현재 즐겨찾기가 되어있지 않다면 즐겨찾기에 추가하고,현재 즐겨찾기가 되어있다면 즐겨찾기에서 해제하는 로직을 구현해야했다. realm에서 데이터를 삭제하는 등의 동작을 Repository 패턴을 사용해서 다음과 같이 정의해주었다.func deleteItem(data: StarItem) { do { try realm.writ..
프로젝트를 진행하던 도중 다음의 화면을 구현해야 했다. 처음에 든 생각은 Compositional Layout으로 두 개의 섹션으로 구성하면 될 것 같았다.그런데 현재 RxSwift로 구성해놓은 상태여서 다중 섹션을 쓰려면 RxDataSource를 사용했어야 했다.또한 두 개의 섹션에 들어가는 셀과 모델이 서로 다르기도 했다. 이번 글에서는 멀티섹션 멀티모델로 RxDataSource와 Compositional Layout을 구현하는 방법에 대해 알아보겠다.ViewModel에서 RxDataSource를 위한 Section과 Data 세팅먼저 ViewModel에서 두 개의 섹션을 구성하고, 그 안에 들어갈 모델들을 설정해주었다. 첫 번째 섹션에는 `MockTrendingCoinItem`이라는 모델이, 두 ..