캐플 리팩토링 세 번째 이야기 - 트러블 슈팅
·
iOS
애플 디벨로퍼 아카데미에서 진행한 프로젝트, 캐플 Qapple 리팩토링 작업의 세 번째 이야기입니다.캐플은 애플 디벨로퍼 아카데미 @POSTECH 3기, TEAM QAPPLE에서 시작한 프로젝트로아카데미 러너들과 익명으로 소통할 수 있는 커뮤니티 서비스입니다! 🍎 AppStore 다운로드하기 방향성 설정, 프로젝트 세팅까지 모두 마쳤습니다. 이제는 실제 리팩토링을 진행하며 마주쳤던 다양한 트러블 슈팅을 정리해봅니다. (역시나 대개 TCA 관련 트러블 슈팅이었습니다 ㅎㅎㅎ,,,,,) 1. Navigation & TabBar 로직 구현하기TCA에서 네비게이션 로직을 구현하는 것은 튜토리얼에서 어느정도 설명이 되었기에 크게 어렵지 않을 것(?)이라 생각했습니다. 하지만 늘 그렇듯 캐플 앱의 네비게이션 + 탭..
ScrollView 리프레쉬 했을 때 화면이 멈추는 현상 해결하기
·
iOS
🤨 문제 정의캐플 프로젝트 진행 중 다른 ScrollView는 문제가 없었지만 게시판 화면의 ScrollView에서 리프레쉬를 하니 로딩이 멈춰버리는 현상이 발생해 버렸습니다,,! 딱히 로직이 다른 것도 없고 로딩 화면도 같은 컴포넌트를 사용하고 있는데 어떤 부분이 문제일까요,, 🪓 삽질 기록1. GeometryReader 문제?GeometryReader를 사용해 View를 그릴 때 렌더링 문제를 마주했었던 경험이 있었기 때문에 이 부분을 제거해봤지만 결과는 똑같았습니다.(GeometryReader도 언젠가 제대로 이해하는 날이 오기를!)GeometryReader { proxy in // 평소에 얘가 문제가 많던데,,? ZStack { BulletinBoardContentView(s..
Array / Set / Dictionary Swift의 컬렉션 알아보기
·
iOS
Array, Set, Dictionary의 차이점을 분명 알고 있긴 하지만, 누군가에게 설명하라고 했을 때 버벅거리게 되는 것 같습니다. 이는 개념을 더 명확히 인지해야 한다는 뜻이기도 하기에, 아주 간단히 컬렉션 타입을 살펴보고 한 문장으로 정리해 보겠습니다. Array 배열An ordered, random-access collection.순서가 있고 무작위로 접근 가능한 컬렉션0부터 자동으로 순서가 지정되는데 이를 인덱스라고 합니다.순서가 있기 때문에 Array의 데이터는 중복이 가능합니다.* 순서가 중요하거나 인덱스로 접근해야 할 때! Set 집합An unordered collection of unique elements.순서가 없는 고유한 요소들의 컬렉션중복이 불가능합니다.Hashable 프로토콜..
캐플 리팩토링 두 번째 이야기 - 프로젝트 세팅하기
·
iOS
애플 디벨로퍼 아카데미에서 진행한 프로젝트, 캐플 Qapple 리팩토링 작업의 두 번째 이야기입니다.캐플은 애플 디벨로퍼 아카데미 @POSTECH 3기, TEAM QAPPLE에서 시작한 프로젝트로아카데미 러너들과 익명으로 소통할 수 있는 커뮤니티 서비스입니다! 🍎 AppStore 다운로드하기 첫 번째 이야기에서는 리팩토링의 방향성을 설정했습니다. 어떤 의도로 리팩토링하는지, 어떤 합의를 볼 것인지, 그 합의의 방법인 아키텍처는 어떻게 사용할지에 대해서 말이죠! 이제는 구체적으로 적용해나가기 위해 초기 세팅이 필요했습니다. TCA 기본 세팅합의에서 가장 크고 중요한 부분은 단연코 TCA였습니다. 기존 MVVM 아키텍처로 처리하던 방식과 크게 달랐기 때문에 논의 없이 프로젝트를 진행한다면 큰 혼란을 초래할..
구조체로 싱글톤 만들기?
·
iOS
iOS 공부를 시작한 지 얼마 안 된 시절, 개인 프로젝트를 진행하며 싱글톤이 동작하지 않는 문제를 경험한 적 있습니다. 그때의 기억을 떠올려 비슷하게 코드를 작성해 보면 아래와 같았습니다.struct Singleton { static var shared = Singleton() private init() {} var name = "민톨"}let singleton = Singleton.sharedprint("내 이름은 " + singleton.name)Singleton.shared.name = "한톨"print("내 이름은 " + singleton.name) 싱글톤 패턴을 이용할 때 우리는 '하나의 객체'를 떠올립니다. 타입 프로퍼티로 생성된 shared 객체를 전역적으로 접근 +..
캐플 리팩토링 첫 번째 이야기 - 방향성 설정하기
·
iOS
애플 디벨로퍼 아카데미에서 진행한 프로젝트, 캐플 Qapple의 리팩토링 작업이 시작됐습니다.캐플은 애플 디벨로퍼 아카데미 @POSTECH 3기, TEAM QAPPLE에서 시작한 프로젝트로아카데미 러너들과 익명으로 소통할 수 있는 커뮤니티 서비스입니다! 🍎 AppStore 다운로드하기 1년 가까이 진행하면서 쌓여온 코드는 문제점이 많았습니다. 하지만 신규 기능 추가(게시판, 댓글 등...)에 항상 뒷전이 되어 미루다시피 한 기술 부채는 이제는 너무나 늘어나버렸죠,,! 3기가 마무리되고 4기의 시작을 앞둔 지금이 절호의 기회라고 판단해 시즌2에 새롭게 합류한 멤버(시몬스, 무니)들과 함께 진행 중인 리팩토링 여정을 기록해보려 합니다.  무엇이 문제였을까?리팩토링 하자!라고 이야기가 나왔다는 것은 분명 어..
비동기 작업의 단위, Task 알아보기
·
iOS
Swift Concurrency를 사용해 비동기 코드를 작성하려면 Task를 이용해야합니다. Task { await 나는야비동기함수()} 일단 여기에 넣으라고 하니까 넣어서 쓰던 반성의 시간들,,,(맨날 봐야지 봐야지 하고 프로젝트에 쫓겨 미루던 나,,,🥲) 그래도 기본 동작 정도는 알고 있어야하겠죠? 간단하게나마 Task의 동작 방식을 살펴보겠습니다. Task의 정의애플 공식문서에 기술된 Task에 대해 살펴보겠습니다.  그렇습니다. Task는 비동기 작업의 단위라고 합니다. 추측하자면 우리가 지금까지 관성적으로 사용하던 다음과 같은 코드는 모두 하나의 비동기 작업으로 볼 수 있다는 뜻이기도 합니다.  Task { // 3개 함수 모두 하나의 비동기 단위임! await 나는야비동기함수..
MVC와 Cocoa MVC, 뭐가 다를까?
·
iOS
0. 서문디자인 패턴을 공부할 때 가장 먼저 들었던 키워드가 MVC였습니다. Model-View-Controller로 책임을 나눠 구현하는 방법으로, 가장 널리 사용되는 패턴이기도 합니다. 많이 듣기도 했고 많이 적용도 해봐서였을까요(자만 했었던 것 같습니다), 면접 질문에서 잘 대답했다고 생각했었는데 집으로 돌아오는 길에 확인해보니 잘못된 부분이 분명 있었습니다. 다시 한번 초심으로 돌아간다 생각하고 MVC를 정리해보려 합니다. 1. 전통적인 MVC우선 전통적인 MVC가 무엇인지 알아야 합니다. 모든 디자인 패턴이 그렇듯이 각 부분은 저마다의 '관심사'가 존재합니다. 이로써 서로의 명확한 관심사를 분리하고, 더 나은 업무의 분리와 향상된 관리를 제공하는 것이 디자인 패턴의 주 목적입니다. 전통적인 MV..