안드로이드 개발하는 개발 패턴으로는 MVC( Model - View, Controller)와, MVVM(Model - View, ViewModel), 그리고 MVP(Model - View - Presenter)방법이 있습니다. 이 세가지 방법에는 각자만의 스타일과 장단점을 가지고 있구요. 안드로이드 개발자들이 많이 늘어나고 좀더 편한 개발 방법들을 추가하면서 나오는 방법들이지 않을 까 합니다.

1. MVC ( Model - View - Controller )

 - Model : 안드로이드에서 사용될 데이터들.

 -  View : activity_main.xml 과 같은 view layout

 - Controller : Activity, Fragment 들...

알게 모르게 가장 많이 사용된 패턴이지 않을 까 생각됩니다. 그런데 View와 Controller의 coupling이 너무 강합니다. 누구 하나 땔래야 땔 수 없는 구조이죠. 우리가 알고 있는 좋은 구조는 loose coupling이 많아야 좋은 구조라고 배웠을 겁니다. 그래서 장기적으로 봤을 대 어떤 구조로 가야 좋을 지 생각해 볼 필요가 있습니다.


2. MVVM ( Model - View - ViewModel )

ViewModel은 Controller와 View의 구조를 통합적으로 가지고 있다고 보시면 될 거 같습니다. ViewModel을 독립적으로 가져갈 수 있지만, 나중에 View가 변경된다면 ViewModel을 한번에 다 변경해야 할 필요도 있어 보입니다. 가끔 Git에서 안드로이드 ui 라이브러리나 componet를 보면 mvvm으로 구현된 것들이 많았던 것으로 기억됩니다. 이 방법이 그나마 View에 대한 가장 독립적인 방법이지 않았을 까 생각됩니다. 


3. MVP ( Model - View - Presenter )

전체적인 패턴이 MVC와 비슷합니다. Controller가 Presenter로 보시면 될 듯 하지만 틀린 점이라면 View에 대한 관리와 접근은 Activity에서 하고, Model에 대한 컨트롤러 역활은 Presenter에서 하게 됩니다. 


이 세 방법에 대한 생각은 제 주관적인 생각입니다. MVC, MVVM, MVP 뭐 하나 나쁘다 좋다 할 방법은 없다고 생각 됩니다.  각자만의 장단점이 있고 누가 어떻게 사용하느냐 그리고 어떤 프로젝트 인지에 따라서도 많이 틀려질 것으로 보입니다. 저는 최근에 프로젝트를 MVP방법으로 진행했습니다. MVP를 사용하면서 경험을 해봤을 대 각각 구조에 대해서 loose coupling적인 방법으로 구현을 할 수 있었지만, 너무 독립적으로 진행하다보니 해당 interface에 대한 구현이 많아지는 것을 느낄 수 있었습니다. 다른 프로젝트를 진행한다면 다시 MVP방법을 사용해 볼려고는 합니다. 단지 저는 MVC, MVVM방법보다는 그래도 가장 느슨한 결합도를 가졌다고 보여집니다.

공부하면서 만든 샘플은 git에 올려 둡니다. 그냥 참고 자료에요.

https://github.com/drcarter/AndroidDevPattern

상당히 오랜만에 블로그에 글을  쓴다.

그리고 이번 글은 정답이 없는 글이라고 생각한다. 그냥 개인적인 생각을 좀 적어보고 싶은 것 뿐.

난 아직 부족한 개발자다. 완벽하게 하고 싶지만 항상 2% 부족했고, 그리고 내 코드도 완벽하지 않다고 생각한다.  그 부족한 부분은 개발할 당시엔 모르고 한참 후에야 알게되곤 했으니까... 그리고 난 스스로 발전시킬려고 노력하고 있다. 


얼마전 프로젝트에서 디자이너가 나한테 이렇게 말했다. 

[디자이너가 나인패치를 하기 어렵고 하니 배경 관련된 부분을 pattern으로 가자고, 이전 개발자는 버튼 배경 이미지를 사용했을 대 1px짜리 버튼 이미지를 주면 코드로 알아서 모서리 부분도 라운드 처리해서 사용했다. 그러니 그렇게 가자고]

이 말을 들었을 대 순간적으로 든 생각은 이러했다.

왜!!! 편한길 놔두고 어려운길을 택했는가!!!

그래도 말로 잘 풀어서 나인패치로 했을 때의 좋은점을 설명하고 나인패치가 적용된 이미지로 받아서 프로젝트를 적용할 수 있었다. 그리고는 그 나인패치를 사용하지 않고 pattern으로만 사용하는 개발자가 누구일지 궁금하기만 했었다.


그런데...

내가 직접적으로 하는 프로젝트가 아닌 후임이 주도적으로 하고 내가 뒤에서 봐줘야 하는 프로젝트..

여기에서 다른 디자이너도 오더니 이전 개발자가 pattern으로 주면 사용했었다면서 또 같은말을 했다. 정말 답답한 마음으로 설명해줄 때... 나인패치를 사용하지 않는 개발자가 누군지 알게 되었고 왜 그렇게 하는지 물어보았을때 대답은 간단했다. 그 개발자는 pattern으로 배경 적용하고 모서리 라운딩을 코드로 처리하는게 편하다고... 

사실 개발자가 자기가 편한 방법으로 개발하면 머 틀리진 않는다. 하지만 개인적인 생각은 편하게 그리고 잘 사용하라고 만들어둔 것은 잘 활용하자는게 내 생각이다. 

나인패치로 이미지를 적용하면 정말 버튼과 같은 부분에 size만 정하고 배경에 해당 이미지만 적용하면 끝난다. 코드??? 몇줄 안되고 재활용도 잘 된다. 다른곳에서 size만 다른 버튼에 똑같은 이미지를 가져다 써도 문제가 되지 않으니까...

하지만 pattern으로 배경처리하고 code로 모서리 round처리했을때... pattern적용할 resource를 따로 만들고 round 버튼을 만들 custom layout을 만들어야 한다. 다른 방법이 있다면 shape resource를 만들어 줘야 한다는거.

음.. 과연 어떤 방법이 편할까..

개인적인 개발자 스타일이라고 생각을 해도 이건 정말 이해하기 힘들다. 그래서 두가지 방법으로 했을 때 Activity의 onCreate에서 화면이 다 만들어지는 시간을 보기로 했다... 화면이 다 만들어지는데 얼마나 시간이 걸리는지를 보고 싶어서

나인패치를 적용한 버튼이 6개 있는 화면이 만들어지는데 걸리는 시간.

07-23 15:45:21.968: D/Load Time(18945): Time NinePatch = 9

07-23 15:45:23.088: D/Load Time(18945): Time NinePatch = 9

07-23 15:45:24.013: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:24.948: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:25.928: D/Load Time(18945): Time NinePatch = 8

07-23 15:45:26.883: D/Load Time(18945): Time NinePatch = 8

07-23 15:45:27.758: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:28.588: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:29.458: D/Load Time(18945): Time NinePatch = 5

07-23 15:45:30.708: D/Load Time(18945): Time NinePatch = 9


화면은 똑같고 pattern을 이용하여 custom button을 만들었을 때..
07-23 15:47:20.543: D/Load Time(18945): Time Pattern = 10
07-23 15:47:21.523: D/Load Time(18945): Time Pattern = 13
07-23 15:47:22.378: D/Load Time(18945): Time Pattern = 9
07-23 15:47:23.248: D/Load Time(18945): Time Pattern = 15
07-23 15:47:24.018: D/Load Time(18945): Time Pattern = 13
07-23 15:47:24.803: D/Load Time(18945): Time Pattern = 8
07-23 15:47:25.708: D/Load Time(18945): Time Pattern = 7
07-23 15:47:26.563: D/Load Time(18945): Time Pattern = 8
07-23 15:47:27.548: D/Load Time(18945): Time Pattern = 7
07-23 15:47:28.423: D/Load Time(18945): Time Pattern = 11

이런 결과가 무슨 비교 대상이 될지는 모르겠다. 하지만 약간의 차이라도 속도 차이도 있고, 편의성도 상당한 차이가 있다. 편의성이라고 해봐야 코드의 양이다. 코드가 많다고 좋은 개발자라고 생각하지 않는다. 요즘은 10줄자리 코드가 한두줄로도 끝날 수 있도록 잘 만들어진 api들이 많기도 하니까. 
그냥 개인 특성이라고 생각하고 싶지만, 그래도 이해하기가 정말 힘들다. 물론 나인패치를 몰라서 사용하진 않았을 거라고 생각하진 않는다. 그래.. 그냥 개인 개발 특성이라고 생각하자...

하지만!!!
나인패치!!! 사용하면 정말 편하고 좋다!!! 처음에 점찍는거 어려울지 몰라도 익숙해지면 정말 편하다!!!
그러니 좀 쉽게쉽게 가자~~~

+ Recent posts