![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b6cYza/btsIP7aX7hy/vXfDl18FKspiihpLjfQ5hK/img.png)
해당 글은 WWDC24 Meet Swift Testing을 토대로 작성했습니다. Swift Testing이란?Swift Testing은 Swift로 작성된 코드를 테스트하기 위한 새로운 오픈 소스 패키지입니다. 기존 XCTest에 비해 테스트를 더 쉽게 작성하고 관리할 수 있도록 도와줍니다. (Xcode16부터 사용 가능하며, 템플릿 default 설정은 XCTest가 아닌 Swift Testing이 됩니다.)Swift Testing의 구성 요소테스트 함수Swift Testing에서는 기존 테스트 함수가 "test"로 시작했던 것과 다르게 @Test 속성을 사용해 테스트 함수임을 명시적으로 표현합니다.전역 함수, 정적 함수, 인스턴스 메서드 등 다양한 형태의 함수를 지원합니다.Expectations테스트..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cTtj69/btsn12muQGv/M5ufAh9Gde6SDP10fBpK61/img.png)
빈번하게 갱신되는 화면의 경우 어떻게 성능 테스트를 할 수 있을까요? 눈으로 확인했을 때 화면이 버벅이면서 보이거나 끊김 현상이 보이면 당연히 성능이 안 좋다고 판단할 수 있겠지만, 눈으로 확인하는 데는 정확성이 부족할 수 있고 미묘한 차이를 캐치하기 어려울 수 있습니다. 아무래도 가장 좋은 건 데이터, 즉 수치로 확인하는 것이죠. XCode12부터 UI와 관련된 성능 이슈를 파악하는데 도움을 주는 Instruments - Animation Hitches가 도입되었습니다. 아래 내용은 WWDC21 Hitch 관련 세션을 보고 정리한 글입니다. 일반적으로 디스플레이를 갖는 디바이스의 경우 주사율을 갖습니다. iOS 디바이스의 경우 보통 60Hz의 주사율을 갖고 이는 1초에 60번 화면이 갱신됨을 의미합니다..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/daVKk8/btsfdaVY5CG/ttWKnEaIkyglxDkT02klzk/img.png)
클린 아키텍처? Robert C Martin이 제시한 소프트웨어 아키텍처로 계층별 역할(관심사)을 분리함으로써 유지보수, 테스트 용이성의 이점을 가져갈 수 있다. 위 이미지를 보면 의존성의 경우 바깥쪽에서 안쪽으로 향하게 되는데, 이 의미는 안쪽 계층의 경우 바깥 계층에 대해 알 수 없다는 의미(영향을 받지 않는다는 의미)이고 안쪽으로 갈 수록 의존성이 옅어짐으로 변경 가능성이 가장 적은 비즈니스 룰이 위치하게 된다. 여기서 비즈니스 룰이란 Domain Layer(Use Cases + Entities)에 적용되는 규칙으로 사업의 핵심적인 서비스와 관련된, 즉 잘 변하지 않는 비즈니스 로직을 적용하는 것을 말한다. 예를 들어 일기 앱 서비스라고 가정한다면 일기 작성, 삭제등의 기능이 있을 수 있다. 이 로..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/QLtnu/btr6OZHs2wQ/xjmYCfq7tJ2SkBShShptQ0/img.png)
UnitTest? 개발자가 작성한 프로그램이 의도한 대로 동작하는지 검증하는 단위의 테스트 -> 소스코드의 기본 동작을 검증할 수 있음으로 신뢰할 수 있는 프로그램 작성 가능 -> 특정 모듈, 비즈니스 로직 리팩토링시에도 테스트 함수를 통과해야 하므로 신뢰할 수 있는 프로그램 작성 가능 테스트 코드 작성 방법 함수(비즈니스 로직)에 대한 input case와 output case들을 정의하고 테스트를 통과하는지 검증하는 테스트 코드를 작성 동일한 input에 대해서는 동일한 output이 보장되어야만 함 만약 덧셈, 뺄셈이 가능한 계산기 프로그램을 개발한다고 했을 때 아래와 같이 덧셈 뺄셈에 대한 비즈니스 로직을 설계할 수 있습니다. Tests file로 가보시면, 아래와 같이 처음 보실 수도 있는(?)..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/uHugZ/btrSaJFLEx1/kAy3XCAkU5q2HfVJMwLthK/img.png)
현재 회사에서 진행하는 프로젝트에서 SwiftUI와 Combine을 사용하고 있는데, 최근에 드디어..! CBT 버전 개발을 완료하고 배포했습니다 ㅎㅎ 블로그 포스팅을 어떤 내용으로 하면 좋을까 생각해보다가 SwiftUI로 나름(?) 대규모 서비스를 개발해 본만큼 SwiftUI 학습을 처음 시작하려는 분들에게 어떤 순서로 학습을 하면 좋을지 알려주면 좋을 것 같아서 학습 순서를 정리해보려 합니다! (주의: 만약 서비스가 지원하는 OS의 최소 버전이 iOS13이라면 SwiftUI 도입을 극구 말리고 싶습니다. 최소 지원 버전이 iOS14 -> iOS15 ~ 16 일때 도입을 고려해 보세요. 정정: 성능이 중요하거나, 메인 기능의 경우 추천드리지 않습니다.) 1. SwiftUI Tutorial 먼저 첫 시작..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cbHrjm/btrI6r1maA8/u3YQIgPrZjjXpxG18BL3G1/img.png)
저는 아이폰에 설치된 앱이 워낙 많아 아이폰의 '검색' 기능을 자주 사용하는데요. 이때 몇몇 앱의 경우 영어로 된 앱임에도 한글로 검색되는 경우가 있고, 한글로 된 앱임에도 영어로 검색되는 경우가 있습니다. 예를 들어 앱 이름(display name)이 '네이버 지도'라고 하더라도, 아래 이미지와 같이 'naver'라고 검색하면 검색 결과에 '네이버 지도'가 검색 결과로 나오는 거죠 ㅎㅎ 반대로 아래와 같이 앱 이름(display name)이 영어로 되어있어도 한글로 검색 가능하도록 설정할 수 도 있습니다. (duck-z는 제가 개발해 운영하고 있는 앱입니다 ㅋㅋ) 이렇게 앱의 이름(display name)외에 다른 이름으로도 검색 가능하게 하는 방법은 아주 간단합니다. 아래와 같이 앱의 Info.pli..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/btVFSO/btrevRbRZZQ/30RbCHUcl2Qxtwwkr5NT61/img.png)
오늘은 Instruments를 알아보려고 합니다. Instruments는 성능 분석 및 테스팅 도구로 앱의 성능을 신경 쓴다면 반드시 알아야 할 도구입니다. Instruments를 사용하면 CPU분석 메모리 분석을 포함해 여러 가지 분석을 할 수 있고 분석을 통해 성능을 개선시킬 수 있습니다. 오늘 모든 분석을 다 살펴보진 않고 Activity Monitor, Time Profiler, Allocations, Leaks 이렇게 네 가지만 살펴보겠습니다. Instruments를 사용하려면 Product > Profile을 누르시면 됩니다. Instruments가 실행된 후 통계를 기록하기 위해서는 아래와 같이 빨간색 레코드 버튼을 누르셔야 합니다. (모든 분석의 경우 트래킹을 중지하고 Instruments..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/c4IVYL/btreu9RDash/IaeO0sVu0ltNUmCKTV1jOK/img.png)
오늘은 다양한 디버깅 방법에 대해 알아볼까 합니다. 구구절절 작성하기보다는 핵심만 간결하게 작성해보도록 하겠습니다 ㅎㅎ 1. 콘솔 창 메시지 확인 런타임 에러 발생 시, 앱 종료와 함께 앱이 종료된 이유를 콘솔 창을 통해 확인할 수 있습니다. 2. 디버거 활용 (Breakpoints & lldb) 두 번째 방법은 Breakpoints와 lldb를 활용하는 것입니다. 잘 사용하기 위해서는 디버깅 툴 바에 대해 이해하고 넘어갈 필요가 있습니다. 툴 바 설명 Disable/enable breakpoint: 브레이크 포인트 활성화/비활성화 . Pause/continue execution: 프로그램 실행 중지/이어서 실행 (만약 다음 breakpoint가 있다면 해당 breakpoint에서 멈추게 됩니다.) St..
오늘은 의존성 주입(DI)에 대해 공부한 내용을 정리해보려 합니다. https://ko.wikipedia.org/wiki/의존성_주입 의존성 주입이란? 객체지향 프로그래밍에서 의존성이 있다는 것은 클래스 간에 의존 관계가 있다는 것을 의미합니다. 즉, 다음과 같이 A라는 클래스에서 B클래스 객체를 생성해 사용하면 의존관계가 형성되는것이죠. class B: A { } class A { let b = B() // 의존 관계 형성 } 의존관계가 형성되면 한 클래스가 바뀔 때 다른 클래스가 영향받게 되는데. 이러한 의존관계를 약하게 만들기 위한 방법이 의존성 주입입니다. 객체의 생성과 사용의 관심을 분리함으로써 가독성과 코드 재사용성을 높이는데 그 의의가 있습니다. 만약 메일을 사용하는 User라는 클래스가 있..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/00Y6q/btq2ImmaQCq/NFLmiojmV8AEdlLFCKW0L0/img.png)
SwiftUI 기초 - 공식 튜토리얼 정리(1)에서 이어지는 내용입니다. SwiftUI 두 번째 튜토리얼입니다. 첫 번째 튜토리얼에서는 사용자에게 보여줄 정보를 하드 코딩했다면 이번 튜토리얼에서는 데이터를 저장하는 모델을 만들어서 사용해 볼 겁니다. 먼저 developer.apple.com/tutorials/swiftui/building-lists-and-navigation 이곳에 들어가서 프로젝트 파일을 다운로드해주세요. 만약 영문으로 튜토리얼을 진행하고 싶으시다면 해당 링크에서 쭉 진행해 주셔도 무방합니다. 다운로드한 프로젝트 Resources 폴더의 landmarkData.json 파일을 우리가 튜토리얼 1에서 만들었던 프로젝트에 드래그 앤 드랍합니다. 그다음 Landmark라는 이름의 Swift ..