클린 코드 책을 읽을 시간이 없는데 리팩토링 작업을 진행해야 해서, 토스 진유림님의 발표를 참고하고 정리했습니다.
실무에서 클린 코드의 의의는, 유지보수 시간(코드 파악, 디버깅, ...)의 단축이다.
따라서 진짜 클린 코드란 원하는 로직을 빠르게 찾을 수 있는 코드다.
처음 기능을 짤 때와 다르게, 기능을 추가 하는 경우 기존 로직이 더럽혀질 위험이 커진다. 처음에는 기능에 맞추어 구조를 설계하지만, 추가할 땐 기존 구조에 맞추어 기능을 구현하기 때문이다.
1. 핵심 데이터와 세부 구현을 분리한다.
2. 핵심 데이터는 밖에서 전달하고, 세부 구현은 내부적으로 뭉쳐 둔다. (커스텀 훅 등)
1. 하나의 일을 하는 뚜렷한 이름의 함수를 작성하기
2. 기능성 컴포넌트로 분리하기
// onClick 핸들러에서는 API콜만 신경쓸 수 있게 된다.
<LogClick>
<button onClick={() => {API콜}} />
<LogClick />
중요한 개념만 남기고 감추는 것
로직 또는 인터페이스가 너무 많이 노출되어 있으면, 구현의 자유도는 올라가지만 버그 위험성과 유지보수 난이도가 높아진다.
반대로 성급하게 추상화하면, 유연성이 낮아져 이후 추가 기능을 구현할 때 어려움을 겪을 수 있다.
추상화는 로직의 중복을 없애기 위해서도 사용되는데, 이 때 중복의 개념을 잘 생각해야 한다.
한 레벨의 코드 안에 여러 추상화 수준이 섞여 있으면 코드를 파악하기 어려워진다.
현재 팀에서는 '기능 구현'을 최우선으로 두고 개발하고 있어서, 요구되는 기능이 잘 동작한다면 코드의 구조적인 깔끔함은 후순위로 두고 우선 배포하는 편이다. 따라서 그동안 자잘한 기능들과 버그를 쳐내면서 코드의 이곳저곳에 침투해 새 로직을 찔러넣는 작업이 대부분이었다.
이 과정에서 때때로 로직이 꼬이면서 간단한 기능이라고 생각했던 작업이 시간을 잡아먹는 문제를 마주쳤는데, 클린 코드의 관점에서 생각해 보니 함수와 컴포넌트의 역할을 명확히 정의하지 않고 냅다 구현하려 드는 습관이 문제의 원인이었다는 생각이 든다.
내가 지금 수정하려는 로직이 기존에 어떤 역할을 수행하고 있었는지 파악한 다음 기존 구조를 해치지 않으면서 적절한 방식으로 새 기능을 집어넣어야 하는데, 이러한 큰 그림을 파악하지 않고 바로 세부 구현에 들어가 말 그대로 코드를 '찔러넣는' 작업 방식을 버려야겠다.