[1] 실패하는 테스트를 작성한다 10/2 = 5 인지 나눗셈 테스트 해보는 코드인데 당연히 실패한다. Calculator를 만들지도 않았기 때문에-! [2] 빨리 테스트가 통과하게끔 만든다. (또는 컴파일에러가 안나게 일단 막 만들 수 도 있는데 간단한 함수라 바로 구현함) [3] 이제 제대로 동작하는 지를 검사하겠다는 마인드를 지닌다. 다른 실패할 테스트를 만들어본다 (0으로 나눴을때) [4] 테스트가 통과하게끔 만든다 이런식으로 테스트 코드를 먼저 만들고 구현을 점진적으로 해나가는 것이 TDD의 느낌(?) 인 것 같다 그리고 테스트주도개발 에서 나온 것 처럼 일단 빨리 테스트를 통과하게 만들고 그 와중에 생겨난 중복제거 등 리팩토링을 마지막 단계로 해줄 수 도 있다 기능구현을 하고 테스트 코드를 뒤..
테스트 코드부터 작성하는 것이 감이 안와서 테스트 코드보다 먼저 ArtistAPIService를 작성해버렸다... 🙄 이전 포스팅에서 만들었던 ArtistAPIType을 이용하여...!!! 물론 다음과 같이 Artist모델도 만들어줬다...!!! 그리고 Apple Music API 홈페이지에 들어가서 해당 API에 해당하는 더미데이터를 복붙하여 넣어준 더미데이터 파일을 만들고 테스트 코드 있는 쪽에 넣어준다 BananaMusicTests 그룹안에 넣어주면 된다 (나의 토이프로젝트 이름은 BananaMusic이기때문...ㅎㅎ!! ) 그리고 실제 서버에서 주는 데이터가 아니라 이 더미데이터를 파싱하는 ArtistAPIServiceStub 을 만든다 (Stub, Mock, Spy 등등 다양한 용어들이 있던데 ..
테스트 코드를 제대로 공부하고 싶어서 예제 프로젝트를 진행중이다 아직 유닛테스팅도 잘 작성하지 못하지만 TDD 어떤지 너무 궁금해서 해보기로 했다 :-) 띄엄띄엄 조금조금 공부중인데 흐름을 놓치지 않도록 잘 정리해서 기록해두자 주제는 Apple Music API를 이용한 토이 프로젝트...!!! Apple Music API는 이렇게 모든 API마다 response json을 친절하게 알려주는데, 이 json을 dummy data로 쓰기에 딱 좋기 때문이다 일단 Apple Music API를 사용하기 위해서는 developer token이 필요하다 이 순서대로 차근차근 해서 keyID, teamID 를 알아내고 나의 private key가 담긴 .p8 file을 얻어내야한다 https://developer..
Signal와 Driver는 UI 계의 PublishSubject / BehaviorSubject 같은 것...! Signal과 Driver 의 공통점 - error를 return 하지 않는다. - 메인 쓰레드에서의 작동을 보장한다. - Rxcocoa에 있음 Signal과 Driver 의 차이점 - Signal은 새로운 구독자에게 replay 해주지 않는다. (Driver 처럼 구독하는 순간 초기값이나 최신값을 주지 않는다. 구독한 이후에 발행되는 값을 받음. 위의 사진 참고) - Signal은 emit함수로 이벤트 처리 / Driver는 drive함수로 이벤트 처리 signal.emit(onNext: { (element) in } driver.drive(onNext: { (element) in } Rx..
https://medium.com/gett-engineering/rxswift-share-ing-is-caring-341557714a2d RxSwift: share()-ing is Caring - Gett Engineering - Medium RxSwift resource sharing can be hard. Learn about share(), which lets you define streams that share resources among their subscribers. medium.com 설명이 너무 감동적..🥺 share란 publish와 같은 컨셉인데, 옵져버블 공유를 위한 연산자이다 하지만 publish와 다르게 connect가 필요없다...! (👍) 그리고 publish는 옵져버블이 끝..
iOS 디자인 패턴(MVC/MVVM/VIPER/Clean Swift/MVC-C /MVVM-C ) 을 다 쓰지 못했지만...!ㅠㅠ 일단 정리 MVVM도 다양한 종류가 있어서 정리를 해보고자 한다 ViewModel이 Model을 다루고 View는 다루지 않는다는 컨셉은 동일하고 두가지 옵션을 선택하여 쓰는 것 같다 1) ViewModel이 Coordinator(Navigation을 담당하는 녀석)에게 말하느냐 안하느냐 MVVM에서는 Navigation 관련 코드를 Coordinator 또는 Navigtor라는 녀석에게 다 맡긴다. 보통 Coordinator라고 많이 부르고 이런 디자인 패턴을 MVVM-C 라고 부른다. 이 Coordinator에게 "여기 화면으로 이동 좀 해주세요~" 하는 요청을 ViewMo..
viewController가 deinit 될때, 그 안의 Pulisher가 auto-cancel 되는지 실험해봅시다 --! 5초 후에 이벤트를 발행하는 Publisher와 3초 후에 deinit되는 viewController가 있습니다 1) stream을 안담아줄 때 viewController가 deinit되어도 스트림이 살아있습니다 2) stream을 Cancellable에 담아줄 때 viewController가 deinit되어도 여전히 스트림이 살아있습니다 3) stream을 Cancellable에 담아주고 deinit 때 cancel 시켜줄 때 이렇게 deinit 될때 cancel시키는 코드를 넣어줘야지 스트림이 같이 끝납니다 4) stream을 AnyCancellable에 담아줄 때 AnyCanc..
이 포스팅을 이해하려면 RxSwift vs Combine - 스펙 / 성능 / 개념 비교를 읽고 오세요 ☺️ Rxcocoa(for UIKit) + RxSwift 로 짰던 코드를 -> UIKit + Combine -> SwiftUI + Combine 이렇게 두 가지 버전으로 바꿔보았습니다 :) 우선 Model/ViewModel 쪽 코드는 큰 차이가 없었습니다 APIManager 안에 있는 fetch 함수를 예로 봅시다 (isbn number를 받아서 책정보를 주는 함수입니다) Observalbe을 AnyPulisher로 바꾸면 끝입니다 그 다음 APIMananger의 fetch 함수를 부르는 ViewModel 쪽 코드를 봅시다 여기도 subscribe를 sink로 바꿔주면 끝입니다 하지만 UIBinding..
WWDC 2019에서 Combine이 발표되었다. Combine은 Rx와 똑같다! 라고 말하던데 정말 똑같을까..? 🤔 Rx와 Combine을 비교해보자 1. 스펙 비교 Rx와 Combine은 모두 Reactive 프로그래밍을 위한 framework이다 하지만 Rx는 iOS 8이상부터, Combine은 iOS 13이상부터 사용할 수 있다 (그래서 Combine을 실제 프로덕트에서 쓰기까지는 최소 1년에서 최대 3년까지 걸릴 것이라고 말한다) Rx는 Third party framework인 반면 Combine은 애플에서 만든 buit-in framework이다...! 그리고 Rx는 Rxcocoa와 Combine은 SwiftUI와 UIBinding을 하도록 설계되어졌다 (하지만 Combine은 SwitUI와..
enum의 rawValue, CaseIterable 같은 여러 속성들을 다 사용하고 싶었으나, 안되는 case들이 있어서 정리를 해본다 1) CaseIterable 과 연관값(associated value) 를 함께 사용할 수 없다 이렇게 allCases 라는 변수를 직접 선언해주어야지 Test.allCases 로 사용할 수 있다 Enum입장에서는(?) 연관값이 있으면 연관값에 따라 여러 케이스들이 있다는 것이라서 개발자가 연관값과 함께 케이스로 해줄 것들을 알려달라고 하는 것이 자연스러운 것 같다 : ) 2) rawValue와 연관값(associated value) 를 함께 사용할 수 없다 이렇게 따로 rawValue라는 변수를 만들어주는 수 밖에 없다 ㅠ.ㅠ
- Total
- Today
- Yesterday
- 장고 Custom Management Command
- Django Heroku Scheduler
- cocoapod
- Django FCM
- PencilKit
- Django Firebase Cloud Messaging
- Flutter Text Gradient
- DRF APIException
- Dart Factory
- flutter 앱 출시
- Watch App for iOS App vs Watch App
- Flutter 로딩
- flutter dynamic link
- Flutter getter setter
- SerializerMethodField
- Python Type Hint
- flutter deep link
- METAL
- drf custom error
- ribs
- Sketch 누끼
- 플러터 얼럿
- github actions
- ipad multitasking
- 구글 Geocoding API
- 장고 URL querystring
- Flutter Clipboard
- 플러터 싱글톤
- flutter build mode
- Flutter Spacer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |