원티드 프리온보딩 - 클린코드2
원티드 프리온보딩 - 클린 코드 2강
다른 사람들이 생각하는 클린코드는?
- 빠르게 이해할 수 있는 코드
- 확장성
- 가독성
- 명확한 목적성과 역할
- 기능에 충실한 코드
일관성이 중요한 이유
나쁜 코드라도 일관성만 잘 지킨다면 자동화도 할 수 있기 때문에!
- 일관성이 명확하다면 편집기, 정규식 조합으로 한번에 고칠 수 있다.
- JSCodeShift 까지 활용한다면 덤
- 실무에서는 일관성이라는 규칙을 정하기 위해 논의해야한다.
- 규칙으로 정한 일관성은 어떠한 경우에도 깨지 않도록 노력해야한다.
- 일관성은 향후 문서화로 표현하고 Lint로 강제할 수 있다.
Style Guide
네이밍 컨벤션을 포함하는 규칙을 위한 가이드라인으로 하나의 팀 혹은 집단을 위해 존재
즉, 협업에 큰 도움을 주기 위함
장점
- 서로를 이해하기 위한 시간 절약
- 코드 품질
- 일관성
- 가독성 향상
- 유지보수 용이성
예시
■ 상수
- 필히 이미 선언된 상수가 있는지 확인하고 가능하면 컴포넌트 외부로 분리하여 관리
- 상수의 위치는 import 묶음 바로 밑에 위치
- 상수는 객체로 묶어서 as const와 함께 사용하는 것을 권함
1
2
const DEFAULT_TICK = 100;
const DEFAULT_DELAY = 500;
■ 컴포넌트 Props는 interface 사용
- 컴포넌트 Props Typing은 항상 컴포넌트 바로 위에 위치
- I-Prefix, T-Prefix 금지!
1
interface SomeComponentProps {}
■ 파일명과 컴포넌트명을 일치 시키기
- 컴포넌트 Props는 항상 컴포넌트 바로 위에 위치
- 모든 주석은 @(어노테이션)과 함께 작성_ https://jsdoc.app
1
const SomeComponent = ({ prop1, prop2 }: CatchComponentProps) => {};
■ 예측이 어려운 Flag는 만들지 않는 것이 좋음
꼭 필요하다면 useRef()
useState()
를 활용
■ 상태는 꼭 필요할때만 만드는 것이 좋음
- 렌더링에 영향이 없다면
useRef()
사용
1
const [state, setState] = useState("someState");
■ 렌더링 방지할 때 Fragment<></>보다는 null을 사용하기
1
2
3
4
5
6
7
8
9
// BAD!
if (isHold) {
return <></>;
}
// BEST!
if (isHold) {
return <null;
}
■ useEffect()는 Main JSX와 가장 가까운 곳에 위치
1
2
3
useEffect(() => {
// dependency arrays 관리시 감지 가능한 상태인지 필히 확인한다.
}, []);
참고하면 좋은 레퍼런스
- https://v2.ko.vuejs.org/v2/style-guide
- https://redux.js.org/style-guide
- https://github.com/airbnb/javascript
- https://airbnb.io/javascript/react/
- https://standardjs.com/
- https://tosspayments-dev.oopy.io/chapters/frontend/about
불필요한 개선보다는 필요한 일을 찾아서 하자.
인기 많은 서비스에서의 리팩토링은 정말 힘들고, 리팩토링해야하는 근거가 필요하다.
취준생인 경우에는,
점진적인 리팩토링 훈련을 해보자.
■ 예시 1
- JS만으로 컴포넌트 만들기
- Web Components로 만들기
- 만든 컴포넌트 배포 하기
- 배포한 컴포넌트 직접 가져다 쓰기
■ 예시 2
- MVC XXX앱 만들기
- Controller 제거해보기
- Proxy API 활용하기
- Virtual DOM 라이브러리 도입해보기 (Snabbdom)
- JSX Parser 구현해서 사용해보기
문제를 정의하고 달성하자.
■ 개발을 모르는 유저를 위한 기능 늘려가기
https://www.instagram.com/p/CrvUNktLDbM
■ 개발자를 위한 라이브러리 만들며 확장하기
https://github.com/sgsg9447/react-check-in-out-calendar-core
나는 어떤 마음 가짐으로 코드를 작성하는가,
- 도구에 매몰된다
- 패턴에 매몰된다
- 요구사항 분석이 아니라 패턴이나 기술부터 정하고 시작한다
- 고민할 시간에 남들을 따라한다
- 나도 모르게 클론 코딩한다
- 남이 공부한 자료를 생각 없이 따라 적용한다
■ Hype Driven Development - 설레발 주도 개발
https://lazygyu.net/blog/hype_driven_development
요구사항이나 구조 설계같은 문제 해결을 생략한다.
- 현실에서 마주한 문제를 기술적으로 잘 해결하는 훈련을 많이하는 것이 가장 중요하다.
기술을 선택하는 과정도 공부이다.
- 무조건 프로젝트를 시작했을 때, 최악의 경우 프로젝트의 요구사항이나 기획을 특정 프레임워크에 맞춰 변경해야할 수도 있다.
■ 자바스크립트 에러의 종류, 런타임 vs 컴파일의 차이는 알아야한다.
개발자가 성장하려면 학습에 막힘이 있을때 적어도 내가 뭘 모르는지는 알아야한다.
■ 보이스카웃 규칙
떠날 때, 찾을 때보다 캠프장을 더욱 깨끗이 하라.
- 레거시를 비난하고 불평할 시간에 그 코드를 개선하자.
- 잘 만드는 사람이 있고 잘 고치는 사람이 있다.
■ 기술 부채의 대물림
보이 스카우트의 규칙을 실천하고 기술 부채를 직접 끊어내자
- 최소한의 노력이나 점진적 개선이라도 해보자
■ 상속보다는 확장
Extends
수동적으로 물려받는다는 생각은 사고의 흐름을 막는다.
- 확장하면 오히려 더 많은 기능을 추가할 수 있다.
■ KISS (Keep It Simple Stupid)
단순하게 유지하고 불필요한 복잡성을 피하여 단순하게 만드는 것을 권장
- 복잡성이 더 높은 코드일수록 확장하기도 유지 보수하기도 더 어려워진다.
- 간단하고 이해하기 쉽지 않다면 빨리 쓸모없어져서 쓸모가 없게 될 수 있다.
- 사용자가 제품을 이해하지 못하면 그 제품을 사용하지 않는다.
- 바쁜 삶을 사는 경향이 있는 사용자가 복잡한 디자인을 빨리 포기한다.
■ YAGNI
초기에는 중요한 것들에만 집중하고 필요할 것이라고 예상되는 것은 절대 구현하지 말라
- 필요하다고 판단될 때까지 기능을 추가하지 말 것을 강조하는 프로그래밍 원칙
- 오버엔지니어링을 방지하고 불필요한 리소스를 절약한다
- 아직 이해하지도 못하는 것을 설계하는 것은 최악의 행동이다.
■ DRY (Don’t Repeat Yourself)
반복을 줄이고 코드베이스를 보다 관리하기 쉽고 효율적으로 만드는 데 초점
즉 같은 코드가 반복되는 것을 막으라는 뜻 ⇒
Copy
&Paste
한 곳에서만 코드를 변경한다면 참조하는 모든 곳에서는 변경사항만 관리하면 된다.유지보수와 버그가 줄어들어 리소스를 절약할 수 있다.
■ 횡단 관심사 (cross-cutting concern)
횡단 관심사는 일반적인 관심사의 분리와는 다르게 뽑아낼 수 있다.
관련 블로그 글 https://hellomooneekim.netlify.app/%ED%9A%A1%EB%8B%A8%EA%B4%80%EC%8B%AC%EC%82%AC/
■ 단일 책임 원칙
OOP에서 단일 책임 원칙이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다.
- 함수, 컴포넌트 등 수 많은 곳에 존재할 수 있는 모든 코드에서도 한번에 한가지 일만 수행하도록 할 필요가 있다.