Android
좋은아키텍처를 위해 - 복잡성 제거
Oxix
2022. 12. 8. 21:24
Android 아키텍처
아키텍처를 공부해야 하는 이유
- 수 많은 이벤트 발생한다 -> 잘못된 설계를 하면 프로그램의 유지보수성을 극도로 떨어뜨린다.
- 이벤트의 처리 결과가 동시다발적, 불시에 일어날 수 있다.
- 대응이 지연되면 앱이 정지 될 수도 있다.
- 네트워크가 끊어졌어도 동작해야 한다. -> 보다 유연한 데이터 계층의 구현이 필요
좋은 아키텍처?
풀려는 문제에 잘 어울리는 설계
- 코드 구조가 시스템이 어떻게 동작하는지를 잘 보여주어야 한다 -> 이해, 이유를 알기 쉽게
- 요구사항이 진화함에 따라 쉽게 변경 가능해야 한다. -> 유지, 테스트 하기 쉽게
- 성능 개선 작업을 보다 더 부드럽게 해주어야 한다.
좋은 아키텍처의 방해물 : 복잡성
시스템을 이해하기 어렵고 수정하기 어렵게 만드는 소프트웨어 구조에 관한 모든 것
원인
- 의존성
- 코드가 독립적으로 이해되고 수정될 수 없는 경우 -> 최소화 되어야 한다.
- 불명확성
- 중요한 정보가 불명확할 때
- 기대값을 알기 힘든 경우
- 전술적 프로그래밍
- 지금 당장 직면한 문제만 해결하기 -> 기술 부재
해결 방안
- 불필요한 정보를 감춘다 -> 추상화
- 깊은 모듈
- 범용 인터페이스
- 정보 은닉
- 깔끔한 추상화
- 복잡성을 아래로 끌어내린다.
- 추상화 사이의 경계 찾기
깊은 모듈
- 노출되어 있는 것은 적으나 많은 작업을 처리해 주는 모듈 ->하나의 간단한 요청을 많은 작업 처리
- 중요하지 않은 세부사항을 감춰주는 간소화된 뷰 -> 추상화
- 하나의 메서드로 작업을 완료하지 못해 여러개, 여러번을 호출해야 한다면 얕은 모듈이며 좋지 않다.
범용 인터페이스
- 어떠한 입출력 장치에서도 연결하여 사용할 수 있는 인터페이스
- 현재의 요구사항을 모두 만족하는 것중 어떠한 것이 가장 심플한 인터페이스인지 파악 가능해야 한다
- 얼마나 많은 상황에 사용될 수 있나? -> 답이 하나라면 특정 용도의 인터페이스 이다.
정보 은닉
- 불표요한 정보를 감추어야 한다. 정보 누출로 인하여 여러 군대에서 사용되어서는 안된다. 해당 로직을 수정하면 여러개의 클래스에 영향을 미치기 때문이다.
이러한 것들을 지키면 복잡성을 아래로 끌어내릴 수 있다. 하지만 이를 남용하면 오히려 정보 유출로 이어질 수 있어 중요 원칙에 따라 복잡성을 아래로 끌어내려야 한다.
중요 원칙
- 기존에 있는 기능과 밀접하게 연관되어 있는 경우
- 앱의 여러 부분들을 더 단순하게 만들어 줄 수 있는 경우
- 클래스의 인터페이스가 단순하게 만들어 줄 수 있는 경우
추상화 사이의 경계 찾기
합쳐야 하는 경우
- 정보가 공유 됨
- 함께 있는 것이 인터페이스 단순화에 도움이 됨
- 코드 중복을 없애줌 -> 코드 반복은 제대로 추상화가 이루어지지 않음을 짐작할 수 있다.
나눠야 하는 경우
- 특정 목적의 API가 범용 클래스 안에 있을 때
- 다른 종류의 범용 매커니즘이 함께 있는 경우
주의 사항
다만 그렇다고 하여 코드를 무작정 줄이는 것이 아니라 코드를 중복되는 것이 발견되었지만 해당되는 부분을 인터페이스로 만들어지지 않을 것 같으면 그냥 두는 것이 나을 수 있다.