프로젝트가 어느덧 중반에 가까워져가고 있다. 초안 상태의 코드들이 어느 정도 리팩토링을 거듭하면서 개선되어가고 있다. 나는 공통 컴포넌트인 Counter를 맡아 구현을 했는데 연이은 몇 가지 문제가 발생했다.
그리고 문제 해결과정에서 코드의 가독성과 효율성을 해치는 문제가 발생했고 다른 팀원들도 같은 문제를 겪고 있음을 확인했다
이에 나는 classNames plug-in 사용을 제안했고 감사하게도 제안을 수용해주셨습니다.
이는 내가 구현한 컴포넌트가 공통 컴포넌트인 만큼 다른 개발자분들께서 사용하시기에 큰 어려움을 겪으실 것 같아 필히 개선해야했다.
이 문제를 props로 className을 받아와 컴포넌트를 구성하는 최상위 요소에 전달하는 방식으로 접근이 가능하게 해결 했다.
export default function Counter({ setParentState = null, className = null }) {
... 중 략 ...
const classNames = `${className} ${classes.counter}`;
// 외부에서 전달된 className과 컴포넌트를 스타일링하는 module.scss의 className들을 합성하는 부분이다. 이 부분이 다음 문제를 야기시킨다.
return (
<span className={classNames}>
<CountButton> ... 중 략 ... </CountButton>
<Count>{count}</Count>
<CountButton /> ... 중 략 ... <CountButton />
</CountButton>
</span>
);
}
그래서 아래 코드와 같이 태그에 className을 전달하면 스타일링이 잘 적용됨을 확인 할 수 있다.
const Home = () => {
return (
<div>
<Counter className={classes.blue} />
</div>
);
};
문제 1의 코드에서 컴포넌트 외부에서 전달된 className과 내부의 className을 한번에 적용시켜야한다. 아래와 같이 Template literal을 사용시 해결은 가능하지만 가독성과 효율성이 떨어지기 때문에 classNames라는 plug-in도입을 통해 이를 개선하고자 했다.
const classNames = `${className} ${classes.counter}`;
return (
<span className={className}>
... 생략 ...
return (
<span className={classNames(classes.counter, className)}>
... 생략 ...