All Articles

[Review] 2월의 성장기

여유롭게 지나갈 줄 알았지만 폭풍같았던 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가지 이다.

  1. 문장을 짧고 간결하게 쓰는 연습

    → 평소에 글을 잘 적지 않다보니, 문장이 너무 장황해지는 경향이 있다. 짧으면서도 핵심있게 내용을 전달하는 문장을 쓰고 싶다.

  2. 각기 다른 성격의 글쓰기 연습

    → 개인 위키 성격의 TIL 페이지와 기술/이슈/삶에 대한 회고성글을 적는 블로그 2가지를 각각 운영 해보려한다. 각 목적에 맞는 문장과 구성을 연구해보려한다.

  3. Pass 사용 안하기

    → 글쓰기 습관을 확실히 다지겠다는 의지를 보이기 위해 이번에는 Pass 를 안써보려한다.

아! 그리고 글또 4기는 안드로이드 개발자분들이 이전 기수보다 많이 참여하신 것으로 보이는데, 배워갈 수 있는 기회가 더 늘게되어 기쁘다. 🥰