[iOS] Jetflix 5. 리팩토링 - ViewModel 개선
·
iOS 프로젝트/클론
* 진행 코드는 https://github.com/jeongju9216/Jetflix에서 볼 수 있고, PR에서 에피소드 단위로 코드를 확인할 수 있습니다. 개선 내용 첫 번째 리팩토링은 코드와 구조 수정에 집중했습니다. MVC 구조를 MVVM으로 변경 Enum을 이용해 ViewModelActions 정의 Enum을 이용해 API 콜 메서드 정리 1. 클론 코딩 영상에서는 MVVM이라고 설명하고 있었지만, 제가 느끼기에는 MVC의 구조를 가지고 있다고 느꼈습니다. ViewController에서 데이터를 직접 API Call을 하고 데이터를 생성, 조작했기 때문입니다. 따라서 이부분을 개선하여 ViewModel에서 데이터를 생성, 관리했습니다. 이 과정에서도 고민점은 있었는데요. 과연 변화가 없는 데이터도..
[iOS] 넷플릭스 클론 코딩 4. CoreData 사용 (영상 끝)
·
iOS 프로젝트/클론
* 진행 코드는 https://github.com/jeongju9216/Jetflix에서 볼 수 있고, PR에서 에피소드 단위로 코드를 확인할 수 있습니다. 이번 포스팅까지가 영상을 따라 구현하는 내용입니다. 다음 포스팅부터는 스스로 고민하며 리팩토링하는 과정을 작성하겠습니다. 서론 넷플릭스 클론 코딩 - 4 내용은 Amr 유튜브 채널의 Building Netflix App in Swift 5 and UIKit - (Xcode 13, 2021) 에피소드 11, 12, 13, 14 내용입니다. 에피소드 11, 12, 13, 14에서는 유튜브 API와 웹뷰를 사용해 트레일러 영상을 재생하고, CoreData를 이용해 Entity를 저장하는 과정까지 진행했습니다. 구현 내용 Youtube Data API 사용..
[iOS] 넷플릭스 클론 코딩 3. 이미지 표시
·
iOS 프로젝트/클론
* 진행 코드는 https://github.com/jeongju9216/Jetflix에서 볼 수 있고, PR에서 에피소드 단위로 코드를 확인할 수 있습니다. 서론 넷플릭스 클론 코딩 - 3 내용은 Amr 유튜브 채널의 Building Netflix App in Swift 5 and UIKit - (Xcode 13, 2021) 에피소드 7, 8, 9, 10 내용입니다. 에피소드 7, 8, 9, 10에서는 Upcoming 화면과 Search 화면에 CollectionView를 등록하고, 이미지를 보여주는 작업을 했습니다. 이 파트를 보면서 알게된 것은 ViewModel을 View에서 사용하는 Model로 구현하고 있다는건데요. 단어만 보면 틀린건 아닌거 같은데... MVVM에서의 VM 역할과는 거리가 멀다고..
[iOS] 넷플릭스 클론 코딩 2. 네트워크 통신
·
iOS 프로젝트/클론
* 진행 코드는 https://github.com/jeongju9216/Jetflix에서 볼 수 있고, PR에서 에피소드 단위로 코드를 확인할 수 있습니다. 서론 넷플릭스 클론 코딩 - 2 내용은 Amr 유튜브 채널의 Building Netflix App in Swift 5 and UIKit - (Xcode 13, 2021) 에피소드 5, 6 내용입니다. 에피소드 5, 6에서는 네트워크 통신을 진행했습니다. API는 https://www.themoviedb.org를 사용했고, 사용법은 원본 영상을 참고해 주세요. 구현 내용 네트워크 통신 Protocol과 Enum을 이용해 Mixed Type 파싱 completionHandler -> async/await 변경 Domain, Data 레이어 추가 Repo..
[iOS] 넷플릭스 클론 코딩 1. 기초 UI 구현
·
iOS 프로젝트/클론
서론 넷플릭스 클론 코딩 - 1은 Amr 유튜브 채널의 Building Netflix App in Swift 5 and UIKit - (Xcode 13, 2021) 에피소드 1, 2, 3, 4 내용입니다. 아직 초반이라 그런건지, 클론 코딩이라 그런건지 코드를 보면 확실히 일회성 코드라고 느껴졌습니다. 이런 부분은 포스팅에 기록해두고 리팩토링을 하며 유의미한 클론 코딩 경험을 가지려고 합니다. 구현 내용 에피소드 1, 2, 3, 4에서는 아래 내용을 진행했습니다. TabBar 생성 ViewController 파일 생성 및 TabBar 등록 HomeVC에 TableView 추가 Table HeaderView 추가 네비게이션바 설정 위로 스크롤 시 네비게이션바가 숨겨지도록 설정 아래는 지금까지 구현한 스크린..
[iOS] 넷플릭스 클론 코딩 0. 목표
·
iOS 프로젝트/클론
목표 기존에는 클론 코딩의 효과에 대해 의아함이 있었지만, 인턴십을 하면서 생각이 바뀌었습니다. 클론 코딩을 하면서 스킬이 늘고 다른 프로젝트에 응용할 수 있기 때문입니다. 이번 넷플릭스 클론 코딩도 이와 같은 목표로 시작합니다. 넷플릭스 앱에는 이미지, 리스트와 관련된 기능이 많습니다. 1. 가이드에 따라 개발을 하고, 2. 제 코드 스타일로 리팩토링을 하고, 3. 제 개인 프로젝트에 기술을 적용을 해보려고 합니다. 클론 코딩은 1년 전에 Amr 유튜브 채널에 게시된 영상을 토대로 진행하고, 다음 넷플릭스 클론 코딩 - 1부터 본격적인 포스팅을 시작하겠습니다. 감사합니다. 아직은 초보 개발자입니다. 더 효율적인 코드 훈수 환영합니다! 공감과 댓글 부탁드립니다.
[Swift] Enum을 이용한 Mixed Type JSON 디코딩
·
Swift/개념 & 응용
서론 JSONArray의 아이템 타입이 혼합될 수 있습니다. let mixedData = """ [{ "type": "movie", "id": 100, "title": "타이타닉", "country": "USA" }, { "type": "person", "id": 101, "name": "레오나르도 디카프리오", "role": "Actor" }, { "type": "music", "id": 102, "title": "My Heart Will Go On", "artist": "Céline Dion" }] """.data(using: .utf8)! 위 JSON을 보면 각 아이템의 type, id는 공통되고 이외 key 구성이 다릅니다. 이럴 경우 type을 이용해 if문으로 처리할 수도 있지만, Enum을 ..
[iOS] UnitTest 사용해보기
·
iOS/개념 & 개발
서론 의존성 주입 등을 공부하면서 "테스트가 쉬워진다."라는 문장을 자주 접했습니다. 오늘은 UnitTest가 무엇인지 알아보고, Xcode의 UnitTest 기능을 간단히 사용해보겠습니다. UnitTest UnitTest는 프로젝트의 특정 모듈이 의도된대로 정확히 작동하는지 검증하는 절차로, 모든 함수와 메서드에 대한 테스트 케이스를 작성하는 절차를 의미합니다. 작성한 프로그램이 의도대로 잘 동작하는지 검증하는 가장 작은 단위의 테스트라고 할 수도 있습니다. 작은 단위의 테스트이므로 테스트에는 의존성을 최소화해야 합니다. 따라서 각 객체의 관심사를 분리해야 하고, 이때 의존성 분리와 주입이 필요합니다. 저도 최근에 의존성에 대한 포스팅을 작성했는데요. 의존성 주입 DI(Dependency Injecti..
[Swift] Dependency Container(feat. Property Wrapper)
·
Swift/개념 & 응용
* 틀린 내용이 있을 수 있습니다. 댓글로 알려주시면 매우 감사하겠습니다. Dependency Container 지난 포스팅에서 DI에 대해 배웠습니다. DI를 하나의 Container로 관리하는 방법이 Dependency Container(DI Container, IoC Container)입니다. 기존 DI는 인스턴스 생성 위치가 분산되었지만, Container를 사용하면서 한 곳에 모아진다는 장점이 있습니다. 동일한 생성자 코드 중복을 줄일 수 있다는 장점도 있습니다. 이번 포스팅에서 (매우) 기본적인 Container를 직접 만들어보고, 다른 포스팅에서 Swinject 라이브러리를 소개하겠습니다. Dependency Container 구현 Dependency Container(이하 Container..
[Swift] 의존성 주입 DI(Dependency Injection)와 IoC(Inversion Of Control)
·
Swift/개념 & 응용
서론 SOLID 원칙 with Swift의 D를 담당하고 있는 의존성은 중요한 개념입니다. 객체 지향에서 객체의 의존성은 빼놓을 수 없는 개념이고, 결합도와 응집도에서 다룬 낮은 결합도의 핵심 방법이기 때문입니다. 의존성과 의존성 주입의 개념 자체는 간단하기 때문에 짧게 다뤄보겠습니다. Protocol을 이용한 ViewModel 의존성 주입 등 지난 여러 포스팅들에서 간접적으로 소개한 적이 있기 때문에 함께 읽어주시면 감사하겠습니다 OvO b 의존성 의존성이란 하나의 객체에서 다른 객체를 참조하는 것을 말합니다. class AClass { var number: Int = 0 } class BClass { var numberClass: AClass = AClass() } let bClass = BClass..
[Swift] defer
·
Swift/개념 & 응용
서론 최근 lock 코드를 작성하면서 defer를 처음 사용해보았는데요. 이번 포스팅에서 defer란 무엇이고 어떤 특징이 있는지 알아보겠습니다. defer defer는 코드 블럭이 종료되기 직전에 호출되는 코드 블럭입니다. "코드 블럭"이기 때문에 메서드 뿐만 아니라 for문, if문 등이 종료될 때도 사용할 수 있습니다. 사용법은 간단합니다. 코드 블럭 안에 defer { } 를 추가하면 됩니다. func functionA() { print("In functionA") defer { print("Out functionA") } } functionA() //In functionA //Out functionA 메서드가 종료될 때 Out functionA가 호출되는 것을 볼 수 있습니다. if true {..
[Swift] Protocol 확장을 이용한 Singleton 개선
·
Swift/개념 & 응용
서론 싱글톤 패턴의 가장 큰 장점은 편리하다는 것입니다. 하지만 여러 부수적인 문제가 많고 특히, 사이드 이펙트가 크다는 점이 문제입니다. 프로젝트 전역에 두루두루 쓰이는 게 싱글톤 객체인데, 이말은 곧 싱글톤 객체에 문제가 생기면 프로젝트 전역에 문제가 생긴다는 뜻이기 때문입니다. 오늘은 Swift의 프로토콜 확장을 통해 이를 어느정도 해소할 수 있는 방법을 알아보겠습니다. 이것도 장단점이 있으니 프로젝트에 적절할 때 적용해보면 좋을듯 합니다. 프로토콜 확장(extension Protocol) 기본 원리는 프로토콜을 이용해 한 곳에서 싱글톤 호출을 담당하는 것입니다. 구조체나 클래스가 아니라, 프로토콜을 사용하는 이유는 싱글톤의 존재를 숨길 수 있기 때문입니다. 프로토콜을 정의하고, extension으..
[Swift] SOLID 원칙 with Swift
·
Swift/개념 & 응용
서론 최근에 디자인 패턴 글과 ViewController, ViewModel의 역할 분리 글을 작성했습니다. 해당 글들에서는 배경지식 없이도 이해가 되도록 표현을 풀어서 쓰다보니 정확성이 떨어진다고 느껴졌습니다. 이도저도 아니게 된 것 같아 보다 정확한 내용 전달을 위해 이후 관련 글에서는 "단일책임 원칙", "개방폐쇄 원칙" 등의 단어로 표현을 명확하게 하려고 합니다. 그런 의미로 이번 포스팅에서 SOLID 원칙에 대해 정리해보고, Swift와 iOS에서는 어떻게 적용할 수 있는지 알아보겠습니다. SOLID란 SOLID란 OOP(객체 지향 프로그래밍) 및 설계의 기본 원칙으로, 단일 책임 원칙 (Single Responsibilty Principle) 개방 폐쇄 원칙 (Open-Closed Princi..
[Swift] 콤마(,)와 && 차이
·
Swift/개념 & 응용
서론지난 포스팅에서는 where을 다뤘습니다. 포스팅을 적으면서 여러 반복문을 where로 바꿔보고 있었는데요. 아래와 같은 에러가 발생하는 경우가 있었습니다.where문에서 두 개의 조건을 콤마(,)로 연결해본 코드인데요.for i in 0..
[Swift] where문 활용법
·
Swift/개념 & 응용
서론 where은 Swift의 특정 제약을 거는 키워드입니다. 비슷한 효과를 내는 문법은 if문입니다. if문에 비해 where문은 낯설게 느껴질 수 있는데요. where문을 이용하면 가독성은 유지하면서 코드 길이를 줄일 수 있다는 사실을 알고 계시나요? 이번 포스팅에서는 그 방법에 대해 알아보겠습니다. for문과 where where문을 사용하면 for문 안의 if문을 없애고 코드를 줄일 수 있습니다. 아래는 0부터 100 사이의 5의 배수를 출력하는 코드입니다. //if문 for i in 0.. Bool where T: Equatable { return a == b } isEqual과 isEqualWithWhere는 모두 T에 특정 제약을 추가했습니다. 두 개의 차이는 미미하기 때문에 어떤 것을 선택..
유정주
'개발' 태그의 글 목록 (4 Page)