개발을 시작하는 이야기

코드 리팩토링 01. 디자인 패턴 본문

사는 이야기/OU

코드 리팩토링 01. 디자인 패턴

Teiresias 2022. 7. 19. 00:09

 코드에 대한 컨벤션 가이드의 가닥이 잡혀가면 이제는 구조에 대한 컨벤션을 잡아야 한다. 구조에 대해 논의하기 시작한다면 끝이 없겠지만, 일단 가장 중요한건 코딩 패턴에 대한 아키텍쳐를 다루고자 한다.

MVC, MVP, MVVM

 어떤 패턴이 좋은가에 대해 '앱 개발 디자인은 이 패턴으로 해야 한다!" 라고 과감하게 정의 내릴수는 없다. 앱 규모의 크기에 따라, 구현하는 기능에 따라 사용하기 좋은 패턴이 있지만 가장 선호하고 많이들 언급되는 패턴은 뭐니뭐니 해도 MVVM패턴이다.

MVC 패턴은 Controller에 많은 코드가 몰리게되고, 각 모듈별로 의존성이 강해서 변경사항이 발생하면 Model, View, Controller가 모두 변경되어야 한다.

MVP 패턴은 Model과 View간의 의존성은 삭제되었으나, View와 Presenter간의 의존성이 1:1 수준으로 강하게 작용된다.

MVVM 패턴은 데이터 바인딩을 통해 View와 Model이 1:n 관계를 가질 수 있다. 모듈별 의존성이 사라지고 독립적이게 되면서 역할별 유닛테스트가 용이하고, 비동기성 코드를 사용할 수 있다. 

 

 사실 학습하는 과정에서 디자인 패턴의 끝판왕으로 배운것이 MVVM이기도 했고, MVVM이 재대로된 구조를 잡는것이 어렵기 때문에 작성하면 멋있어 보이기도 하고, 무엇보다 모바일 OS 플랫폼 공식 가이드에서 가장 권고하는 패턴이기도 하다. 

RxSwift / iOS(Swift)

 사실 아직 RxSwift에 대한 개념을 완전 확실하게 정립하지 못했지만, Rx를 그동안 사용하고 공부한 경험에 의하면 코드가 모듈화되고 클로저 안에서 Thread를 상황에 맞게 적용해가며 코딩할 수 있어서 가독성 면에서도 품질 면에서도 상향된다는 느낌을 받는다. 통일된 방식으로 Event, Thread, Time, Exception 처리 방식을 제공하고, 메소드 외부로는 읽기 전용의 Observable 형태로 제공하기 때문에 코드가 깔끔해진다. 또한 콜백지옥을 어느정도 해결해주고, 여러 모듈을 체이닝하는데에 탁월하다.

 

 특히 Android/iOS와 같은 UI프로그래밍이 필요한 경우에 더더욱 진가를 발휘한다. 복수의 비동기 처리 완료 후 결과값을 합치거나 연속클릭 이벤트 발생으로 인한 이벤트 중복실행을 제어하는 등 UI 특성 이슈를 해결하는데 유용하다.

AAC / Android(Kotlin)

 AAC(Android Architecture Components)는 앱 구조를 더 튼튼하고, 테스트에 용이하고, 유지 보수성이 뛰어나게 만들어 주는 앱을 디자인 하도록 도와주는 라이브러리 모음이다. LiveData, ViewModel, Room 크게 3가지를 지원하는데, 이러한 라이브러리의 모음은 MVVM 패턴의 구조의 설계에 최적화 되어있다.

 LiveData를 사용하여 기본 데이터베이스가 변경되면 뷰에 알리는 데이터 객체를 빌드하고 ViewModel은 UI 관련 데이터를 저장한다. Room은 SQLite 객체 매핑 라이브러리다. Room을 사용하여 상용구 코드를 피하고 SQLite 테이블 데이터를 자바 객체로 쉽게 변환할 수 있다. Room은 SQLite 문의 컴파일 시간 확인을 제공하며 RxJava, Flowable, LiveData, Observable을 반환할 수 있다.

Coroutines / Android(Kotlin)

 코루틴은 비동기적으로 실행되는 코드를 간소화 하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다. 코루틴은 기본 스레드를 차단하여 앱이 응답하지 않게 만들 수도 있는 장기 실행 작업을 관리해주는데 도움이 된다.

 코루틴을 사용하면 우선 메모리 누수 감소에 도움이 된다. 구조화된 동시 실행을 사용하여 범위 내에서 작업을 실행할 수 있다. 또한 코루틴을 실행 중인 스레드를 차단하지 않는 정지를 지원하므로 단일 스레드에서 많은 코루틴을 실행할 수 있어, 보다 더 많은 동시 작업을 지원하면서도 차단보다 메모리를 절약한다. 또한 실행 중인 코루틴 계층 구조를 통해 자동으로 취소 전달이 가능하다.

ReactNative

 ReactNative는 태생 자체가 Reacive Programming을 위한 React에서 나왔기 때문에 라이브러리 도움 없이도 기본적인 State 관리만으로 충분히 Reative한 프로그래밍이 가능하다.