올해도 어김없이 12월 31일날 한해를 되돌아 보자~~ 작년에 회고를 작성하면서 개발자로 취업에 성공하고 아주 기쁜 마음으로 글을 썼던 기억이 난다 24년도에는 포기하지 않고 끝까지 해보고, 꾸준하게 기록으로 남겨두기, 취업하기 이렇게 목표였는데 다 이뤄서 좋다고도 써놨네 ㅎㅎ올해를 돌아보자면 먼저 25년도 내가 목표했던 내용을 다시 확인해보니 코딩테스트 준비부족한 CS 기술 다지기더 좋은 가치로 평가받기지금처럼 꾸준하게 기록하기 이렇게 목표를 세웠었다. 여기서 내가 이룬건 3번!! 그리고 2번은 아직 부족하고.. 4번은 반쯤..? 코딩테스트는 아직 준비하지 않았다.가장 중요하게 생각했던 목표는 더 좋은 가치로 평가받는 3번이었기 때문에 이점에 초점을 맞춰 올 한해를 잘 보낸 것 같다. 먼저 연초에 지식..
오늘은 오랜만에 돌아오게 됐는데 이미지 처리 방식이 새로 입사한 회사에서 내가 기존에 사용했던 kingfisher를 사용하는게 아닌 Nuke를 사용하고 있어 이부분에 대한 개념을 정리하고 나아가 이미지 캐싱 처리 방식에 대해 살짝 개념을 잡아가기 위해 작성하게 됐다. 앱 최적화를 시키면서 이 이미지 최적화는 항상 따라오는 문제인 것 같다. 왜냐하면 모바일 환경에서 이미지를 매번 네트워크에서 받아오는 방식이다보면 엄청나게 많은 비용이 발생하고 앱 성능이 떨어질 수 있기 때문이다. 계속해서 같은 이미지를 다운로드하면 배터리 및 데이터 부분에서 많은 소모가 일어나고 CPU 과부하로 인해 앱 성능이 많이 떨어질 수 있게 된다. 이런 문제를 어느정도 해결하기 위해 대부분의 이미지 처리는 메모리 및 디스크 캐싱으로..
이번에 회사에 새로 입사하게 되어 온보딩 과정을 거치면서 matchedGeometryEffect라는 개념에 대해서 마주하게 되었다. SwiftUI에서 특정 항목에 대한 값 변동으로 인해 diffing을 거쳐 뷰가 변경되는 과정에 대해서는 이해하고 있었고, 애니메이션을 적용했을때 어떤 방식으로 이뤄지는지에 대해 이해는 했지만 조금 더 부드럽게 애니메이션을 구현하고 싶은 순간들이 있었는데 이부분에서 해법을 찾을 수 있는 matchedGeometryEffect를 알게 되었따! 예를 들어 탭을 선택한다고 했을떄 하나의 하단 막대바가 자연스럽게 좌우로 끊김없이 진행되고 싶을때 기존처럼 그냥 SwiftUI를 통해 조건문을 넣어 랜더링을 하게되면 상태값에 따라 뷰가 다시 그려지기 때문에 자연스럽게 이어지는게 아니라 ..
Swift Concurrency가 해결하고자 한 문제는 어떻게 보면 되게 간단하다 동시에 여러 스레드가 같은 데이터를 건드려도 안전하게 동작해야한다! 라는 점, 즉 Thread-Safety 문제를 해결하기 위함이다. 기존의 GCD를 활용했을때 문제점은DispatchQueue.global().async { myData.value += 1}이 코드가 여러 스레드에서 동시에 실행되면 하나의 value에 여러 스레드가 동시에 접근하고, 그 결과로 데이터 경합 (Race Condition)이 발생하게 된다. 이런 문제를 막기위해서는 락(NSLock)을 사용하던지, 세마포어, 시리얼큐 등 직접 안정성을 관리했어야 했던점이 불필요한 작업들도 많이 들고 비효율적이었다. 이러한 개념을 좀 해결하기 위해서 Swift C..
먼저 프로퍼티 래퍼가 나오게 된 이유에 대해서 설명해보면 프로퍼티 래퍼는 SwiftUI로 넘어오면서 자주 사용하게 되는 개념인데 말 그대로 프로퍼티를 감싸주는 요소라고 생각하면 된다. 프로퍼티 래퍼우리가 상태 추적을 위해 사용하던 State, Binding 등 프로퍼티 래퍼를 사용해 왔다 이 프로퍼티 래퍼는 왜 사용하게 됐을까먼저 프로퍼티 래퍼 안쪽을 살펴보면 프로퍼티의 반복적인 계산 속성을 하나의 프로퍼티 래퍼로 만들어 중복 로직을 작성하지 않고 사용할 수 있게 해주는 개념이다!struct User { private var _name: String = "" var name: String { get { _name.capitalized } set { _name = new..
옛날에 UIKit을 바탕으로 구현했던 터틀보카를 SwiftUI TCA를 활용해 마이그레이션을 진행했다. 진행허면서 TCA를 활용해 구현했을 때 가장 활용하고 싶었던 TestStroe를 활용한 테스트 코드 구현에 대해 알아보려고 한다. 먼저 이전에 스터디를 진행하면서 테스트 코드의 중요성? 에 대해 얘기 했을때 했던 얘기가 기억에 남는 것 같다 단순히 테스트 목적 보다 단독적으로 의존성을 분리하고 명확한 책임을 가지는 캡슐화 된 코드 구현을 지향할 수 있다는 말이 제일 와닿았던 것 같다. 먼저 TCA가 자랑하는 테스트 친화적인 구조는 입력이 같아 항상 같은 출력을 보장하도록 리듀서를 구성하여 테스트 코드 구현이 가능하다.TCA는 TestStore를 통해 테스트 진행이 가능한데 이를 통해 완전한 경리를 통해..