본문 바로가기
프로그래밍

디자인 패턴에 대한 생각

by YuminK 2023. 11. 12.

디자인 패턴은 사용의 이유가 있어야 한다. 단순히 디자인 패턴에 대한 지식을 알고 모르고는 크게 중요하지 않다.

현업에서 실질적으로 사용하는 디자인 패턴은 대체로 정해져 있다. 

 

Singleton, Delegate, Observer, Adapter, MVC, MVVM, DI 정도 선에서 정리되는 느낌이다.

솔직히 그렇게까지 거창한 개념도 아니고 개발하다보면 어느 시점에 써야 하는지 감이 온다.

 

하나하나씩 정리해볼까.

 

Singleton: 객체의 개수를 1개로 고정하고 싶을 때, 게임 프로그래밍이라면 주로 Manager 클래스를 싱글톤으로 둔다. 어플리케이션 내에 1개의 객체만 생성하길 원하는 경우. 예를 들면 Logger 같은 거 만들 때 적합해보인다. 

 

Delegate: 프로그래밍 문법적으로 들어가 있는 경우가 흔하다. 함수를 선언해서 인자로 받는 형태 or 자바의 인터페이스 상속 같은 부분에서 사용된다. Dialog 만들 때 각 버튼에 대한 처리를 함수로 넘겨서 받을 때 사용하면 된다.

 

Observer: 옵저버라고도 하고 리스너라고 부르기도 한다. 특정 값이 바뀌기를 기다리고 있다가, 값이 변한 경우에 콜백이 호출되는 형태이다.

 

Adapter: 다양한 형태의 모듈에 맞추어 규격을 만들어 주는 시스템이다. Spring에서 다양한 형태의 컨트롤러 코드를 작성할 수 있다. Spring 아키텍처에서 어댑터 패턴을 사용하여 처리하는 부분이 있기에 여러 형태로 개발이 가능한 것이다. 특정 처리를 위한 브릿지 같은 느낌이 있다.

 

MVC: 모델, 뷰, 컨트롤러의 약자로 모델은 데이터, 뷰는 UI, 컨트롤러는 뷰에 데이터를 업데이트하는 역할이다.

안드로이드를 기준으로 본다면 이렇다. 화면에 뿌릴 데이터는 모델, UI 부분은 View, Activity내에서 findViewById를 사용하여 뷰를 업데이트하는 것은 컨트롤러라고 볼 수 있다.

 

MVVM: Model, View, View Model의 약자이다. Model은 데이터를 의미하고 View Model은 데이터를 관리하는 역할을 맡는다. View는 직접 View Model을 옵저빙하여 데이터의 변경을 인식하고 View에 반영한다.

 

안드로이드의 데이터 바인딩 및 라이브 데이터 라이브러리를 이용하여 ViewModel을 만들고 변경된 데이터를 View(XML)에서 인식하게 한다면 MVVM 패턴으로 동작하게 된다. Flutter로 따지면, ChangeNotifier가 ViewModel 역할을 하게 된다. 

 

DI: 의존성 주입의 약자이다. 특정 객체에 의존(참조)하는 구조를 가질 때 반복적인 참조 관련 코드를 없애고, 공통적인 인터페이스에 대한 구현을 간단하게 처리하기 위한 방식이다. 

 

예를 들어 카드사의 혜택을 구현하는 프로그램을 만든다고 가정해보자. 각 카드는 결제라든지, 취소라든지 비슷한 인터페이스가 존재한다. 근데 문제는 각 카드사마다 혜택이 조금씩 다를 수밖에 없다. 이렇게 동일한 인터페이스를 가졌지만 각 구현을 따로 개발해야 하는 상황에서 DI를 사용하기에 좋다.

 

우리가 직접 의존성을 주입(객체 참조)하다가 실수하는 것을 방지할 수 있고 동일한 로직이 생기는 것을 막을 수 있다. OCR 원칙에도 적합하다고 볼 수 있는데, 지속적인 수정이 일어나더라도 의존성을 주입하는 부분만 변경하면 원하는 처리가 반영되는 식이다. (유지보수에 좋다)


디자인 패턴의 특성상 특정한 상황에 맞게 사용하는 것이 중요하다. 단순히 객체 참조하는 코드가 많아져서 DI를 도입한다거나 MVVM이 뭔가 신기술처럼 보여서 도입한다는 것은 이유가 될 수 없다. 특정 디자인 패턴을 썼을 때, 패턴을 사용한 이유가 있어야 하는데 억지로 사용하면 코드는 망가지기 시작한다. 

 

MVVM은 좋은 디자인 패턴이지만, 단순한 어플리케이션을 개발할 때 오히려 복잡해질 가능성이 크다. 안드로이드에서 MVVM을 제대로 구현하려면 매 화면마다 ViewModel을 구현해야 한다. 단순한 앱 개발이라면 그냥 액티비티 내에서 findViewById 혹은 DataBinding으로 개발하는 게 더 빠를 것이다. 

 

애초에 디자인 패턴 자체가 플랫폼에 따라 명확하게 나눠지지 않는 느낌도 있다. 개발에 적용하는 패턴일 뿐이지 명확하게 맞아 떨어져야 하는 것이 아니다. 이렇게 구현해야만 MVVM이고 그런 건 없다. 플랫폼따라 다르고 구현하는 방식도 가지각색이다. 컨셉 중심으로 익히고 적절한 때에 활용하는 능력이 중요하다고 생각한다. 

 

 

'프로그래밍' 카테고리의 다른 글

Socket vs WebSocket  (1) 2023.11.14
비동기 프로그래밍과 쓰레드  (0) 2023.11.13
테스트 서버(윈도우) 설정 방법  (0) 2023.11.12
[Flutter, C#] .env 파일 추가  (1) 2023.10.23
Redis란 무엇인가?  (0) 2023.08.24

댓글