728x90
만들면서 배우는 DI
- 깃허브 저장소
- Reflection
- 읽기 전용 변수의 값을 수정하거나, 비공개 프로퍼티를 외부에서 사용하는 등의 행위를 할 수 있는 문법이다.
- 의존성 주입이 필요한 클래스 생성자의 프로퍼티를 가져오거나, 프로퍼티의 어노테이션을 가져오는데 활용하였다.
- 의존성 주입을 위해 읽기 전용 변수를 수정 가능하게 만들어 의존성을 주입하는데 활용하였다.
- Qualifier
- 하나의 인터페이스에 대해 여러 구현체가 있을 경우 구분자를 활용해 의존성을 주입해야 했다.
이때 Qualifier의 형태에 대해 고민하였다. - @Qualifier(DefaultRepository.class) & @Qualifier("defaultRepository")
- 나의 경우에는 후자를 선택하였다. 첫 번째 경우에는 인터페이스를 사용하는 것에 대한 의미가 사라진다.
- 하나의 인터페이스에 대해 여러 구현체가 있을 경우 구분자를 활용해 의존성을 주입해야 했다.
- Roboletric
- 에뮬레이터 실행 없이 JVM으로 시뮬레이션된 안드로이드 테스트를 할 수 있다.
- Activity의 생명주기에 따른 테스트에 이용하였다.
(onCreate 이후에 의존성이 초기화되었는지, onDestroy 이후에 의존성 참조가 해제되었는지 등)
- WeakReference
- 미션이나 수업 중에서 다뤘던 내용은 아니지만 테스트에 더 나은 방법은 없을지 알아보는 과정에 알게 되었다.
- 약한 참조를 걸어 참조한 객체가 소멸될 때 (강한 참조가 없을 경우) 함께 소멸된다.
- onDestroy 이후에는 Activity에 대한 참조가 사라진다.
참조가 해제된 값에 대해 직접적으로 참조하고자 하면 오류가 발생한다.
따라서, 약한 참조의 특성을 이용해 참조 해제를 검사하고자 하였다.
- ViewModel의 생성 과정
- Activity에서 ViewModelProvider 생성한다. 이때 Store에 인스턴스가 있다면 재사용한다.
ViewModelStoreOwner도 지정해준다.
생성된 ViewModel은 Store에 저장된다.
AAC 뷰모델이 액티비티 구성요소 변경에도 살아남을 수 있는 이유는 ViewModelStoreOwner가 사라질 때 프로퍼티인 NonConfigurationInstances라는 변수가 함께 사라진다. 구성변경에는 사라지지 않는다.
- Activity에서 ViewModelProvider 생성한다. 이때 Store에 인스턴스가 있다면 재사용한다.
- Hilt
- Hilt 이용 방법을 학습하였다. 와정에 Binds와 Provides의 차이에 대해 학습하였다. (관련 이슈)
- Binds
- 생성자를 가질 수 없는, 객체 생성 로직을 직접 제공할 수 없는 인터페이스의 인스턴스를 제공할 때 적합하다.
또한, 구현적인 특징으로는 구현체의 생성자에 @Inject 어노테이션이 있어야 한다는 점이 있다.
모듈에서 생성자의 파라미터를 명시하지 않아도 된다는 장점이 있다.
- 생성자를 가질 수 없는, 객체 생성 로직을 직접 제공할 수 없는 인터페이스의 인스턴스를 제공할 때 적합하다.
- Providers
- 객체에 대한 인터페이스를 가질 수 없는 Room과 같은 경우, 객체의 인스턴스화 방법(=객체 생성 로직)을 제공할 경우에 적합하다.
뷰 챌린지 (그림판)
- 깃허브 저장소
- ViewLifeCycle
- Measure: 뷰의 크기를 계산하기 위해 호출된다. ViewGroup의 경우, 각각의 자식 뷰에 대해 measure를 호출하여 크기를 계산한다.
- Layout: 화면상의 위치를 지정한다.
- Draw: 이전 단계에서 계산된 크기와 위치를 기반으로 뷰 자체를 그린다(Canvas 객체를 GPU에게 전달한다). onDraw()는 여러 번 호출될 수 있기 때문에 이 점을 염두하여 무거운 작업을 하지 않아야 한다.
- invalidate vs requestLayout
- 뷰의 변화를 시스템에 알리는 방법
- invalidate: draw 과정이 수행된다. 뷰의 속성이나 데이터가 변경되었을 때 사용한다.
- requestLayout: measure -> layout -> draw 단계를 거친다. 뷰의 크기나 위치, 혹은 부모 뷰의 크기나 레이아웃이 변경되었을 때 사용한다.
- 반응형 UI
- 다크모드, 태블릿 등의 화면에 대한 변경사항을 적용하였습니다.
- values-night, layout-w600dp, layout-sw600dp ... 등을 사용하였습니다.
728x90
'우아한테크코스 5기 > 정리' 카테고리의 다른 글
레벨 3, 레벨 4 팀 프로젝트 총정리 (0) | 2023.10.29 |
---|---|
우아한테크코스 5기 모바일 레벨2 총정리 (0) | 2023.06.18 |
우아한테크코스 5기 모바일 레벨1 총정리 (0) | 2023.04.08 |
[git] origin에 merge된 브랜치에서 추가로 진행된 commit 이동하기 (4) | 2023.02.27 |
[kotlin][JUnit5] TDD (Test Driven Development, 테스트 주도 개발) (0) | 2023.02.21 |
댓글