클린 코드
January 10, 2024
- 하단 토스 컨퍼런스 내용
clean code
- 개발할 때 병목이 되고 유지보수가 오래걸리며, 기능 추가가 불가능하거나, 성능이 안좋을 수 있는 코드는 다음과 같다.
- 흐름 파악이 어렵고
- 도메인 맥락 표현이 안되어
- 동료에게 물어봐야 알 수 있는 코드
- 읽기 좋은 깔끔한 코드는 코드 리뷰의 시간을 단축하며, 버그가 났을 때 디버깅 시간도 단축시킨다.
- 클린코드의 의의=유지보수(코드파악, 디버깅, 리뷰) 시간(시간=자원=돈)의 단축
나쁜 코드는
- 하나의 목적인 코드가 흩뿌려져 있는 경우
- 다 떨어져 있어 나중에 기능을 추가할 때 스크롤을 위아래로 이동하며 미로찾기를 해야함
- 하나의 함수가 여러가지 일을 하고 있는 경우
- 세부 구현을 모두 읽어야 함수의 역할을 알 수 있다.
- 코드 추가 및 삭제도 시간이 걸림
- 함수의 세부 구현 단계가 제각각일 경우
큰 그림을 보며 리팩토링 하면
-
함수 세부 구현 단계 통일
-
하나의 목적인 코드는 뭉쳐두기
-
하나의 함수는 한가지만 하도록 쪼개기
⇒ 클린코드란 짧은 코드가 아닌 원하는 로직을 빠르게 찾을 수 있는 코드
원하는 로직을 빠르게 찾으려면
- 하나의 목적을 가진 코드가 흩뿌려지 있지 않을 수 있도록 응집도를 높여 뭉쳐야하고
- 함수가 여러가지 일을 할 때 단일 책임 원칙에 의거하여 쪼개줘아하며
- 함수의 세부 구현 단계가 제각각일 경우에는 추상화 단계를 조정하여 핵심 개념을 필요한 만큼만 노출해야한다.
응집도
- 같은 목적의 코드는 뭉쳐둔다.
- 커스텀훅을 통해서도 로직을 뭉칠 수 있지만
단, 커스텀 훅의 대표적인 안티패턴은
- 커스텀훅의 통해 한군데로 로직을 뭉쳤다고 해도 훅 속에 로직이 가려지기 때문에 오히려 중요한 로직 파악이 어려워질 수 있다.
- 복잡한 코드들을 하나의 hook 엔에 뭉쳐 넣는 경우
무엇을 뭉쳐야할까?
- 당장 몰라도 되는 디테일
- 숨겨두면 짧은 코드만 보고 빠르게 코드 파악이 가능해진다.
- 코드 파악에 필수적인 핵심 정보는 오히려 뭉쳐두면 답답해진다. 이를 분리하면 여러 모듈을 넘나들며 흐름을 따라가야하는 참사가 발생
- 남겨야할 핵심 데이터와 숨겨도 될 세부 구현을 나눈다.
선언적 프로그래밍
- 핵심 데이터만 전달받고 세부 구현은 뭉쳐 숨겨두는 개발 스타일로 무엇을 하는 함수인지 빠른 이해가 가능하다.
명령형(절차적) 프로그래밍은 당신이 어떤 일을 어떻게 할 것인가에 관한 것이고,선언적 프로그래밍은 당신이 무엇을 할 것인가에 관한 것으로,
선언적 방식의 접근을 위해서는 명령형 방식으로’어떻게 접근하는가’에 관한 내용이 먼저 추상화 되어있어야 한다.
단일책임
- 하나의 함수는 하나의 책임을 진다.
- 중요 포인트가 모두 담겨있지 않은 함수명은 지양해야한다.
- 한가지 일만 하는 명확한 이름의 함수
- 한가지 일만 하는 기능성 컴포넌트
- 도메인이 복잡하여 영어 이름을 길게 짓는게 오히려 복잡도를 높일 경우 한글 이름을 이용하도록 한다.
추상화
- 로직에서 핵심 개념 뽑아내기
- 컴포넌트를 추상화
- 함수 추상화
얼마나 추상화 할것인가?
- 정답은 없음 상황에 따라 추상화
- 단, 확장성 및 유연성을 고려할것
- 한 레벨의 코드 안에 추상화 수준이 섞여 있으면 전체적인 코드가 어느 수준으로 구체적으로 기술된지 파악할 수 없어 코드 파악이 어려워진다.
- 추상화 단계를 비슷하게 정리하면 코드를 파악하기에 용이하다.
⇒ 사소하지만 일관성을 깨는 코드가 쌓이면 유지보수가 힘들어진다
처음 개발시 클린했던 코드가 새로 기능 추가시 더이상 클린하지 않아질 수 있으니 개발시 주의하자.