세상에는 css 디자인패턴들이 너무 많다.BEM
, SMACSS
, OOCSS
등등...
솔직히 뭐가 뭔지 정확히 모르겠고 css in js를 경험한 이후로는 그냥 css는 쳐다도 본적 없기 때문에 공부헤서 사용할 생각도 없다.
우선 내가 사용해 봤던 방식은 css in js 기반으로 inline 방식 (이건 진짜 쓰지 말자), 한 파일에서 맨 밑에 css in js 작성해서 사용하기, 스타일 코드 작성해서 jsx style안에 집어넣기 등등... 다양한 방식으로 작성해 왔는데
최근 프로젝트를 하면서 좋은 디자인 패턴을 배워서 정리해 보려 한다.
정확히 무슨 패턴인지는 잘 모르겠지만 CSS Moudules 패턴과 가장 비슷한것 같다.
이 방식은 css in css 방식으로 css를 모듈화 하여 클래스명에 고유한 문자열을 사용하여 유일한 클래스 명이 될 수 있도록 하는것이다.
에시를 보면 css 파일을 만들어 놓고 아래와 같이 불러오는 방식이다.
import styles from "./Button.modul.css";
fucntion Button() {
return <button className={styles.Button}></button>;
}
export default Button;
❗️ 이 방식의 장점은 스코프를 컴포넌트 별로 설정했기 때문에 클래스 이름을 고민할 필요가 없다.
대신 css 파일을 여러개 만들어야 한다는 단점이 있다.
내 프로젝트에선 styled component
를 사용하기 때문에 위 방식에서 css파일을 만드는 대신에 따로 css in js 파일을 만들어서 관리한다.
이게 무슨말이냐면
이런식으로 컴포넌트 별로 폴더를 만든뒤에 컴포넌트 작성 파일과 style을 따로 관리해서 css in js를 작성하는 방식이다.
코드를 보면
input.tsx
import * as style from "./Input.style";
const Input = () => {
return (
<style.Wrapper>
<style.Box>
css 작성하기
</style.Box>
</style.Wrapper>
);
};
export default Input;
input.style.tsx
import styled from 'styled-components';
export const Wrapper = styled.div`
height: 305px;
width: 426px;
margin-top: 55px;
display: inline-block;
position: relative;
`;
export const Box = styled.div`
height: 305px;
width: 390px;
`;
이런식으로 컴포넌트 별로 폴더를 만들어서 style코드, 컴포넌트 코드 따로 관리해서 프로젝트를 진행하고 있다.
📌 또한 scss 관련 컨벤션으로 띄어쓰기로 스타일링 요소들을 구분하여 가독성을 높이고 있다.
그리고 마지막으로 이렇게 컴포넌트별로 폴더로 나눠버리면 경로의 깊이가 깊어지는데 이를 index.tsx로 한단계 줄여줬다.
지금까지 해왔던 방식중에 이게 제일 깔끔하고 보기 좋은것 같아서 더 좋은거 찾기 전까진 이 방식 사용할 것 같다.
내가 생각하는 이 방식의 장점은
컴포넌트 별로 작성하기 때문에 이름 짓기 고민할 필요가 없다
(우리는 가장 바깥을 Wrapper로 지정하기로 맞췄고, 최대한 간결하게 Title, Box 이런식으로 이름짓기로 했다.)
협업 과정에서 상대방이 코드를 볼때 가독성이 좋다.
리팩토링할때도 편하다
단점으로는 좀 귀찮다 인데 이정도 장점이면 괜찮다고 본다.
📌 이게 무슨 패턴일까 찾아보던중 기본 css가 css in js보다 빠르다는걸 알게되었다.
css in js가 좋긴 하지만 정말 큰 프로젝트를 할때에는 css Modules 방식을 사용해 보는것도 좋을것 같다.
참고: https://velog.io/@yeyo0x0/CSS-Sass-BEM-CSS-Modules-CSS-in-JSStyled-Components