분류 전체보기 67

Github Actions를 통한 다국어 자동화 (2) | Submodule 최신화, Slack Webhook

다국어가 지원되는 프로젝트를 개발하는 것에 있어서 개발자의 노동이 최소화되고 휴먼에러를 축소시킬 수 있도록 하기 위해 어떻게 다국어 리소스 관리를 자동화해야 할 것인가에 대해 알아보고 있다. 앞선 내용까지는 1편 을 참고! Git Submodule과 Github Actions를 통한 다국어 자동화 (1)  이제 localization에 대한 작업을 마친 PR을 자동으로 base branch에 머지하고 & 업데이트된 서브모듈 레포지토리에 대해 메인 레포지토리에 최신화 시켜주는 과정(서브모듈이 최신 커밋을 바라보도록)까지 하면 개발자가 손 델 일 없는 완전한 자동화 완성! 개발자는 UI에 넣을 텍스트에 대해 다국어 key값 혹은 swiftGen을 통해 변환된 static 프로퍼티 이름만 알고 있으면 끝! 추..

iOS 2025.02.24

GitHub Actions를 통한 다국어 자동화 (1) | Git Submodule, Lokalise

최근 스레드를 통해 정말 많은 자극을 받고 있는 딜라이트룸 iOS 개발자 리디님. 다양한 개발 스토리를 들으면서 나도 나중에 내실 있는 나만의 앱을 만들고 싶다는 꿈이 점점 커지고 있다. 이 글에서는 리디님이 연사로서 SwiftRise 컨퍼런스에서도 소개해주셨고 내 프로젝트에도 적용해 볼 만한 것이어서 공부해 보면서 구현했던 부분을 공유해보려 한다. 사실 컨퍼런스에서는 도입한 도구나 구체적 구현 방법을 자세히 설명해 주셨다기보다 왜 이런 자동화 시스템을 구축했었어야 했는지에 대해 사고의 변화와 점진적인 디벨롭 과정에 대해 충분히 납득할 수 있게 설명해 주셔서 더 기억에 남았던 듯싶다! 결과적으로 우리는 iOS 개발자이기 이전에 product developer이기에 이런 자동화 도구나 AI를 잘 활용해서 ..

iOS 2025.02.18

ETag 기반 이미지 캐싱 & instruments로 로딩 속도 분석 |OSLog, os_signpost

메모리 캐싱에 대한 내용을 작성하고 거의 반년만에 쓰는 이미지 캐싱에 대한 내용입니다.. :) 틀린 내용이 있을 수도 있으니 언제든 피드백 주세요! [Swift] iOS의 메모리 캐시 NSCache | NSMutableDictionary객체와의 차이점, NSCopying, 깊은복사/얕은복사 캐싱에 대한 내용을 늦게 다시 쓰는 만큼 디스크 캐싱 & Etag기반으로 서버와 리소스 동기화 체크 & instruments로 로딩 속도 분석에 내용까지 함께 작성해보려 한다. 이번을 계기로 OSLog의 os_signpost를 사용해서 instruments를 통해 성능을 테스트해 보았고 실제 이미지 로드 속도가 얼마나 나아질 수 있는지에 대한 실질적인 지표를 보아서 의미 있었다.그리고 앞으로는 이렇게 정량적 지표를 근..

iOS 2025.01.13

[SwiftUI] 성능 최적화의 여정(1) - 뷰의 렌더링 최적화

성능 최적화에 대한 관심이 지대한 요즘.. 이것저것 테스트 해보다가 WWDC까지 찍먹하고 글을 썼지만 이론적으로만 공부하는 게 아니고 실제 프로젝트에 적용해보고 싶어서 힘이 닿는 대로 프로젝트 성능에 대한 최적화를 하는 글을 써볼까 한다.. 포부는 원대하지만 막상 글을 제대로&꾸준히 쓸 수 있을지 걱정되는 현실 😅 일단 그 첫 번째 여정으로 프로젝트를 진행하면서 가장 많이 개선의 필요성을 느꼈던 지점인 '불필요한 뷰 렌더링'을 최적화 하는 글을 작성해볼까 한다.    커스텀뷰를 만드는 방법은 다양하다. some VIew를 리턴하는 함수/연산 프로퍼티로 만들 수도 있고, 구조체로 만들수도 있다. 그럼 이렇게 만든 커스텀 뷰를 여러 개 띄울 때, 예를 들어 ForEach로 여러 개 요소를 반복적으로 나열했..

SwiftUI 2024.12.12

[SwiftUI] 뷰의 성능 개선(3) -Identifier의 중요성 | WWDC23. Demystify SwiftUI performance

> 뷰의 성능 개선 시리즈[SwiftUI] 뷰의 성능 개선(1) - Dependency 관리[SwiftUI] 뷰의 성능 개선(2) - 뷰의 slow update 개선[SwiftUI] 뷰의 성능 개선(3) -Identifier의 중요성  뷰의 성능에 대해 말하는 WWDC23 Demystify SwiftUI performance 세션에서 다루는 내용 중 마지막은 List와 Table의 Identifier에 관련한 내용에 대한 이야기이다. 특히나 List의 요소로 들어가는 것들이 어떻게 ID를 가지게 되고 어떤 식으로 동작하는지와 이 때문에 어떤 식으로 List와 ForEach를 사용하면 좋은지에 대한 언급을 한다. 아무래도 List의 경우에는 사용되는 화면이 많고 대량의 데이터를 로드할 경우가 있다 보니 자..

SwiftUI 2024.12.06

[SwiftUI] 뷰의 성능 개선(2) - 뷰의 slow update 개선 | WWDC23. Demystify SwiftUI performance

> 뷰의 성능 개선 시리즈[SwiftUI] 뷰의 성능 개선(1) - Dependency 관리[SwiftUI] 뷰의 성능 개선(2) - 뷰의 slow update 개선[SwiftUI] 뷰의 성능 개선(3) -Identifier의 중요성  이번 글은 뷰 성능 개선 (1), (3) 보다는 간단한 글이 될 것 같다. 근데 실제 프로젝트에 대한 성능을 개선할 때 고려해야 할 점을 언급한 부분이 있어서 작성해 본다.   첫 번째 성능 개선 글에서는 dependency와 뷰의 업데이트 "횟수"에 초점을 맞췄다면, 이 글에서는 뷰가 업데이트 될 때 사용되는 비용을 줄여 "속도"를 개선하는 것에 초점이 있다.  📍 반응성 저하(reduced responsiveness)뷰가 느리게 업데이트 되는 것이 어떤 문제가 있길래..

SwiftUI 2024.11.30

[SwiftUI] 뷰의 성능 개선(1) - Dependency 관리 | WWDC23. Demystify SwiftUI performance

> 뷰의 성능 개선 시리즈[SwiftUI] 뷰의 성능 개선(1) - Dependency 관리[SwiftUI] 뷰의 성능 개선(2) - 뷰의 slow update 개선[SwiftUI] 뷰의 성능 개선(3) -Identifier의 중요성   함께 공부하는 분께 SwiftUI를 선호하는지 UIKit를 선호하는지 여쭤본 적이 있다. 그분의 대답은 “SwiftUI보다 UIKit를 더 선호한다. SwiftUI는 데이터에 따라 뷰가 재 렌더링 되는 것을 관리하기 까다로운 것 같다” 이었다. 나는 어떨까 생각해 보니 성능적인 것보다는 뷰를 만들기 직관적이고 쉽다는 측면으로 SwiftUI를 선호했던 것 같다. 그래서 최근에 SwiftUI 뷰에 대한 최적화 방법은 무엇이 있을까 여러 방면으로 공부해 보고 테스트해 보았다...

SwiftUI 2024.11.26

[SwiftUI] some View 때문에(?) 필요한 @ViewBuilder

@ViewBuilder에 대해서는 이전 블로그 글에서도 쓴 적이 있지만 활용 방법 위주로만 서술한 것 같아서 SwiftUI가 뷰를 리턴 받는 방식인 some View와도 연관되게 설명해보려 한다. 아래 글은 옛날에 썼던 글!SwiftUI 재사용가능한 뷰를 만들기 위해 필요한 @ViewBuilder    📍ViewBuilder 공식문서 역시나 건너뛸 수 없는 공식문서의 정의를 봐보자!A custom parameter attribute that constructs views from closures. '클로저를 통해 뷰를 구성하는 매개변수에 대한 어트리뷰트이다.'라고 설명한다.*어트리뷰트 : 컴파일러에게 추가적인 정보를 알려주는 역할을 하는 것   이게 무슨 뜻인지 모르겠다면 SwiftUI에서 뷰를 그릴 ..

SwiftUI 2024.11.21

[Swift] SwiftUI에서 some View를 사용하는 이유 | any VS some

왜 SwiftUI에서는 some View를 사용해서 뷰를 그려요? some 키워드가 Opaque Type에서 사용되고 Opaque Type에 대한 개념도 어느 정도 알고 있지만, 어느 날 문득 왜 SwiftUI에서는 any View도 아니고 some View로 뷰에 대한 타입을 리턴 받아 사용하는 걸까 궁금했다.    이렇게 some 키워드로 나타내는 타입을 Opaque Type이라고 하는데, 불명확 타입이라고도 불리며, 역제네릭 타입으로도 불린다. 왜 불명확 혹은 역제네릭 타입으로 불리는지 Opaque Type에 대해 살펴보고, 왜 SwiftUI에서 뷰를 그릴 때는 some View 처럼 Opaque Type을 사용하는지에 대해서도 알아보자!    📍Generic 왜 Opaque Type 알아본다고 ..

Swift 2024.11.14

[Swift] any 키워드는 왜 있는걸까? Existential Type은 뭔데?

some과 any를 공부하다 보니 any라는 키워드가 등장한 이유가 궁금해졌다.궁금증이 의식의 흐름처럼 생기는 편.. ㅎㅎ  any 키워드에 대해서 공부하다보니 Existential type 이라는 것까지 공부하게 되었는데 Existential type의 특성과 함께 swift 5.6에서 any 키워드가 등장한 이유에 대해서도 알게되어 흥미로워 글을 적는다. Swift를 공부하면서 Existential 이라는 단어는 Existential Container 공부할 때 밖에 못 봤는데 (프로토콜 타입의 인스턴스를 저장하는 방법에 대한 내용) 역시나 이번에도 프로토콜에 관련한 내용이었다. Existential Container 에 대한 내용이 궁금하다면 아래 블로그 글로!프로토콜 채택한 구조체 Existent..

Swift 2024.10.31