본문 바로가기
우아한테크코스 5기/정리

레벨 4 미션 정리

by 코드 이야기 2023. 11. 1.
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라는 변수가 함께 사라진다. 구성변경에는 사라지지 않는다.
  • 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

댓글