๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ—‚ WIL/๐Ÿ“ JavaScript

Polyfill์ด๋ž€?

by nalong 2024. 12. 8.

์ตœ๊ทผ์— ์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ, EyeDropper API๋ฅผ ์‚ฌ์šฉ์ด ํ•„์š”ํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ์ƒ‰์ƒ์„ ์„ ํƒํ•˜๊ณ  ๊ทธ ์ •๋ณด๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” Web API ์ด์˜€๋Š”๋ฐ,  ์•„์ง ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด๋‹น API๋ฅผ ๊ณต์‹ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ง€์› ๋ฒ”์œ„๊ฐ€ ์ œํ•œ์ ์ด๋ผ ํ”„๋กœ์ ํŠธ์— ๋ฐ”๋กœ ์ ์šฉํ•˜๋Š” ๋ฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๐Ÿฅฒ๐Ÿ’ฆ

์ด๋•Œ ํŒ€์›๋ถ„์ด EyeDropper Polyfill ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ์…จ๋Š”๋ฐ, Polyfill์ด ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  EyeDropper Polyfill์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

Polyfill์ด๋ž€?

Polyfill์€ ์‰ฝ๊ฒŒ ๋งํ•ด ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•ด ๊ทธ ๊ธฐ๋Šฅ์„ ๋Œ€์‹  ๊ตฌํ˜„ํ•ด ์ฃผ๋Š” ‘์ฝ”๋“œ’์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ES6์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋„์ž…๋œ ๋ฉ”์„œ๋“œ๋‚˜ API๋“ค์ด IE๋‚˜ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, ์ด๋•Œ ‘์ด๋ฏธ ๊ตฌํ˜• ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ž‘ํ•˜๋„๋ก’ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์žฌํ˜„ํ•ด ๋‚ด๋Š” ๊ฒƒ์ด Polyfill์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ฆ‰, ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๊ทธ ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

โœ… ์ •๋ฆฌํ•˜์ž๋ฉด

  • ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์—๋ฎฌ๋ ˆ์ด์…˜ ํ•œ๋‹ค.
  • ์ตœ์‹  ์‚ฌ์–‘์„ ์˜ค๋ž˜๋œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์ค€๋‹ค.

EyeDropper Polyfill ์ฝ”๋“œ ๊ตฌํ˜„ ๋ฐฉ์‹ ์‚ดํŽด๋ณด๊ธฐ

eyedropper-polyfill๋Š” EyeDropper API๋ฅผ ์ •์‹ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ผํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด 1. ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ EyeDropper API ์ง€์› ์—ฌ๋ถ€๋ฅผ ์ ๊ฒ€ํ•œ ๋’ค, ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ 2. Polyfill์„ ๋™์ ์œผ๋กœ ์ฃผ์ž…ํ•˜๋Š” ๋กœ์ง์ด๋‹ค.

import { isEyeDropperSupported } from './support';
import { attachPolyfill } from './attach';

if (!isEyeDropperSupported()) {
  attachPolyfill();
}

1. isEyeDropperSupported() ํ•จ์ˆ˜ ํ˜ธ์ถœ
์ด ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €)์—์„œ EyeDropper API๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํŒ๋ณ„ํ•œ๋‹ค.

export function isEyeDropperSupported(): boolean {
  return 'EyeDropper' in window;
}

if (! isEyeDropperSupported()) {... }์„ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ EyeDropper๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ attachPolyfill(); ์ด ์‹คํ–‰๋œ๋‹ค.

 

2. attachPolyfill ํ•จ์ˆ˜ ํ˜ธ์ถœ

import { EyeDropperPolyfill } from './eyedropper';

export function attachPolyfill() {
  if (!Reflect.defineProperty(window, 'EyeDropper', { value: EyeDropperPolyfill })) {
    throw Error("Error attaching `EyeDropper` polyfill: couldn't attach `EyeDropper` to `window`");
  }
}
  • EyeDropperPolyfill ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” EyeDropper API๋ฅผ ํ‰๋‚ด ๋‚ด์–ด ๊ตฌํ˜„ํ•œ ํด๋ฆฌํ•„์ด๋‹ค
  • Reflect.defineProperty ์‚ฌ์šฉ
    • Reflect.defineProperty๋Š” Object.defineProperty์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ, writable, enumerable, configurable ๋“ฑ์˜ ํŠน์„ฑ์„ ์กฐ๊ธˆ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ๋ฅผ ํ•˜์ž๋ฉด

  • ์šฐ์„  ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ EyeDropper API๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. (์ง€์›ํ•œ๋‹ค๋ฉด,  ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ API๋ฅผ ์‚ฌ์šฉ!)
  • ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด attachPolyfill()์„ ํ†ตํ•ด EyeDropper ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ธฐ์กด ์ฝ”๋“œ์—์„œ EyeDropper API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ฌธ์ œ์—†์ด ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

๐Ÿค”  Polyfill์— ๋Œ€ํ•ด ์•Œ์•„๊ฐ€๋‹ค ๋ณด๋ฉด “์ง€์›ํ•˜์ง€ ์•Š๋Š” API๋Š” ๊ทธ๋ƒฅ ๋ชจ๋‘ ํด๋ฆฌํ•„๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?”๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค๊ธฐ๊ฐ€ ์‰ฌ์šด ๊ฒƒ ๊ฐ™๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํด๋ฆฌํ•„์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์™œ๋ƒ๋ฉด ํด๋ฆฌํ•„๋„ ๊ฒฐ๊ตญ JS ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ตญ ๋กœ๋”ฉํ•ด์•ผ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์–‘์ด ๋Š˜์–ด๋‚˜๊ณ , ์‹คํ–‰ํ•ด์•ผ ํ•  ์ฝ”๋“œ๋„ ๋งŽ์•„์ง€๊ณ  ๊ฒฐ๊ตญ ์•ฑ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ฆฌํ•„์€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์—๋งŒ, ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๋ณ๊ฒŒ ์ ์šฉํ•˜๋„๋ก ํ•˜์ž. 

 

https://developer.mozilla.org/ko/docs/Glossary/Polyfill

https://toss.tech/article/smart-polyfills