[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ][React] Custom Component

JiEunยท2023๋…„ 4์›” 18์ผ
0
post-thumbnail

โœ”๏ธ ์‹œ์ž‘

CSS๋ฅผ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ, ๊ตฌ์กฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ Styled component๊ฐ€
๋“ฑ์žฅํ•˜๊ธฐ ์ „ ์–ด๋–ค ๊ฒƒ์„ ๋‹ค๋ค„ ์ž‘์—…ํ–ˆ๋Š”์ง€ ํ•™์Šตํ–ˆ๋‹ค.


๐Ÿ“ ๋ฐฐ์šด ๊ฒƒ

Component Driven Development(CDD)

  • ๋ถ€ํ’ˆ ๋‹จ์œ„๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” UI์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ

CDD๋ฅผ ํ™œ์šฉํ•œ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•์€ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋งŒ๋“ค์–ด ํŽ˜์ด์ง€๋ฅผ ์กฐ๋ฆฝํ•˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹์ธ ์ƒํ–ฅ์‹ ๊ฐœ๋ฐœ๊ณผ ๊ฐ€๊น๋‹ค.

๊ตฌ์กฐํ™”๋œ CSS๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋œ ์ด์œ 

  • ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋‚˜ ๋ณต์žก๋„๊ฐ€ ์ ์  ์ปค์ง€๊ณ  ํ•จ๊ป˜ ์ž‘์—…ํ•ด์•ผํ•˜๋Š” ํŒ€์›๋“ค๋„ ๋งŽ์•„์ง์— ๋”ฐ๋ผ
    CSS๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ผ๊ด€๋œ ํŒจํ„ด์ด ์—†๋‹ค๋Š” ๊ฒƒ (์ผ๊ด€๋œ ํŒจํ„ด์ด ์—†์Œ)
  • ๋ชจ๋ฐ”์ผ์ด๋‚˜ ํƒœ๋ธ”๋ฆฟ ๋“ฑ ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค๋“ค์˜ ๋“ฑ์žฅ (๋ณต์žก๋„ ์ฆ๊ฐ€)

CSS ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ์œ„ํ•ด ๊ตฌ์กฐํ™”๋œ CSS์˜ ํ•„์š”์„ฑ์ด ๋Œ€๋‘ ๋˜์—ˆ๋‹ค.

CSS ์ „์ฒ˜๋ฆฌ๊ธฐ(CSS Preprocessor)์˜ ๋“ฑ์žฅ

  • CSS๊ฐ€ ๊ตฌ์กฐ์กฑ์œผ๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋„์›€์„ ์ฃผ๋Š” ๋„๊ตฌ
  • CSS์˜ ๋ฌธ์ œ์ ๋“ค์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋ณ€(๋ณ€์ˆ˜, ํ•จ์ˆ˜, ์ƒ์† ๋“ฑ)์„ ํ™œ์šฉํ•ด ํ•ด๊ฒฐ
  • CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์— ๋งž๋Š” Comiler๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” CSS๋ฌธ์„œ๋กœ ๋ณ€ํ™˜ ๋œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด CSSํŒŒ์ผ๋“ค์„ ๊ตฌ์กฐํ™” ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ์ตœ์†Œํ•œ CSS ํŒŒ์ผ์„ ๋ช‡ ๊ฐœ์˜ ์ž‘์€ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ๊ฒผ๋‹ค.

โœ”๏ธ SASS(Syntactically Awesome Style Sheets)

  • CSS๋ฅผ ํ™•์žฅํ•ด ์ฃผ๋Š” ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด
  • CSS๋ฅผ JavaScript ์ฒ˜๋Ÿผ ํŠน์ • ์†์„ฑ(color, margin ๋“ฑ)์˜ ๊ฐ’(#fff, 25rem ๋“ฑ)์„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด ํ•„์š”ํ•œ ๊ณณ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์˜ ์„ ์–ธ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

SCSS ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ ์ „์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ์ปดํŒŒ์ผ ํ›„ ์ „์—ญ CSS ๋ฒˆ๋“ค ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ์—ญํ• ์„ ํ•œ๋‹ค.

/*
* ๋ฐ˜๋ณต๋˜๋Š” CSS์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
* ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” $๊ธฐํ˜ธ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
*/
$base-color: #fff;

.alert { 
	border: 1px solid $border-dark
}
.button { 
	color: $border-dark
}

โ—๏ธ์ปดํŒŒ์ผ๋œ CSS์˜ ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€

  • ์ „์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ์ž‘์—…์„ ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ์Šคํƒ€์ผ์ด ๊ฒน์น˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํžˆ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์— ์˜์ง€ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

CSS ๋ฐฉ๋ฒ•๋ก ์˜ ๋Œ€๋‘

  • CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ๋ฌธ์ œ๋ฅผ ๋ณธ์™„ํ•˜๊ธฐ ์œ„ํ•ด BEM, OOCSS, SMACSS ๊ฐ™์€ CSS ๋ฐฉ๋ฒ•๋ก ์ด ๋Œ€๋‘ ๋˜์—ˆ๋‹ค.

CSS ๋ฐฉ๋ฒ•๋ก  ์ง€ํ–ฅ์ 

  • ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ
  • ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ™”(์‰ฌ์šด ์œ ์ง€๋ณด์ˆ˜)
  • ์ฝ”๋“œ์˜ ํ™•์žฅ์„ฑ
  • ์ฝ”๋“œ์˜ ์˜ˆ์ธก์„ฑ(ํด๋ž˜์Šค๋ช…์œผ๋กœ ์˜๋ฏธ ์˜ˆ์ธก ๊ฐ€๋Šฅ)

์—ฌ๋Ÿฌ ํŒ€์›์ด ํ•จ๊ป˜ ์ž‘์—…ํ•˜๋Š” ์ƒํ™ฉ์ผ ๋•Œ CSS ์ž‘์„ฑ ๋ฐฉ๋ฒ•์„ ๊ทœ์น™์œผ๋กœ ์ •ํ•ด๋‘๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ์ด๋‹ค.

โœ”๏ธ BEM

  • Block, Element, Modifier๋กœ ๊ตฌ๋ถ„ํ•ด ํด๋ž˜์Šค๋ช…์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Block, Element, Modifierd์€ ๊ฐ๊ฐ -์™€ __๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.
  • ํด๋ž˜์Šค๋ช…์€ BEM ๋ฐฉ์‹์˜ ์ด๋ฆ„์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • HTML/CSS/SASS ํŒŒ์ผ์—์„œ๋„ ๋” ์ผ๊ด€๋œ ์ฝ”๋”ฉ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
.header__navigation--navi-text{
	color: red;
}
/*
* header => Block
* navigation => Element
* navi-text => Modifier
*/
  • Block: ์ „์ฒด๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋ธ”๋Ÿญ ์š”์†Œ โžก๏ธ header
  • Element: ๋ธ”๋Ÿญ์ด ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํ•œ ์กฐ๊ฐ โžก๏ธ navigation
  • Modifier: ๋ธ”๋Ÿญ ๋˜๋Š” ์š”์†Œ์˜ ์†์„ฑ โžก๏ธ navi-text
    (๋ธ”๋ก์ด๋‚˜ ์—˜๋ฆฌ๋จผํŠธ์˜ ์™ธ๊ด€์ด๋‚˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ถ€๋ถ„)

โ—๏ธ ๋ฌธ์ œ์ 

  • ํด๋ž˜์Šค๋ช… ์„ ํƒ์ž๊ฐ€ ์žฅํ™ฉํ•ด์ง„๋‹ค.
  • ๊ธด ํด๋ž˜์Šค๋ช… ๋•Œ๋ฌธ์— ๋งˆํฌ์—…์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์•„์กŒ๋‹ค.
  • ์žฌ์‚ฌ์šฉ ํ•  ๋•Œ ๋งˆ๋‹ค ๋ชจ๋“  UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ™•์žฅํ•ด์•ผ ํ–ˆ๋‹ค.
  • ์บก์Šํ™” ๊ฐœ๋…์ด ์—†์—ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋“ค์ด ์œ ์ผํ•œ ํด๋ž˜์Šค๋ช…์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์— ์˜์กดํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค.

โœ”๏ธ CSS-in-JS์˜ ๋“ฑ์žฅ(Styled Component)

  • ๊ธฐ๋Šฅ์ (Function), ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ ๋ถ€ํ„ฐ UI๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์ˆœํ•œ ํŒจํ„ด์„ ์ œ๊ณต
import styled from "styled-components";

const input = styled.input`
	width: 100px;
	margin: 1rm;
`
export default function Form(){
	return(
    	<>
        	<Input />
        </>
    )
}

CSS ๋ฐฉ๋ฒ•๋ก ๋“ค์˜ ํŠน์ง•, ์žฅ๋‹จ์ 

ํŠน์ง•์žฅ์ ๋‹จ์ 
CSS๊ธฐ๋ณธ์ ์ธ ์Šคํƒ€์ผ ๋ฐฉ์‹-์ผ๊ด€๋œ ํŒจํ„ด ๊ฐ–๊ธฐ ์–ด๋ ค์›€, !important ๋‚จ์šฉ
SASS์ปดํŒŒ์ผ๋œ CSS๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ์ƒ์† ๊ฐœ๋…์„ ํ™œ์šฉํ•ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ๊ตฌ์กฐํ™”์ „์ฒ˜๋ฆฌ ๊ณผ์ • ํ•„์š”, ๋””๋ฒ„๊น… ์–ด๋ ค์›€, ์ปดํŒŒ์ผํ•œ CSSํŒŒ์ผ ๊ฑฐ๋Œ€ํ•ด์ง
BEMํด๋ž˜์Šค๋ช… ์ž‘์„ฑ์— ์ผ๊ด€๋œ ํŒจํ„ด์„ ๊ฐ–๋Š”๋„ค์ด๋ฐ์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ, ์ „์ฒ˜๋ฆฌ ๊ณผ์ • X์„ ํƒ์ž ์ด๋ฆ„ ์žฅํ™ฉ, ํด๋ž˜์Šค ๋ชฉ๋ก ๋งŽ์•„์ง
Styled Component์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ CSS์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌCSS๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์œผ๋กœ ์บก์Šํ™”, ๋„ค์ด๋ฐ/์ตœ์ ํ™” ์‹ ๊ฒฝ X๋น ๋ฅธ ํŽ˜์ด์ง€ ๋กœ๋“œ ๋ถˆ๋ฆฌ

โœ๏ธ ๋งˆ์น˜๋ฉฐ

CSS๋ฅผ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ, ๊ตฌ์กฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ Styled component๊ฐ€
๋“ฑ์žฅํ•˜๊ธฐ ์ „ ์–ด๋–ค ๊ฒƒ์„ ๋‹ค๋ค„ ์ž‘์—…ํ–ˆ๋Š”์ง€ ํ•™์Šตํ–ˆ๋‹ค.

JavaScript, React๋งŒ ์‹ ๊ฒฝ ์“ฐ๋‹ค ์Šคํƒ€์ผ์  ๋ถ€๋ถ„์ธ CSS์— ๋Œ€ํ•œ ์‹ ๊ฒฝ์€ ์“ฐ์ง€ ์•Š์•˜๋˜๊ฑฐ ๊ฐ™๋‹ค.
์ด๋ฒˆ ํ•™์Šต์„ ํ†ตํ•ด CSS์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ๊ณผ ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ธฐ๋Šฅ ๋“ค์ด ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๊ณ 
ํ˜„์žฌ๋Š” ์–ด๋–ค ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์ถ”์„ธ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ฒŒ์‹œ๋ฌผ ๋‚ด์šฉ์ด ๊ธธ์–ด์ ธ ๋‚˜๋ˆ ์„œ ์—…๋กœ๋“œ ์˜ˆ์ •

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

0๊ฐœ์˜ ๋Œ“๊ธ€