전체 글
정적 분석으로 iOS 앱 구조 파악하기
[ 본 포스팅은 언패킹(리버스 엔지니어링)에 대한 내용으로 관련 법률에 유의하시기 바랍니다. ] iPA iOS App-Store Package 의 줄임말으로 iOS 및 ipad 어플리케이션 아카이브 파일입니다. 모든 앱은 IPA 형태로 앱스토어에 배포가 됩니다. 개발한 코드와 함께 번들, 사이닝, 리소스 파일등이 모두 포함됩니다. iPA 다운 받기 앱스토어에 올라가 있는 앱의 iPA 를 얻기 위해 ipatool 을 사용해보겠습니다. ( 다른 방법으로 3utools, Xcode 아카이브, 탈옥된 iOS 기기를 통해 얻을 수 있습니다. ) // ipatool 설치 brew tap majd/repo brew install ipatool // ipatool 로그인 ipatool auth login --email..
코딩테스트를 위한 Swift 필수 자료구조 구현하기
코딩테스트는 취업에 있어 꼭 필요한 과정 중 하나입니다. 저도 익숙하게 사용했던 Python 언어를 활용하여 코딩 테스트를 준비했었는데요. 하지만 최근에 점차 많은 회사들이 포지션에 맞게 코딩테스트 언어 제한을 두었습니다. Swift는 Type-Safe 언어이고 문법도 간결해서 iOS 개발할 때에 무척 편리하게 사용하고 있습니다. 하지만 Python과 달리 별도의 Built-in 자료 구조가 없어서 코딩테스트에 필요한 부분은 직접 구현해야 합니다. 이번 게시글에서는 Swift를 통해 필요한 자료구조를 직접 구현하는 방법에 대해 기술하고자 합니다. Queue Queue 는 FIFO 방식으로 동작하는 자료구조입니다. 프린터, 작업 대기열 같은 문제에 활용되고 더 나아가 SPFA 같은 최단 거리 알고리즘에 사..
8개월간 같은 iOS 앱을 리팩토링하며 배운점
"링크모아" 는 사용자의 북마크를 쉽게 관리하고 공유할 수 있는 앱 서비스입니다. 20년 12월 기획을 시작으로 디자이너 1명, 백엔드 개발자 2명, iOS 개발자 2명이 협업하며 21년 3월에 개발을 완료했습니다. iOS 개발자와 처음으로 협업을 하며 이론적으로만 알고있던 git-flow 를 적용하고 merge 시에는 코드 리뷰를 꼭 거치도록 했습니다. 잠깐이지만 앱 스토어 생산성 부문에서 160위 내에 들었고 동아리 데모데이 대상을 받는 등, 저에게 있어 무척 뜻 깊은 프로젝트입니다. 데모데이 이후에 프로젝트가 마무리될거라고 생각했지만 같이 협업을 했던 iOS 개발자분이 한 가지 제안을 주셨습니다. "현업에서 사용하는 기술들을 적용해보고 지속적으로 같이 리팩토링 해봐요." 매번 기능 개발만 진행하고 ..
iOS Dependency Injection 개념 파악하기
의존성 주입이란? iOS 테스트 코드를 공부하며 상당히 많이 접했던 단어입니다. "의존성 주입" 은 무엇일까요? 이론적인 개념은 다음과 같습니다. ``` 소프트웨어 엔지니어링에서 의존성 주입(dependency injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이다. 클라이언트가 어떤 서비스를 사용할 것인지 지정하는 대신, 클라이언트에게 무슨 서비스를 사용할 것인지를 말해주는 것이다. "주입"은 의존성(서비스)을 사용하려는 객체(클라이언트)로 전달하는 것을 의미한다. ``` 출처: https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85 대부분의 프로그램은 객체들의 조합인 Composition 으로 이루..
초보 개발자가 오픈소스에 기여하는 방법
필자는 깃허브에 있는 오픈소스 프로젝트를 자주 들여다 봅니다. 뛰어난 개발자분들이 작성한 코드를 보고 새로운 언어 기능이나 구조를 보며 배우는 것이 무척 많습니다. 그러던 중 기여할 수 있는 부분이 생기면 여러번 고민해보고 PR 을 보내기도 합니다. 처음에는 확신이 없었고 민폐가 아닌가? 하는 생각이 들었지만 에러를 해결하고 나서 많은 분들이 좋은 피드백을 주셨던 경험이 있습니다. 그 후 개선할 부분을 발견하면 이슈를 꼼꼼히 확인하고 PR 을 올리는 습관을 가질 수 있었습니다. Swift 첫 오픈 소스 기여 후기 ( Open Source PR ) 오픈소스라 하면 거대한 프로젝트이고, 뛰어난 개발자분들이 기여하기 때문에, 입문 개발자가 쉽게 접근하기 어렵다고 생각했습니다. 하지만 베타 Xcode 에서 컴파..
Swift Reference Count 고찰 ( with side table )
Swift ARC 의 기본적인 개념은 아래 포스팅을 참고해주시면 감사하겠습니다. Swift ARC ( Automatic Reference Counting ) 정리 추상적으로 "메모리를 관리해주는 것" 으로 이해하고 있었지만, JAVA 의 GC ( 가비지 컬렉터 ) 와의 차이점을 명확하게 설명하게 어려워서 포스팅을 작성했습니다. 프로그래밍 언어의 메모리 관리 linux-studying.tistory.com 필자는 iOS 를 처음 공부하며 클로저 캡처리스트를 작성할 때 unowned 를 남발했던 기억이 있습니다. 그 후 앱 크래시를 유발할 수 있다는 조언을 듣고 강한 순환 참조가 발생할 수 있는 상황에서는 weak 키워드를 사용했습니다. weak 와 unowned 를 사용하면 레퍼런스 카운트가 올라가지 않고..
iOS 뷰 컨트롤러 간단하게 테스트 코드 연습하기 ( with Unit Test )
UIKit 환경에서 뷰 컨트롤러는 3가지 방식으로 구성할 수 있습니다. ( Xib, Storyboard, Code Base ) 해당 방식으로 구성된 뷰 컨트롤러를 인스턴스화 하는 방법을 먼저 살펴보겠습니다. 뷰 컨트롤러 인스턴스 가져오기 Xib, Code Base - 별도의 파라미터가 없는 경우 바로 인스턴스화 가능합니다. Storyboard - 먼저 UIStoryboard 인스턴스에 접근하고, 해당 메서드로 생성해야 합니다. 참고 뷰 컨트롤러 view 로드하기 이렇게 가져온 뷰 컨트롤러는 따로 view 를 로드하는 과정을 거쳐야 합니다. XIB 와 Storyboard 기반의 vc 는 loadViewIfNeeded() 를 통해 Outlet 들을 구성하고 연결할 수 있게 됩니다. Code Base 로 구성..
iOS JSON 을 Decoding 하는 여러 가지 방식들
JSON 는 자바스크립트에서 객체를 표현하는 방식으로 REST API 에서 널리 사용되는 방식입니다. iOS 에서는 Codable 을 통해 쉽게 JSON 을 디코딩할 수 있는데요. Codable 과 Dictionary 로 디코딩 하는 방법을 살피고 예외적인 상황까지 이번 포스팅에서 다루고자 합니다. Codable Codable 은 Decodable & Encodable 프로토콜을 모두 준수하는 타입입니다. 따라서 Encode 할 필요가 없다면 Decodable 만 채택해도 네트워킹 처리에는 문제가 없습니다. Decodable 는 프로토콜이기 때문에 Class, Struct, Enum 모두 채택할 수 있습니다. 추가적으로 CodingKeys 를 통해 Key 값을 변경할 수 있습니다. Encode and D..
iOS URLSession Test Double 만들기
iOS 에서 네트워크를 테스트하는 방법은 크게 두가지가 있습니다. 1. 실제 서버(혹은 테스트 서버) 에 직접 요청하기 2. Stub 을 통해 실제 네트워크에 요청하지 않고 테스트하기 네트워크 요청은 느리고, 실패 가능성이 있으며 불확실성이 높은 요소입니다. 이런 경우에는 일정한 요청을 return 하는 Stub 을 제작하는 2번으로 주로 테스트를 진행하게 됩니다. URLSessionDataTask vs URLSession 어떤 것을 Stubbing 할까? 테스트 코드 학습을 위해 가장 처음 접했던 포스팅은 배달의 민족 기술블로그 조원님의 "iOS Networking and Testing" 입니다. ( Moya 기반의 test code 코드 작성법도 기술되어 있으니, 꼭 읽어보시면 좋습니다. ) 위에서는..
iOS 에서 Void Observable 테스트 코드 작성하기
RxSwift 에서 다음 이벤트로 값을 전달할 필요가 없는 경우에는 Void Observable 를 사용합니다. 그리고 테스트 코드를 작성하기 위해서는 RxTest 에 있는 TestScheduler 를 이용하여 가상 시간의 이벤트들을 방출하는 옵저버블을 만들고, XCTAssertEqual 을 통해 events 를 비교하게 됩니다. Bool Observable 은 문제 없이 테스트 가능하지만 여기서 Void Observable 에서 문제점이 발생하게 됩니다. .next 로 들어가는 요소는 Equatable 을 준수해야 하기 때문입니다. RxSwift 저장소에서 해당 문제가 논의되며 PR이 올라왔었지만, 현재는 메인 저장소에 반영되지 않았습니다. 이를 해결하는 방식은 크게 2가지가 있습니다. 1. 별도의 테..