posite 2026. 2. 25. 15:48

똑립 - 사회초년생의 똑! 부러지는 독립을 위한 커뮤니티 플랫폼

(2024.01 ~ 20224.02)

Skills: Kotlin, Retrofit , Hilt, Retrofit, OkHttp, Coroutine, Flow

Tools: Notion, GitHub

Member: Android(4), BackEnd(3), PM(1), Design(1)

Github: https://github.com/ttoklip/Android

기여도: Android 20% (네트워크 기초 작업 및 화면 구현)


Project Info

    1인 가구의 어려움을 해결하기 위해 정보를 서로 공유하고, 도움을 주는 커뮤니티 서비스입니다.

    꿀팁을 자유롭게 공유하고 질문 및 신뢰할 수 있고 유익한 정보가 공유되는 뉴스레터를 제공합니다.

    식자재 공구와 친목을 할 수 있는 지역 커뮤니티 역할을 합니다.

 

App Architecture

설계한 MVVM 구조와 예시

              

 

 

직면한 문제점

확정되지 않은 디자인 및 기능의 변화

설계상 고민:  개발 시작 당시 세부 요구사항과 디자인이 완전히 결정되지 않아 각 화면의 기능이 변경될 수 있어 Model, View, ViewModel의 의존성을 줄여 각 관심사의 변경이 생겨도 독립적으로 개발하고자 함

 

고민 및 해결 방안

  • 설계상 고민을 해결하기 위한 방법을 찾아본 결과 관심사 분리를 위한 디자인 패턴을 찾게 되었고 MVC, MVP, MVVM을 알게 되어 팀원들과의 의논을 통해 정하게 됨
  • MVC
    • 규모가 점차 커지면 Model과 View 사이의 의존성이 존재하여 유지 보수가 어려움
    • Controller에 코드가 집중적으로 쌓여 알아보기 힘들 수 있음
  • MVP 
    • View에서 Presenter를 직접 생성하기에 의존성이 높음
    • View가 많아질수록 Presenter도 많아짐 -> 코드가 길어짐
  • MVVM 
    • View와 Model 사이의 의존성, View와 ViewModel 사이의 의존성이 없음
    • 각각의 부분은 독립적이기 때문에 모듈화하여 개발 가능
    • 데이터 바인딩과 StateFlow, SharedFlow를 이용하여 UI 업데이트 자동 적용 및 이벤트 처리를 생명주기에 맞게 적용 가능
    • MVC, MVP의 의존성 문제가 사라지며 각자 기능에 맞게 부분별로 구현 가능한 MVVM 채택하게 됨

해결 및 결과

  • 앞의 모든 아키텍처를 비교한 후 모듈화하여 개발할 수 있는 MVVM 아키텍처를 선택 및 구현
  • UI 업데이트 자동 적용 및 이벤트 처리를 더욱 간편하게 개발할 수 있었음
  • 각 계층들이 분리되어 각각의 계층에 변동이 있어도 다른 계층에 영향을 주지 않고 수정하여 빠르게 개발할 수 있었음 

 

보일러플레이트 코드 증가 문제 발생

원인: 기능 변경 사항 자주 발생 및 Retrofit, Repository, ViewModel 객체들이 많아지면서 보일러플레이트 코드가 급증함

 

고민 및 해결 방안

  • 이러한 문제를 해결하기 위한 방법을 찾아본 결과 객체를 외부에서 주입하는 의존성 주입을 알게 됨
  • 의존성 주입 시, 이러한 보일러플레이트 코드를 줄이고 객체 간 결합도를 낮추어 기능 추가 및 변경 시 수정 범위를 최소화하여 생산성 향상 가능
  • 의존성 주입 방법은 Koin, Hilt가 있으며 팀원과의 회의에서 각각의 장단점 비교를 통해 결정 후 적용함 
  • Koin
    • 쉽고 빠르게 DI를 적용할 수 있으며 별도의 어노테이션을 사용하지 않아 컴파일 시간이 단축된다
    • 런타임에 의존성을 주입하여 퍼포먼스가 떨어지며 런타임에 에러가 발생한다
    • 리플렉션을 이용하기 때문에 성능 상 좋지 않다
  • Hilt 적용하기
    • 컴파일 타임에 의존성 그래프를 검증하여 오류를 컴파일 시점에 발견할 수 있음
    • Android Component 별 Scope가 명확하여 Android Lifecycle 및 Scope을 쉽게 관리 가능
    • 러닝커브가 있어 DI 적용에 시간이 필요할 수 있음

해결 및 결과

  • 성능과 안정성이 더 좋은 Hilt 적용하여 🔗의존성 주입 
  • 처음 Hilt를 적용하였음에도 컴파일 타임에 오류를 발견하여 빠르게 해결할 수 있었음
  • 프로젝트 진행 중 변경된 디자인과 기능의 수정사항에 빠르게 대처할 수 있었음

 

🟢 Keep (유지할 점)

  • MVVM 패턴 준수: 프로젝트 전반에 걸쳐 계층화된 아키텍처를 유지하려고 노력하여 유지보수성을 높일 수 있었음.
  • Hilt를 활용한 의존성 주입: DI 라이브러리를 통해 객체 간의 결합도를 낮추어 보일러플레이트 코드를 줄이고 개발 시간 단축함
  • 계층형 아키텍쳐 적용 : Data - Domain - Presentation 레이어를 명확히 분리하여 비즈니스 로직과 UI 로직의 간섭을 최소화함

🔴 Problem (문제점 및 아쉬운 점)

  • XML 기반 UI의 보일러플레이트: 커뮤니티나 꿀팁 게시판처럼 복잡한 UI를 가진 화면에서 XML 코드가 비대해지고, BindingAdapter나 ViewHolder를 매번 작성해야 하는 번거로움 발생 가능

🔵 Try (다음 프로젝트에서 시도할 것)

  • Jetpack Compose로의 점진적 전환: 이번 프로젝트에서 느꼈던 UI 코드의 복잡성을 해결하기 위해, 다음 프로젝트에서는 선언형 UI인 Compose 도입고려 - 코드량 감소 예상
  • MVI(Model-View-Intent) 패턴 고려: 복잡해지는 상태 관리를 단방향 데이터 흐름(UDF)으로 제어하기 위해 MVI 도입을 검토
  • 공통 UI 컴포넌트 고도화 (Design System): 똑립에서 만든 UI 요소들을 별도의 라이브러리처럼 관리하여, 다음 프로젝트에서는 디자인 시스템을 먼저 구축하기