
리팩토링! 어머 들었어? 우리 동네(코드) 재개발 들어간대!!
안녕하세요! 크몽 안드로이드 개발자 Vigli(비글리) 입니다. 오늘은 우리 동네(코드) 재개발 들어간대!! 라는 글을 들고왔습니다. 여러분은 재개발하면 무엇이 떠오르나요? 노후화된 것을 튼튼하고 안전하게 새롭게 바꾼다. 침체한 상태를 활성화 시키기 위한 활동이다. 이렇게 볼 수 있을 것같아요. 이번 글은 코드에 대한 재개발, 바로 리팩토링에 관한 내용이에요. 특히 페이지의 구조를 변경하는 리팩토링을 어떻게 시작하고 어떻게 진행할지를 공유해보고자 제 리팩토링 경험담을 얘기해보려합니다. 제목을 보고 들어오신 분들은 3가지로 구분할 수 있을 것같아요. 내 코드를 리팩토링을 해야 할까? 고민 중이신분 리팩토링 해야겠다고 결심하신분 리팩토링을 해보신분 즉, 리팩토링에 관심이 많은 분이실 거라생각됩니다. 여기에 기능을추가하라고? 내용은 이렇게진행돼요! 인박스 페이지의 리팩토링 과정을설명 이 작업에서 궁금했을 것 같은 부분을Q&A 그럼 본론에 들어가기 전에 아래 항목을 꼭참고해주세요! 리팩토링에 대한 개념과 이론은 따로 설명하진않아요. 이 글의 목적은 페이지(Activity, Fragment) 구조를 변경할 때 어떻게 진행할지 감을 주기 위한글이에요. 바이블이 아닌 참고로 받아주시길바라요. 오늘의 리팩토링 대상 — 인박스페이지 왜 리팩토링을했을까? 페이지를 구성하는 모델들의 커플링(Coupling)이 높아 수정이어렵다. 대부분 코드의 새로운 구조로 변경되었고, 인박스 페이지는 (구)구조이었다. 그래서 코드 파악이힘들다. 페이지의 UI와 기능이 변경될예정이다. 너란 코드, 더는 두고 보지않겠다! 결국 이 작업은 언젠가는 필요했고, 지금 제가 정말 하고 싶었고, 동료인 카일(Kyle), 인트(Int) 도 정말 기분 좋게 Okay! 해주셨기에 이 작업을 할 수 있었어요. 이 기회를 빌려 힘찬 응원과 날카로운 코드 리뷰를 해주신 두 분께 정말감사드립니다. *리팩토링에 대한 설명으로 아래 구조는 많은 조미료가 뿌려져 있으며, 상세하게 그리지않았습니다. 사이 좋게 단합된 모습을 보여주는구조 처음 모습입니다. 아주 사이 좋게 오밀조밀 모여있어요. 최종 목적은 결합도를 줄이고, MVP 구조로 변경할 예정입니다. 현재 Presenter가 없고 ViewModel이 있는 이유는, 기존 구조가 MVVM 구조이었기때문이에요 [분리 과정 1] Adapter와 ViewModel를 분리 Adapter Library를 제거하며 Adapter를 분리하는 것부터 시작했습니다. Adapter를 분리하는 작업이 다른 클래스와 비교하여 가장 간단했고, Adapter 관계를 줄이는 게 다른 나머지의 결합도를 줄이기 위한 발판이 될 수 있었기때문이죠. [분리 과정 2] Activity와 ItemView분리 Activity와 ItemView를 분리했습니다. 두 클래스는 과정 1과 연결된 부분이어서 둘에 분리를 먼저 정했어요. 그리고 Activity와 ItemView 사이에는 리스너(빨간 화살표)가 연결되어 있습니다. 이 리스너로 ItemView의 액션을 Activity가 알 수 있게됩니다. [분리 과정 3] ItemView와 ViewModel 분리 분리 과정 2로 ItemView의 액션을 Activity가 알 수 있게 되었죠. 그 덕분에 ViewModel은 ItemView와 직접적인 연결을 쉽게 해제할 수 있게됐습니다. [분리 과정 4] ViewModel 의 분리와변신 이제 MVP의 VP 구조를 만들기 위해 InboxContract 라는 인터페이스를 생성하여 Activity와 ViewModel을 분리합니다. 그리고 ViewModel의 특성을 제거하여 Inbox의 Presenter로 탈바꿈합니다. [분리 과정 5]Presenter 역할분리 마지막으로, 많은 역할을 담당했던 Presenter에서 네트워크 모델을 분리하여, 최종적인 모습이었던 MVP 구조로변경합니다! 제 리팩토링 진행 과정이 머릿속에 잘그려지셨나요? 실제 구조는 위의 설명보다 세분되어있지만, 이 글의 목적인 규모가 큰 리팩토링을 할 때 어디서 시작하고 어떻게 생각하고 진행하는지 설명하기 위해 간략하게그렸어요. Q1. 어떤 것을 리팩토링할까요? A. 먼저, 중복된 코드부터 리팩토링 하세요. 그리고, 중복된 코드를 리팩토링 하며 단련된 스킬로 필요한 부분 (구조 개선 / 라이브러리 제거 기타 등등)으로 넓혀가보세요. Q2. 잘 동작하는데, 지금 리팩토링을 하는 게맞을까요? A. 상황에 따라 달라요. 과연 리팩토링이 가장 우선순위가 높은 작업일까?라고 확인해야 해요. 리팩토링은 필수는 아니라고 생각해요. 그 말은 잘 동작하는 코드라면 지금 꼭 리팩토링을 해야하는가? 라고 생각할 수 있을 것 같아요. 즉, 앱에 이보다 더 필요한 작업이 무엇이 있을까? 라는 의문과 함께 꼭 필요한 작업들의 우선순위를 매겨보는 거죠. 그 후에 리팩토링 우선순위를 확인하면좋겠어요. Q3. 리팩토링을 하고 싶은데, 동료는반대해요. A. 타당한 자료로 이견을 조율하세요. 내가 생각지 못한 부분을 알게 될 수 있고, 반대로 동료가 생각지 못한 부분을 알 수있으니까요. Q4. 리팩토링을 언제시작할까요? A. 마음과 열정이 솟구친다면 언제든 바로 시작하세요. 리팩토링은 기존 코드에 대한 이해도를 높이고, 코드 리뷰 스킬을 높여줍니다. 그리고 리팩토링하며 관련된 개발 실력도 늘어나겠죠! 단, 목표 설정(목적, 마감 일자, 리팩토링 범위)은필수에요! Q5. 리팩토링을 할 때 주의할 점은 무엇이있을까요? A. 기능과 UI 에 변화가 없어야 해요. 물론 버그도 없어야 하고요. 리팩토링을 하기 전, 모든 기능을 체크리스트로 만들어보세요. 개발명세서가 있다면 체크리스트를 만드는 것이 훨씬 수월하겠죠? 그리고 테스팅으로 리팩토링 전과 후를 비교하며 진행한다면, 더 안전하게 진행할 수 있을 거에요. 전 (Foo)Rft.kt 라는 리팩토링 결과 클래스를 만들어서, 원본 클래스의 시작부터 끝까지 시나리오대로 기능을 옮기는 방법을 주로 합니다. 단, 모든 작업을 이렇게 하지는 않아요, 이 방법이 맞지 않는 작업도있거든요! Q6. 리팩토링 할 대상이 너무 커요! 어떻게 나누면좋을까요? A. 분리 기준을 정해서 리팩토링 하세요. 무엇을 리팩토링을 하느냐에 따라 분리 기준이 달라지겠지만, 클래스 파일별, 기능별, 데이터별 등 대상에게 맞는 분리 기준을 정해서 작업을 해야 해요. 가장 중요한 건, 리팩토링을 마무리하지 못한다면, 작업물이 쓰이질 않거나, 구 코드와 신 코드가 섞여 더 힘들어질 수 있으니, 리팩토링 대상을 명확히 정해서 목표를 잡는것이에요! 정체된 제 연봉 인상도 리팩토링 돼서 활성화되기를 소망하며 이만마칩니다. 긴 글 읽어주셔서감사합니다! 전문가가 필요한 순간? 대한민국 No.1 프리랜서 마켓, 크몽 https://kmong.com/ Android Developer 리팩토링! 어머 들었어? 우리 동네(코드) 재개발 들어간대!! was originally published in kmong on Medium, where people are continuing the conversation by highlighting and responding to this story.
