Android

좋은아키텍처를 위해 - 복잡성 제거

Oxix 2022. 12. 8. 21:24

Android 아키텍처


아키텍처를 공부해야 하는 이유

  • 수 많은 이벤트 발생한다 -> 잘못된 설계를 하면 프로그램의 유지보수성을 극도로 떨어뜨린다.
  • 이벤트의 처리 결과가 동시다발적, 불시에 일어날 수 있다.
  • 대응이 지연되면 앱이 정지 될 수도 있다.
  • 네트워크가 끊어졌어도 동작해야 한다. -> 보다 유연한 데이터 계층의 구현이 필요

좋은 아키텍처?

풀려는 문제에 잘 어울리는 설계

  • 코드 구조가 시스템이 어떻게 동작하는지를 잘 보여주어야 한다 -> 이해, 이유를 알기 쉽게
  • 요구사항이 진화함에 따라 쉽게 변경 가능해야 한다. -> 유지, 테스트 하기 쉽게
  • 성능 개선 작업을 보다 더 부드럽게 해주어야 한다.

좋은 아키텍처의 방해물 : 복잡성

시스템을 이해하기 어렵고 수정하기 어렵게 만드는 소프트웨어 구조에 관한 모든 것

원인

  • 의존성
    • 코드가 독립적으로 이해되고 수정될 수 없는 경우 -> 최소화 되어야 한다.
  • 불명확성
    • 중요한 정보가 불명확할 때
    • 기대값을 알기 힘든 경우
  • 전술적 프로그래밍
    • 지금 당장 직면한 문제만 해결하기 -> 기술 부재

해결 방안

  • 불필요한 정보를 감춘다 -> 추상화
    • 깊은 모듈
    • 범용 인터페이스
    • 정보 은닉
  • 깔끔한 추상화
    • 복잡성을 아래로 끌어내린다.
    • 추상화 사이의 경계 찾기

깊은 모듈

  • 노출되어 있는 것은 적으나 많은 작업을 처리해 주는 모듈 ->하나의 간단한 요청을 많은 작업 처리
  • 중요하지 않은 세부사항을 감춰주는 간소화된 뷰 -> 추상화
  • 하나의 메서드로 작업을 완료하지 못해 여러개, 여러번을 호출해야 한다면 얕은 모듈이며 좋지 않다.

범용 인터페이스

  • 어떠한 입출력 장치에서도 연결하여 사용할 수 있는 인터페이스
  • 현재의 요구사항을 모두 만족하는 것중 어떠한 것이 가장 심플한 인터페이스인지 파악 가능해야 한다
  • 얼마나 많은 상황에 사용될 수 있나? -> 답이 하나라면 특정 용도의 인터페이스 이다.

정보 은닉

  • 불표요한 정보를 감추어야 한다. 정보 누출로 인하여 여러 군대에서 사용되어서는 안된다. 해당 로직을 수정하면 여러개의 클래스에 영향을 미치기 때문이다.

이러한 것들을 지키면 복잡성을 아래로 끌어내릴 수 있다. 하지만 이를 남용하면 오히려 정보 유출로 이어질 수 있어 중요 원칙에 따라 복잡성을 아래로 끌어내려야 한다.

중요 원칙

  • 기존에 있는 기능과 밀접하게 연관되어 있는 경우
  • 앱의 여러 부분들을 더 단순하게 만들어 줄 수 있는 경우
  • 클래스의 인터페이스가 단순하게 만들어 줄 수 있는 경우

추상화 사이의 경계 찾기

합쳐야 하는 경우

  • 정보가 공유 됨
  • 함께 있는 것이 인터페이스 단순화에 도움이 됨
  • 코드 중복을 없애줌 -> 코드 반복은 제대로 추상화가 이루어지지 않음을 짐작할 수 있다.

나눠야 하는 경우

  • 특정 목적의 API가 범용 클래스 안에 있을 때
  • 다른 종류의 범용 매커니즘이 함께 있는 경우

주의 사항

다만 그렇다고 하여 코드를 무작정 줄이는 것이 아니라 코드를 중복되는 것이 발견되었지만 해당되는 부분을 인터페이스로 만들어지지 않을 것 같으면 그냥 두는 것이 나을 수 있다.