๐Ÿ’ป๐Ÿ’€/๊ฐœ๋ฐœ

[JS] Web APIs์— ๋Œ€ํ•ด

db2 2021. 8. 28. 13:46

1. APIs๋ž€

API(Application Programming Interfaces)๋ž€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง„ ์ผ์ข…์˜ ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ๋“ค์˜ ๋ชจ์Œ, ๊ตฌ์„ฑ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. API๋Š” ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ฌธ๋ฒ•์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์›น์•ฑ์—์„œ 3D ๊ทธ๋ž˜ํ”ฝ ๊ฐœ๋ฐœ์„ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? GPU๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” C๋‚˜ C++๊ณผ ๊ฐ™์€ low-level ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Ÿฐ ๊ฒƒ๋“ค์„ ์•Œ์ง€ ๋ชปํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋‚˜ ํŒŒ์ด์ฌ๊ณผ ๊ฐ™์€ high-level ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ APIs

ํด๋ผ์ด์–ธํŠธ๋‹จ์˜ ์–ธ์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์•„์ฃผ ๋งŽ์€ APIs๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๋Š” ์–ธ์–ด ์ž์ฒด์— ๋‚ด์žฅ๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Broswer APIs
  2. Third-party APIs

Broswer APIs๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” API๋กœ, ๋ธŒ๋ผ์šฐ์ €์™€ ์ปดํ“จํ„ฐ ํ™˜๊ฒฝ์— ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ง€๊ณ  ์œ ์šฉํ•œ ์ผ๋“ค์„ ํ•ด๋‚ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Web Audio API๋Š” ํŠธ๋ž™์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ๋ณผ๋ฅจ์„ ์กฐ์ •ํ•˜๋Š” ๋“ฑ์˜ ๋ธŒ๋ผ์šฐ์ € ์˜ค๋””์˜ค๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ์ œ๊ณตํ•œ๋‹ค. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ๋Š” ๋ณต์žกํ•œ low-level ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์˜ค๋””์˜ค๋ฅผ ์กฐ์ž‘ํ•˜๊ณ  ์žˆ๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฐ ๊ณผ์ •์„ ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์ถ”์ƒํ™”๋œ API๋ฅผ ์ ์‹œ ์ ์†Œ์— ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Third-party APIs๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ์™€ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋œ API์ด๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” Youtube API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Browser APIs๊ฐ€ ํ•˜๋Š” ์ผ

๊ต‰์žฅํžˆ ๋งŽ์€ API๋“ค์ด ์žˆ์ง€๋งŒ ๊ทธ ์ค‘์—์„œ๋„ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” API๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • documents ์กฐ์ž‘
  • ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ๊ทธ๋ž˜ํ”ฝ ์กฐ์ž‘
  • ์˜ค๋””์˜ค, ๋น„๋””์˜ค ์กฐ์ž‘
  • ๊ธฐ๊ธฐ ์กฐ์ž‘
  • ํด๋ผ์ด์–ธํŠธ๋‹จ ์ €์žฅ์†Œ

documents ์กฐ์ž‘

DOM API๋Š” HTML๊ณผ CSS๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ HTML ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

XMLHttpRequest ๋‚˜ Fetch API ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›นํŽ˜์ด์ง€์˜ ์ผ๋ถ€๋ถ„๋งŒ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๊ฒŒ ๊ธฐ์กด ๋ฐ์ดํ„ฐ์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜ํ”ฝ ์กฐ์ž‘

Canvas๋‚˜ WebGL์€ HTML์˜ <canvas>์š”์†Œ์— ํ”ฝ์…€ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด 2D๋‚˜ 3D๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, Canvas API๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ๊ฐํ˜•์ด๋‚˜ ์›์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์ž…ํž ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์„ธํ”ผ์•„๋‚˜ ํ‘๋ฐฑ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ˜น์€ WebGL์„ ์‚ฌ์šฉํ•ด ํ…์Šค์ณ๋ฅผ ์ž…ํžŒ ๋ณต์žกํ•œ 3D๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋Ÿฐ ๊ทธ๋ž˜ํ”ฝ API๋“ค์€ window.requestAnimationFrame()์™€ ๊ฐ™์€ ๋ฐ˜๋ณต ์‹คํ–‰๋˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ƒ์„ฑํ•˜๋Š” API์™€ ํ•จ๊ป˜ ์“ฐ์—ฌ ๋งŒํ™”๋‚˜ ๊ฒŒ์ž„์ฒ˜๋Ÿผ ์ง€์†์ ์œผ๋กœ ์›€์ง์ด๋Š” ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

์˜ค๋””์˜ค, ๋น„๋””์˜ค ์กฐ์ž‘

HTMLMediaElement, Web Audio API, WebRTC์™€ ๊ฐ™์€ API๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด์™€ ๊ด€๋ จ๋œ ์žฌ๋ฐŒ๋Š” ์ผ๋“ค์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋””์˜ค์™€ ๋น„๋””์˜ค์˜ ์žฌ์ƒ ๋ชฉ๋ก์„ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๊ณ , ๋น„๋””์˜ค์— ์บก์…˜๊ณผ ๋ถ€์ œ์™€ ๊ฐ™์€ ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜๋„ ์žˆ๊ณ , canvas๋ฅผ ํ†ตํ•ด ์›น ์นด๋ฉ”๋ผ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋น„๋””์˜ค๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋˜ ์˜ค๋””์˜ค ํŠธ๋ž™์— ํŒจ๋‹ ๊ธฐ๋ฒ•๋“ฑ์„ ๋”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ธฐ๊ธฐ ์กฐ์ž‘

์›น์•ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๊ธฐ๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๊ทธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” API๋“ค์ด ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์‹œ์Šคํ…œ ์•Œ๋ฆผ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€๋Šฅํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” Notifications API, Vibration API๊ฐ€ ์žˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋‹จ ์ €์žฅ์†Œ

ํด๋ผ์ด์–ธํŠธ๋‹จ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์˜คํ”„๋ผ์ธ์—์„œ๋„ ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” API๋“ค์ด ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ key-value ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” Web Storage API๋ฅผ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” IndexedDB API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

3. APIs๊ฐ€ ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ

๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ APIs๋Š” object๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋กœ์จ properties์— API ์‚ฌ์šฉ์— ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ , method์— API๋ฅผ ์ž‘๋™์‹œํ‚ค๋Š” ์‹ค์ œ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

์•„๋ž˜๋Š” ํ”Œ๋ ˆ์ด ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค HTMLMediaElement API๋ฅผ ํ†ตํ•ด ์Œ์•…์„ ์žฌ์ƒํ•˜๊ณ , ๋ฉˆ์ถ”๋Š” ์ฝ”๋“œ์ด๋‹ค. <audio> ์š”์†Œ์˜ play(), pause() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

const audioElement = document.querySelector('audio');
const playBtn = document.querySelector('button');

playBtn.addEventListener('click', function() {
  // ์ค‘์ง€ ์ƒํƒœ๋ผ๋ฉด ์žฌ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค
    if (this.getAttribute('class') === 'paused') {
        audioElement.play();
        this.setAttribute('class', 'playing');
        this.textContent = 'Pause'
    // ์žฌ์ƒ ์ค‘์ด๋ผ๋ฉด ์ค‘์ง€์‹œํ‚ต๋‹ˆ๋‹ค
} else if (this.getAttribute('class') === 'playing') {
        audioElement.pause();
        this.setAttribute('class', 'paused');
        this.textContent = 'Play';
    }
});