August 9, 2025

๐ŸŽญ CSS ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๋‚จ์šฉ: ์Šคํƒ€์ผ ์žฌ์‚ฌ์šฉ์„ฑ ์ €ํ•˜์™€ HTML ๋น„๋Œ€ํ™”

CSS
React
์•„ํ‚คํ…์ฒ˜
์ปดํฌ๋„ŒํŠธ
๋„ค์ด๋ฐ
Lint/Formatter
์›นํ‘œ์ค€

Summary

CSS ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋‚จ์šฉํ•˜๋ฉด HTML ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์Šคํƒ€์ผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง, CSS ๋ณ€์ˆ˜ ํ™œ์šฉ, ๊ทธ๋ฆฌ๊ณ  ์ ์ ˆํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์‚ฌ์šฉ์œผ๋กœ ์Šคํƒ€์ผ์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Why Wrong?

CSS ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด HTML ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์Šคํƒ€์ผ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง€๋ฉฐ, ํ…Œ๋งˆ ๋ณ€๊ฒฝ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ tailwindcss, bootstrap๊ณผ ๊ฐ™์€ css ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ์ด HTML์— ์ง์ ‘์ ์œผ๋กœ ๊ฒฐํ•ฉ๋˜์–ด, ์Šคํƒ€์ผ ๋ณ€๊ฒฝ ์‹œ HTML์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ์Šคํƒ€์ผ ์†์„ฑ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

How to Fix?

CSS ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง ๋ฐฉ์‹์„ ๋„์ž…ํ•˜์—ฌ ์Šคํƒ€์ผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ€์ผ ์กฐํ•ฉ์€ ์ปค์Šคํ…€ CSS ํด๋ž˜์Šค๋‚˜ CSS-in-JS ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ , HTML ๊ตฌ์กฐ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ…Œ๋งˆ ๋ณ€๊ฒฝ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด CSS ๋ณ€์ˆ˜(Custom Properties)๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.tailwindcss, bootstrap๊ณผ ๊ฐ™์€ css ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ…Œ๋งˆ ์ปค์Šคํ…€ ๊ธฐ๋Šฅ์„ ์ ๊ทน ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

Before Code (Bad)

// ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ
<button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
  Submit
</button>

<div className="w-full max-w-sm bg-white rounded-lg border border-gray-200 shadow-md">
    <div className="flex justify-end px-4 pt-4">
        <button id="dropdownButton" data-dropdown-toggle="dropdown" className="inline-block text-gray-500 dark:bg-gray-800 dark:hover:bg-gray-700 dark:hover:text-white" >
            <svg className="w-5 h-5" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
                <path d="M6 10a2 2 0 11-4 0 2 2 0 014 0zM12 10a2 2 0 11-4 0 2 2 0 014 0zM16 12a2 2 0 100-4 2 2 0 000 4z"/>
            </svg>
        </button>
    </div>
    <div className="flex flex-col items-center pb-10">
        <img className="mb-3 w-24 h-24 rounded-full shadow-lg" src="/docs/images/people/profile-picture-3.jpg" alt="Bonnie image"/>
        <h5 className="mb-1 text-xl font-medium text-gray-900 dark:text-white">Bonnie Green</h5>
        <span className="text-sm text-gray-500 dark:text-gray-400">Visual Designer</span>
        <div className="flex mt-4 space-x-3 md:mt-6">
            <a href="#" className="inline-flex items-center py-2 px-4 text-sm font-medium text-center text-white bg-blue-700 rounded-lg hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">Add friend</a>
            <a href="#" className="inline-flex items-center py-2 px-4 text-sm font-medium text-center text-gray-900 bg-white rounded-lg border border-gray-300 hover:bg-gray-100 focus:ring-4 focus:outline-none focus:ring-gray-200 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:bg-gray-700 dark:hover:border-gray-700 dark:focus:ring-gray-700">Message</a>
        </div>
    </div>
</div>

After Code (Good)

// ์ˆ˜์ •๋œ ์ฝ”๋“œ (CSS Modules ์‚ฌ์šฉ)
import styles from './Button.module.css';

<button className={styles.primaryButton}>Submit</button>

// Button.module.css
.primaryButton {
  background-color: #3490dc;
  color: white;
  font-weight: bold;
  padding: 0.5rem 1rem;
  border-radius: 0.25rem;
}

.primaryButton:hover {
  background-color: #2779bd;
}

//์ˆ˜์ •๋œ ์ฝ”๋“œ (tailwindcss์˜ @apply ์‚ฌ์šฉ)
<button className="custom-button">Submit</button>

<style>
.custom-button {
  @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded;
}
</style>


//์ˆ˜์ •๋œ ์ฝ”๋“œ (์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง)
import styled from 'styled-components';

const StyledButton = styled.button`
  background-color: #3490dc;
  color: white;
  font-weight: bold;
  padding: 0.5rem 1rem;
  border-radius: 0.25rem;

  &:hover {
    background-color: #2779bd;
  }
`;

<StyledButton>Submit</StyledButton>