여유롭게 지나갈 줄 알았지만 폭풍같았던 2월이었다. 바빴던 만큼 깨달은 내용이 많아 짧게 정리했다.
있어야할 곳에 있는 편안함
최근 작업을 진행하면서 예상보다 훨씬 넓은 범위의 레거시 코드를 수정하게 되었다. 다양한 역사를 지닌 레거시를 보면 볼 수록 강력하게 떠오르는 생각이 있었다.
아, 코드가 있어야할 곳에 있는 것이 이렇게 중요한거구나
좀 더 풀어서 얘기하면 미리 합의된 약속을 지키는 것이라고 볼 수 있다. 약속은 MVP 와 같은 패턴일 수도 있고, 팀내 가이드 라인 혹은 Android 세계에서 암묵적으로 지켜지고 있는 표준일 수도 있다. 중요한 것은 합의된 약속을 지키는 것이다. Next Step 에서 배운 표현을 빌리자면 클-린한 코드를 작성하는 것이 되겠다.
사실 레거시가 왜 이렇게 구현되어있는지 따지는 것은 별 이득이 없다. 그때 당시에는 그게 최선이었을지도 모른다. 하지만 레거시 중에서도 약속이 지켜진 코드는 수정이 간단했고, 약속이 깨진 코드는 어김없이 버그를 유발하거나 결과 대비 많은 시간을 요구하는 차이를 보였다.
그런데 더 중요한 문제는 약속이 깨졌다는 이유로 그 위에 새롭게 약속이 깨진 코드를 짜고 있다는 것이었다. 깨진 약속 위에 새로운 약속을 세우는 것이 당장은 어렵고, 신경쓸게 더 많기 때문이다. 일정이 임박할 수록 ‘나중에 고쳐야지’ 라는 마법의 문장을 남발하며 깨진 코드 위에 깨진 코드를 얹는 유혹에 빠진다.
그 나중은 돌아오지 않는 걸 알고 있으니… 지금부터라도 점진적으로 약속을 지키다보면 언젠가는 눈에 띄는 개선이 이루어져 있지 않을까? 🤔
로우 레벨 지식의 기계적 반응
자주 반복해서 겪는 이슈, 자주 사용되는 속성 값, 기본적인 API 사용법 등 로우한 레벨의 지식을 기계적으로 체화시켜놓으면 더 높은 레벨에 대한 고민과 설계를 할 수 있는 여유를 확보할 수 있다. 어차피 검색하면 다 나온다고 하지만 이건 굉장히 중요한 포인트라고 생각한다.
내가 하루에 쏟을 수 있는 집중력과 에너지는 명확한 한계가 있기 때문이다. 그렇다고 docs 를 전부 외우려는 것은 아니고, 반복되는 내용들은 필요할 때 빠르게 참고할 수 있도록 짧게 정리하고 있다. 👉🏻 TIL 한번 내용을 정리한 후, 여러번 참고하다보면 내 머리속에 나름의 인덱스가 생겨 나중에는 관련 토픽만 보면 자동으로 떠오르는 효과가 있었다. 😮
좀 더 개발로…
상속은 신중히 사용하자
레거시 코드를 처리할 때도 가장 골치가 아픈 케이스는 상속과 엮인 것이다. 바뀐 스펙에 대한 도메인이 상위 클래스에 엮여있다? 그런데 그 클래스가 BaseActivity 이다? 상속받는 클래스를 찍어보니 100개를 우습게 넘어간다. 사이드 이펙트를 예측할 수 없으니 함부로 건드릴수가 없고, 간단한 스펙에도 많은 시간과 에너지가 소모된다.
이펙티브 자바에서도 지적했지만 상위 클래스는 상속받는 하위 클래스를 예측할 수 없다. 그리고 계속해서 변경사항이 생긴다. 하위 클래스는 점점 더 쌓여가는데 호환성때문에 변경은 점점더 악순환에 빠지게 된다.
상속이 필요한 순간이 분명히 있다. 사용할 때는 꼭 신중히 상위 클래스의 코드를 작성하고, 의도를 명확히 밝혀주는 것이 좋다.
LiveData 는 이벤트 전달로 적합하지 않다
MVVM 패턴을 적용할 경우, 대부분의 케이스는 databinding 을 이용하여 구현이 가능하다. 하지만 Dialog 를 띄운다던지, 다른 Activity 를 시작하는 등 반드시 Activity/Fragment 레벨에서 수행되어야 하는 작업들이 존재하며 이는 특정 Event 를 Activity/Fragment 가 구독하는 방식으로 풀 수 있다.
Event 를 전달하는 방식에는 RxJava, LiveData, 커스텀 Observer 구현 등 여러 옵션이 있다. LiveData 가 나온 뒤에는 주로 LiveData 를 활용하는 추세로 보인다.
문제는 LiveData 가 이름에서도 나타나듯이 데이터의 변경을 전달하는 것은 적합하나 Event 를 전달하기에는 내부 구현에 몇가지 문제점을 가지고 있다. 구글에서는 이를 보완하고자 io 앱 내에서 SingleLiveData 와 같은 구현체를 사용하고 있으나 이 역시 한계점을 가지고 있다. 자세한 내용은 다음 포스트에서 적어보려한다.
추후에는 생각이 바뀔수도 있으나 최근에 내린 결론은 LiveData 는 이벤트 전달용으로 적합하지 않다.
강제성과 습관의 형성
나는 강제성이 없으면 잘 움직이지 않는다. 그리고 무지하게 게으르다. 습관이 형성되기 위해서 최소 1년은 반복해야한다고 생각하기 때문에, 긍정적인 강제성을 부여해주는 글또를 망설임 없이 다시 신청하게 되었다.
이번 기수 목표는 3가지 이다.
-
문장을 짧고 간결하게 쓰는 연습
→ 평소에 글을 잘 적지 않다보니, 문장이 너무 장황해지는 경향이 있다. 짧으면서도 핵심있게 내용을 전달하는 문장을 쓰고 싶다.
-
각기 다른 성격의 글쓰기 연습
→ 개인 위키 성격의 TIL 페이지와 기술/이슈/삶에 대한 회고성글을 적는 블로그 2가지를 각각 운영 해보려한다. 각 목적에 맞는 문장과 구성을 연구해보려한다.
-
Pass 사용 안하기
→ 글쓰기 습관을 확실히 다지겠다는 의지를 보이기 위해 이번에는 Pass 를 안써보려한다.
아! 그리고 글또 4기는 안드로이드 개발자분들이 이전 기수보다 많이 참여하신 것으로 보이는데, 배워갈 수 있는 기회가 더 늘게되어 기쁘다. 🥰