Today's AntipatternAll Posts
ν…Œλ§ˆ
GitHubToday's AntipatternAll Posts

μ•ˆν‹°νŒ¨ν„΄μ„ 톡해 더 λ‚˜μ€ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 방법을 λ°°μ›Œλ³΄μ„Έμš”. κ°œλ°œμžλ“€μ΄ μ‹€μˆ˜ν•˜λŠ” νŒ¨ν„΄λ“€μ„ λΆ„μ„ν•˜κ³  κ°œμ„ λ°©μ•ˆμ„ μ œμ‹œν•©λ‹ˆλ‹€.

μ—°κ²°ν•˜κΈ°

Β© 2025 Smelly.dev All rights reserved.

August 15, 2025

πŸ‘» 보이지 μ•ŠλŠ” μ„±λŠ₯ ν•˜λ½: CSS `will-change` 였용과 λ ˆμ΄μ–΄ 폭탄

CSS
μ„±λŠ₯
μ• λ‹ˆλ©”μ΄μ…˜/UI
μ›Ήν‘œμ€€
λ Œλ”λ§μ „λž΅

Summary

will-changeλ₯Ό λ‚¨μš©ν•˜λ©΄ λΆˆν•„μš”ν•œ λ ˆμ΄μ–΄κ°€ κ³Όλ„ν•˜κ²Œ μƒμ„±λ˜μ–΄ μ„±λŠ₯ μ €ν•˜λ₯Ό μœ λ°œν•©λ‹ˆλ‹€. ν•„μš”ν•œ μ†μ„±μ—λ§Œ μ œν•œμ μœΌλ‘œ μ‚¬μš©ν•˜κ³ , μ• λ‹ˆλ©”μ΄μ…˜ μ’…λ£Œ ν›„μ—λŠ” μ΄ˆκΈ°ν™”ν•˜μ—¬ λ¦¬μ†ŒμŠ€λ₯Ό νšŒμˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Why Wrong?

will-changeλŠ” λΈŒλΌμš°μ €μ—κ²Œ νŠΉμ • 속성이 변경될 μ˜ˆμ •μž„μ„ 미리 μ•Œλ € μ΅œμ ν™”λ₯Ό μœ λ„ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, λ„ˆλ¬΄ λ§Žμ€ μš”μ†Œμ— λ‚¨μš©ν•˜κ±°λ‚˜ λͺ¨λ“  속성에 μ μš©ν•˜λ©΄(예: will-change: all;) λΈŒλΌμš°μ €κ°€ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  λ ˆμ΄μ–΄λ₯Ό μƒμ„±ν•˜κ²Œ λ©λ‹ˆλ‹€. μ΄λŠ” 였히렀 μ„±λŠ₯을 μ €ν•˜μ‹œν‚€κ³ , 초기 λ Œλ”λ§ μ‹œκ°„μ„ 늘리며, 심지어 ν¬λž˜μ‹œλ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, will-changeλŠ” 예츑 κ°€λŠ₯ν•œ μ„±λŠ₯ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜μ–΄μ•Ό ν•˜λ©°, λ§‰μ—°ν•œ μ„±λŠ₯ ν–₯상을 κΈ°λŒ€ν•˜λ©° μ‚¬μš©ν•˜λŠ” 것은 μ§€μ–‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

How to Fix?

will-changeλŠ” ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ œν•œμ μœΌλ‘œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 변경될 κ°€λŠ₯성이 높은 속성을 λͺ…ν™•νžˆ μ§€μ •ν•˜κ³ , ν•΄λ‹Ή μš”μ†Œκ°€ μ‹€μ œλ‘œ μ• λ‹ˆλ©”μ΄μ…˜μ΄λ‚˜ νŠΈλžœμ§€μ…˜μ΄ μ‹œμž‘λ˜κΈ° 직전에 will-changeλ₯Ό μ μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ• λ‹ˆλ©”μ΄μ…˜μ΄ λλ‚œ ν›„μ—λŠ” will-changeλ₯Ό μ œκ±°ν•˜κ±°λ‚˜ will-change: initial;둜 μ΄ˆκΈ°ν™”ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ ν• λ‹Ήλœ λ¦¬μ†ŒμŠ€λ₯Ό νšŒμˆ˜ν•˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ, 개발자 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ λ ˆμ΄μ–΄ 생성 ν˜„ν™©μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , λΆˆν•„μš”ν•œ λ ˆμ΄μ–΄ 생성을 μ€„μ΄λŠ” 방법을 μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€. transformκ³Ό opacityλŠ” λ ˆμ΄μ–΄λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  μ• λ‹ˆλ©”μ΄μ…˜μ„ μ²˜λ¦¬ν•  수 μžˆλŠ” λŒ€ν‘œμ μΈ μ†μ„±μ΄λ―€λ‘œ 적극적으둜 ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Before Code (Bad)

/* κ³Όλ„ν•œ will-change μ‚¬μš© (μ•ˆν‹°νŒ¨ν„΄) */
.element {
  will-change: all;
  transition: transform 0.3s ease-in-out;
}

.another-element {
  will-change: transform, opacity, top, left, width, height; /* λ„ˆλ¬΄ λ§Žμ€ 속성 μ§€μ • */
}

After Code (Good)

/* μ˜¬λ°”λ₯Έ will-change μ‚¬μš© */
.element {
  transition: transform 0.3s ease-in-out;
}

.element:hover {
  will-change: transform; /* ν˜Έλ²„ μ‹œμ μ— will-change 적용 */
  transform: scale(1.1);
}

/* μ• λ‹ˆλ©”μ΄μ…˜ μ’…λ£Œ ν›„ will-change μ΄ˆκΈ°ν™” (JavaScript) */
const element = document.querySelector('.element');

element.addEventListener('transitionend', () => {
  element.style.willChange = 'initial';
});

You Might Also Like

`will-change` μ†μ„±μ˜ 곡식적인 μ •μ˜μ™€ μ‚¬μš©λ²•μ„ μ΄ν•΄ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.
https://developer.mozilla.org/ko/docs/Web/CSS/will-change
`contain` 속성은 λ ˆμ΄μ•„μ›ƒ, μŠ€νƒ€μΌ, 페인트 격리λ₯Ό μ œκ³΅ν•˜μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ”λ°, `will-change`와 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ λ ˆμ΄μ–΄ 생성을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή λ¬Έμ„œμ—μ„œ `contain` μ†μ„±μ˜ μžμ„Έν•œ λ‚΄μš©κ³Ό μ‚¬μš©λ²•μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
https://developer.mozilla.org/ko/docs/Web/CSS/contain