이번에는 이전에 Tuist를 활용해 모듈화를 구성했다면 추후 모듈화를 자동화하여 편리하게 사용할 수 있는 환경 세팅을 해주기 위해 Scaffold로 자동화를 해주고 그 이후 외부 Dependency를 추가해보려고 한다. 먼저 Scaffold를 적용시켜보자! Tuist를 통해 모듈화하는 이전 세팅이 완료된 상황에서 진행해 보려고 한다.우선 Manifests/Tuist/Templates/Feature 디렉토리까지 만들어 둔 다음 Feature 내부에 Sources 그룹과 Feature.swift 파일을 만든다!mkdir -p Tuist/Templates/Feature/Sources터미널을 활용해 만들어주면 한번에 완성이 된다.그 다음 Feature.swift 파일 내 템플릿 파일을 구성해 주어야 한다.imp..
이전에는 Swift Package를 활용해 모듈화를 구현해 봤다면, 오늘은 Tuist를 활용해 모듈화 아키텍처 구조를 설계해보려고 한다.먼저 Tuist에 대해서 아주 간략하게 개념을 잡고 가자면, 협업을 하면서 프로젝트 파일이 충돌되는 일이 잦아 conflict가 나는 일이 있다. 그 문제를 해결하는데 혼이 쏙 빠진 적이 있는데 이 프로젝트의 복잡한 설정과 관리를 코드로 처리할 수 있도록 도와주는 도구라고 이해하면 된다! Swift 언어로 프로젝트를 관리하게 되니 여러 측면에서 생산성이 증가하고 이 외에도 모듈화 하는 과정에서 그 구조를 체계적이고 시각화할 수 있다는 점 등등 협업 하는 과정에서 아주 이점이 많은 툴이다. 이제 Tuist로 프로젝트를 시작해보자. 일단 Tuist가 설치되어있다는 것을 가정..
앞서 1주차 스터디에서 앱의 상태를 나타내는 State와 이를 변경하는 Action, 이 Action의 기능을 구현하고 상태를 변경하는 Reducer를 알아봤다. 이번에는 Effect에 대해서 알아볼 예정인데. Action이 반환하는 타입이자, Action을 거친 모든 결과물을 칭한다. 그 중 외부에서 어떤 처리가 일어나 예상하지 못한 결과물을 얻는 Side Effect에 대해서 까지 알아볼 예정이다. 이에 더해 이러한 비동기 작업이나 외부 작용에서 발생하는 Side Effect를 우리 앱의 로직에 통합하는 역할인 Store까지 알아보자! Effect의 구현과 활용Action에 따른 결과가 바로 EffectEffect는 Reducer의 액션이 반환하는 타입으로 액션을 거친 모든 결과물이라고 말할 수 있다..
스터디를 진행하면서 토론을 했던 주제가 TCA에서 얘기하는 단방향 데이터 흐름에 대한 이해를 도울 수 있는 토론이었던 것 같아 끝나고 개인적으로 다시 정리해서 글을 남기려고 한다. 매주 하나씩 이런 형태의 글을 꼭 써야지!! 오늘은 그 첫번째로 단방향 데이터 흐름이 왜 좋은건데? 라는 주제로 토론한 내용을 토대로 정리한 내용이다.단방향 데이터 흐름이란 말 그대로 데이터가 하나의 방향으로만 흐른다는 의미이다.TCA에서 데이터 흐름을 보면 다음과 같다사용자입력(Action) -> Reducer -> State -> View이 흐름은 언제나 한 방향으로만 일어나고 반대로 거슬러 올라가는 흐름이 없기 때문에 단방향이라고 말한다. 그렇다면 단방향 데이터 흐름이 왜 좋을까? 이걸 따져보기 위해 먼저 양방향 데이터..
챗봇을 개발하면서 예외, 오류 처리 등 이용자 경험에 필수적으로 포함되어야 하는 부분에 대해 구현하기 위해 일단 발생할 수 있는 상황을 정리해 에러 핸들링을 나열하고 이 핸들링을 통해 특정 상황에 맞는 Toast 메세지를 날려주는 로직을 구현하려고 한다! 먼저 최대한 기능별 모듈화를 통해 프로젝트를 쪼개 구현하고 있기 때문에 에러 핸들러 패키지를 만들어서 사용하는 방식을 사용해보자!이 글에서는 대표적인 사례로 인터넷 연결이 끊겼을때 상황을 가정해 로직 구현을 해보려고 한다.public enum NetworkError: Error { case networkError(code: Int, underlying: Error?) case noInternetConnection case yesInter..
최근 챗봇을 구현하는 과정에서 단일 프로젝트 내 클린아키텍처만 적용해 구현 하는데, 진행을 하다보니 구현 기능들이 추가되었고 점점 크기가 커져 나가는 것을 느꼈다. (다른 큰 프로젝트 비해서는 아주 작은 편이지만..) 모듈화에 관련한 스터디를 진행하게 되면서 이참에 기능 단위로 로직을 모듈화해 다른 프로젝트에서도 재사용성을 높히는 방법을 한번 적용해보려고 한다. 모듈화 방향성?모듈화를 진행하면서 느끼는 건 어떤 방식으로 모듈화를 진행하는지에 대한 정답은 딱 정해져 있지 않은 것 같다. 그때 그 프로젝트, 개발 환경 등 각 요소에 맞춰 어떤 방향으로 모듈화를 진행할지, 유지 보수, 재사용성에 맞춰 진행을 방식도 있고, 협업 시 기능 구현을 나눠 충돌없이 개발이 진행 가능한 환경을 조성하던지.. 등등 아래의..
Mash-Up 동아리 활동이 슬슬 시작되면서 프로젝트 팀 구성은 아직 되지 않았지만 스터디가 개설되었다. 나는 두가지의 스터디에 참여하게 되었는데 Tuist를 활용한 모듈화 스터디와 TCA 이렇게 두가지를 선택했다. 다른 동료들은 어떻게 모듈화를 해 나가는지, TCA를 공부할때 혼자 공부하니 잘 되지 않았던 것을 이번 기회에 둘 다 얻어가고싶어 신청하게 되었다. 먼저 오늘은 본격적인 모듈화 스터디가 시작되기 전에 어떤 방식으로 모듈화가 이뤄지는지, 모듈화 아키텍처가 왜 필요한지, 강점은 무엇인지 등 아주 기초적인 개념 정리를 하기 위해 블로그를 작성하게 되었다. 그럼 이제 하나하나 기초부터 알아보자 모듈화 아키텍처란?모듈화 아키텍처는 애플리케이션의 기능과 책임을 여러 독립된 모듈로 분리하여 개발하는 설계..
오늘은 현재 챗봇 기능을 구현하고 있는 과정에서 실제 현업에서는 이렇게 진행되진 않지만 다이렉트로 GPT API 와 연동해 챗봇 기능을 구현하는 방식에 대해 작성하려고 한다. 일단 기능만 구현해둔 뒤 추후 서버와 연결하여 값을 받는 형태로 진행하기 때문에 클린아키텍처 구조를 활용해 별도의 네트워크 연결 라우터를 두고 해당 라우터를 Moya를 활용해 보다 간편하고 유지보수 및 추후 수정사항이 용이하도록 구조를 짜 구현하게 되었다. 먼저 Moya란 무엇인가!!Moya는 Swift에서 네트워크 요청을 간편하게 관리하기 위해 사용되는 라이브러리이다! Alamofire를 내부적으로 사용하여 HTTP 요청을 수행하지만, TargetType 프로토콜을 통해 API의 각 엔드포인트를 구조적으로 관리할 수 있게 해주는 ..
SwiftUI를 사용하면서 한번씩 네비게이션 플로우 구현이 UIKit에서 사용했을때보다 다소 불편하고 적용이 어렵다고 느껴지는 경우가 있었다. 이 글을 정리하면서 어떤 방식으로 SwiftUI에서 네비게이션을 적용하면 좋을지 한번 알아보도록 하자 기존 Navigation 방식이전 방식에서 SwiftUI는 NavigationView, NavigationLink를 사용해 네비게이션을 통한 뷰 이동을 구현했다. 하지만 이 방식에는 몇가지 문제가 있다고 느껴졌는데 먼저 NavigationView 내부에 내장된 네비게이션 상태는 암묵적인 상태로 관리되었기 때문에 프로그램적으로 뒤로가기 , 특정화면으로 이동 등 과 같은 제어가 다소 어려운 측면이 있었다. 예를 들어 동적 컨텐츠를 다루거나 딥링크로 특정 화면으로 이동..
2025.02.28 - [◽️ Programming/iOS] - Static Dispatch & Dynamic Dispatch (1/2) Static Dispatch & Dynamic Dispatch (1/2)오늘은 Static Dispatch & Dynamic Dispatch의 대해 개념적으로 이해를 하고 넘어가보자 이번 면접을 통해 해당 개념을 질문 받았는데 명칭이 생소하다고 느껴서인지 어느정도 개념은 알고 있었지만 제대dongdida.tistory.com 그럼 오늘은 스태틱 디스페치와 다이나믹 디스페치의 두번째 알아보는 시간!! 이전에 내용을 참고하고 추가적으로 해야할 내용이 있는 것 같아서 또 쓰게 됐다 이 내용을 쓰기전에 먼저 Overloading과 Overriding의 차이에 대해서 제대로 명..