์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ ๊ธ ๋ค์ค ํ๋ฉด ๊ด๋ฆฌ๋ฅผ ์ํ ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API ์กฐ์ ์์ง์ ์ดํด๋ณด์ธ์. ์ฌ๋ฌ ๋์คํ๋ ์ด์์ ๋งค๋ ฅ์ ์ด๊ณ ๋๊ธฐํ๋ ๊ฒฝํ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์.
ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API ์กฐ์ ์์ง: ๋ค์ค ํ๋ฉด ๊ด๋ฆฌ
์ค๋๋ ๊ณผ ๊ฐ์ด ์ํธ ์ฐ๊ฒฐ๋ ์ธ์์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ด์ ๋จ์ผ ํ๋ฉด์ ๊ตญํ๋์ง ์์ต๋๋ค. ์ธํฐ๋ํฐ๋ธ ๋์งํธ ์ฌ์ด๋์ง๋ถํฐ ํ์ ํ์์ค, ๋ชฐ์ ํ ๊ฒ์ด๋ฐ ๊ฒฝํ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ค ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์๊ฐ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API๋ ๊ฐ๋ฐ์์๊ฒ ์ ๊ตํ ๋ค์ค ํ๋ฉด ๊ฒฝํ์ ๋ง๋ค ์ ์๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ ์ค๊ณ๋ ์กฐ์ ์์ง์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๊ณ ์ํํ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API๋ ๋ฌด์์ธ๊ฐ?
์ฃผ๋ก Google Chrome ๋ฐ Microsoft Edge์ ๊ฐ์ Chromium ๊ธฐ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋ ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณด์กฐ ๋์คํ๋ ์ด์์ ํ๋ ์ ํ ์ด์ ์ ์์ํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. ์น ํ์ด์ง๊ฐ ํ๋ก์ ํฐ, ์ค๋งํธ TV ๋๋ ๋์ผํ ์ฅ์น๋ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ปดํจํฐ ๋ชจ๋ํฐ์ ๊ฐ์ ๋ค๋ฅธ ํ๋ฉด์ ์ฝํ ์ธ ๋ฅผ ์ ์ดํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์ด API๋ ๋ค์์ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค:
- ์ฌ์ฉ ๊ฐ๋ฅํ ๋์คํ๋ ์ด ๊ฒ์: ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์ด๊ฑฐํฉ๋๋ค.
- ํ๋ ์ ํ ์ด์ ์์ฒญ: ์ ํํ ๋์คํ๋ ์ด์์ ํ๋ ์ ํ ์ด์ ์ ์์ํฉ๋๋ค.
- ํ๋ ์ ํ ์ด์ ์ ์ด: ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด์ ๋ฉ์์ง์ ๋ช ๋ น์ ๋ณด๋ด ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋, ํ์ํ๊ฑฐ๋, ๋ค๋ฅธ ์์ ์ ์ํํฉ๋๋ค.
- ํ๋ ์ ํ ์ด์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ: ํ๋ ์ ํ ์ด์ ์ฐ๊ฒฐ, ์ฐ๊ฒฐ ํด์ ๋ฐ ์ค๋ฅ์ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
ํ๋ ์ ํ ์ด์ API๊ฐ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ณต์กํ ๋ค์ค ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌํ๋ ค๋ฉด ๋ ์ ๊ตํ ์ํคํ ์ฒ, ์ฆ ์กฐ์ ์์ง(Coordination Engine)์ด ํ์ํฉ๋๋ค.
์กฐ์ ์์ง์ ํ์์ฑ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ ๊ฐ์ ํ๋ฉด, ์ฆ ๋ฐํ์์ฉ ๋ฉ์ธ ๋์คํ๋ ์ด, ์ฒญ์ค ์์ฒญ์ฉ ๋ ๋ฒ์งธ ๋์คํ๋ ์ด, ๋ํํ ํฌํ์ฉ ์ธ ๋ฒ์งธ ๋์คํ๋ ์ด์ ๊ฑธ์ณ ํ๋ ์ ํ ์ด์ ์ ์ ์ดํ๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ค์ ์กฐ์ ๋ฉ์ปค๋์ฆ์ด ์๋ค๋ฉด ์ด๋ฌํ ํ๋ฉด ์ ๋ฐ์ ๊ฑธ์ณ ์ฝํ ์ธ ์ ๋๊ธฐํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋งค์ฐ ์ด๋ ค์์ง๋๋ค. ๊ฒฌ๊ณ ํ ์กฐ์ ์์ง์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ณผ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค:
- ์ํ ๊ด๋ฆฌ: ๋ชจ๋ ๋์คํ๋ ์ด์์ ์ผ๊ด๋ ์ํ๋ฅผ ์ ์งํ์ฌ ๊ฐ ํ๋ฉด์ด ์ ์์ ์ฌ๋ฐ๋ฅธ ์ ๋ณด๋ฅผ ๋ฐ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ฉ์์ง ๋ผ์ฐํ : ์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด ๊ฐ์ ๋ฉ์์ง๋ฅผ ํจ์จ์ ์ผ๋ก ๋ผ์ฐํ ํ๊ณ ๋ค์ํ ๋ฉ์์ง ์ ํ๊ณผ ์ฐ์ ์์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋๊ธฐํ: ๋ชจ๋ ๋์คํ๋ ์ด์์ ์ฝํ ์ธ ์ ๋ฐ์ดํธ์ ์์ ์ด ๋๊ธฐํ๋๋๋ก ๋ณด์ฅํ์ฌ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๊ณ ๋ถ์ผ์น๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ค๋ฅ์ ์ฐ๊ฒฐ ํด์ ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ๋์ฒด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ฉฐ, ์ฌ์ฉ์์๊ฒ ํ๋ ์ ํ ์ด์ ์ํ๋ฅผ ์๋ฆฝ๋๋ค.
- ํ์ฅ์ฑ: ์ฑ๋ฅ ์ ํ ์์ด ์ฆ๊ฐํ๋ ๋์คํ๋ ์ด ๋ฐ ์ฌ์ฉ์ ์๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํฉ๋๋ค.
- ๋ชจ๋์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํํ๊ณ ์ ๊ตฌ์ฑํ์ฌ ์ ์ง๋ณด์, ์ ๋ฐ์ดํธ ๋ฐ ํ์ฅ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API ์กฐ์ ์์ง์ ์ฃผ์ ๊ตฌ์ฑ ์์
์ ์ค๊ณ๋ ์กฐ์ ์์ง์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ง๋๋ค:
1. ๋์คํ๋ ์ด ๊ด๋ฆฌ์
๋์คํ๋ ์ด ๊ด๋ฆฌ์๋ ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด๋ฅผ ๊ฒ์, ์ฐ๊ฒฐ ๋ฐ ๊ด๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค. ํ๋ ์ ํ ์ด์ API๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ๋์คํ๋ ์ด๋ฅผ ์ด๊ฑฐํ๊ณ ์ฐ๊ฒฐ์ ์ค์ ํฉ๋๋ค. ์ฑ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋์คํ๋ ์ด ๊ฒ์:
navigator.presentation.getAvailability()
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด๋ฅผ ๊ฐ์งํฉ๋๋ค. - ํ๋ ์ ํ
์ด์
์์ฒญ:
navigator.presentation.requestPresent()
๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์ ํ ์ด์ ์ธ์ ์ ์์ฒญํฉ๋๋ค. - ์ฐ๊ฒฐ ๊ด๋ฆฌ:
connect
,disconnect
,terminate
์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๊ฐ ๋์คํ๋ ์ด์ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. - ์ค๋ฅ ์ฒ๋ฆฌ: ๋์คํ๋ ์ด ์ฐ๊ฒฐ ๋ฐ ํต์ ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค.
์์ (๊ฐ๋ ์ ):
class DisplayManager {
constructor() {
this.displays = [];
this.availability = navigator.presentation.getAvailability();
this.availability.onchange = this.updateAvailability.bind(this);
}
async requestPresentation() {
try {
const connection = await navigator.presentation.requestPresent(['presentation.html']);
this.displays.push(connection);
connection.onmessage = this.handleMessage.bind(this);
connection.onclose = this.handleDisconnect.bind(this);
} catch (error) {
console.error('Presentation request failed:', error);
}
}
updateAvailability(event) {
console.log('Presentation availability changed:', event.value);
}
handleMessage(event) {
// Handle messages from the presentation display
console.log('Received message:', event.data);
}
handleDisconnect(event) {
// Handle display disconnection
console.log('Display disconnected:', event);
}
}
2. ๋ฉ์์ง ๋ผ์ฐํฐ
๋ฉ์์ง ๋ผ์ฐํฐ๋ ์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ผ์ฐํ ํ๋ ์ญํ ์ ํฉ๋๋ค. ํต์ ์ ์ํ ์ค์ ํ๋ธ ์ญํ ์ ํ์ฌ ๋ฉ์์ง๊ฐ ์ฌ๋ฐ๋ฅธ ๋์์ผ๋ก ์ ๋ฌ๋๊ณ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ฉ์์ง ๋ผ์ฐํฐ์ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฉ์์ง ์ฒ๋ฆฌ: ๋ค์ํ ์์ค(์ฌ์ฉ์ ์ ๋ ฅ, API ํธ์ถ, ๋ค๋ฅธ ๋ชจ๋)๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฉ์์ง ๋ผ์ฐํ : ๊ฐ ๋ฉ์์ง์ ๋ํ ์ ์ ํ ๋์(ํน์ ๋์คํ๋ ์ด, ๋ชจ๋ ๋์คํ๋ ์ด, ๋์คํ๋ ์ด ๊ทธ๋ฃน)์ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ฉ์์ง ํฌ๋งทํ : ๋ฉ์์ง๊ฐ ์ ์ก์ ์ํด ์ฌ๋ฐ๋ฅด๊ฒ ํฌ๋งท๋์๋์ง ํ์ธํฉ๋๋ค(์: JSON ์ง๋ ฌํ).
- ๋ฉ์์ง ํ์: ๋ฉ์์ง ํ๋ฅผ ๊ด๋ฆฌํ์ฌ ํนํ ํธ๋ํฝ์ด ๋ง์ ์๋๋ฆฌ์ค์์ ์ฌ๋ฐ๋ฅธ ์์๋ก ์ ๋ฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ฐ์ ์์ ์ง์ : ๋ฉ์์ง์ ์ค์๋์ ๋ฐ๋ผ ์ฐ์ ์์๋ฅผ ์ง์ ํฉ๋๋ค(์: ์ค์ํ ์ ๋ฐ์ดํธ๋ ์ค์ํ์ง ์์ ์ ๋ฐ์ดํธ๋ณด๋ค ๋จผ์ ์ ๋ฌ๋์ด์ผ ํจ).
์์ (๊ฐ๋ ์ ):
class MessageRouter {
constructor() {
this.routes = {};
}
registerRoute(messageType, handler) {
this.routes[messageType] = handler;
}
routeMessage(message) {
const handler = this.routes[message.type];
if (handler) {
handler(message);
} else {
console.warn('No handler registered for message type:', message.type);
}
}
sendMessage(displayConnection, message) {
displayConnection.postMessage(JSON.stringify(message));
}
}
3. ์ํ ๊ด๋ฆฌ์
์ํ ๊ด๋ฆฌ์๋ ๋ชจ๋ ๋์คํ๋ ์ด์์ ์ผ๊ด๋ ์ํ๋ฅผ ์ ์งํ๋ ์ญํ ์ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ์ ๋จ์ผ ์ง์ค ๊ณต๊ธ์(single source of truth) ์ญํ ์ ํ๋ฉฐ ๋ชจ๋ ๋์คํ๋ ์ด๊ฐ ํ์ฌ ์ํ์ ๋๊ธฐํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ํ ๊ด๋ฆฌ์์ ์ฃผ์ ์ฑ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ํ ์ ์ฅ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ค์ ์์น์ ์ ์ฅํฉ๋๋ค(์: ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด, Redux ์คํ ์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค).
- ์ํ ์ ๋ฐ์ดํธ: ๋ค์ํ ์์ค(์ฌ์ฉ์ ์ ๋ ฅ, API ํธ์ถ, ๋ค๋ฅธ ๋ชจ๋)๋ก๋ถํฐ์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ํ ๋๊ธฐํ: ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋์คํ๋ ์ด์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ธ๋ก๋์บ์คํธํ์ฌ ๋ชจ๋ ์ต์ ์ํ์ ๋๊ธฐํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ: ๋คํธ์ํฌ ์ค๋ฅ๋ ์ฐ๊ฒฐ ํด์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ชจ๋ ๋์คํ๋ ์ด์์ ๋ฐ์ดํฐ๊ฐ ์ผ๊ด๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ: ์ํ ๋ณ๊ฒฝ์ ์ถ์ ํ๊ณ ํ์ํ ๋๋ง ํจ์จ์ ์ผ๋ก ๋์คํ๋ ์ด๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ๊ตฌํํฉ๋๋ค.
์์ (๊ฐ๋ ์ - ๊ฐ๋จํ ๊ฐ์ฒด ์ฌ์ฉ):
class StateManager {
constructor() {
this.state = {};
this.listeners = [];
}
subscribe(listener) {
this.listeners.push(listener);
return () => {
this.listeners = this.listeners.filter(l => l !== listener);
};
}
getState() {
return this.state;
}
setState(newState) {
this.state = { ...this.state, ...newState };
this.listeners.forEach(listener => listener(this.state));
}
}
4. ์ฝํ ์ธ ๋ ๋๋ฌ
์ฝํ ์ธ ๋ ๋๋ฌ๋ ๊ฐ ํ๋ฉด์ ํ์๋๋ ์ฝํ ์ธ ๋ฅผ ์์ฑํ๋ ์ญํ ์ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ์ ํฉํ HTML, CSS ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ฝํ ์ธ ๋ ๋๋ฌ์ ์ฃผ์ ์ฑ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ ํ๋ฆฟ ๊ด๋ฆฌ: ๋ค์ํ ์ ํ์ ์ฝํ ์ธ (์: ์ฌ๋ผ์ด๋, ์ฐจํธ, ๋น๋์ค)์ ๋ํ ํ ํ๋ฆฟ์ ๊ด๋ฆฌํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์์ ํ ํ๋ฆฟ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํฉ๋๋ค.
- ์ฝํ ์ธ ์์ฑ: ๊ฐ ํ๋ฉด์ ๋ํ ์ต์ข HTML, CSS ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
- ์ต์ ํ: ์ฝํ ์ธ ์ ์ฑ๋ฅ์ ์ต์ ํํ์ฌ ๊ฐ ๋์คํ๋ ์ด์์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๋ ๋๋ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ ์์ฑ: ํ๋ฉด ํฌ๊ธฐ, ํด์๋ ๋ฐ ๋์คํ๋ ์ด ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ฝํ ์ธ ๋ ๋๋ง์ ์กฐ์ ํฉ๋๋ค.
์์ (๊ฐ๋ ์ - ๊ฐ๋จํ ํ ํ๋ฆฟ ์์ง ์ฌ์ฉ):
class ContentRenderer {
constructor() {
this.templates = {};
}
registerTemplate(templateName, templateFunction) {
this.templates[templateName] = templateFunction;
}
render(templateName, data) {
const template = this.templates[templateName];
if (template) {
return template(data);
} else {
console.warn('No template registered for:', templateName);
return '';
}
}
}
// Example template function
const slideTemplate = (data) => `
`;
5. ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ
์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ ๊ฒฌ๊ณ ํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํ ์ค์ํ ๊ตฌ์ฑ ์์์ ๋๋ค. ํ๋ ์ ํ ์ด์ ์ค์ ๋ฐ์ํ๋ ๋คํธ์ํฌ ์ค๋ฅ, ๋์คํ๋ ์ด ์ฐ๊ฒฐ ํด์ ๋๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ์ ๊ฐ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ์ ์ฃผ์ ์ฑ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ค๋ฅ ๊ฐ์ง: ๋ค์ํ ์์ค(๋์คํ๋ ์ด ๊ด๋ฆฌ์, ๋ฉ์์ง ๋ผ์ฐํฐ, ์ํ ๊ด๋ฆฌ์, ์ฝํ ์ธ ๋ ๋๋ฌ)์์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
- ์ค๋ฅ ๋ก๊น : ๋๋ฒ๊น ๋ฐ ๋ถ์์ ์ํด ์ค๋ฅ๋ฅผ ๋ก๊น ํฉ๋๋ค.
- ์ฌ์ฉ์ ์๋ฆผ: ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ์์๊ฒ ์ค๋ฅ๋ฅผ ์๋ฆฝ๋๋ค.
- ๋์ฒด ๋ฉ์ปค๋์ฆ: ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค(์: ๊ธฐ๋ณธ ํ๋ฉด ํ์, ๋์คํ๋ ์ด์ ์ฌ์ฐ๊ฒฐ ์๋).
- ๋ณด๊ณ : ์ฌ์ฉ์๊ฐ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ ์ ์๋ ์ต์ ์ ์ ๊ณตํ์ฌ ๋ ๋น ๋ฅธ ๋ฌธ์ ํด๊ฒฐ๊ณผ ํ๋ซํผ ๊ฐ์ ์ ์ด์งํฉ๋๋ค.
์์ (๊ฐ๋ ์ ):
class ErrorHandler {
constructor() {
this.errorListeners = [];
}
subscribe(listener) {
this.errorListeners.push(listener);
return () => {
this.errorListeners = this.errorListeners.filter(l => l !== listener);
};
}
handleError(error, context) {
console.error('Error:', error, 'Context:', context);
this.errorListeners.forEach(listener => listener(error, context));
}
}
๊ตฌํ ์ ๊ณ ๋ ค ์ฌํญ
ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API ์กฐ์ ์์ง์ ๊ตฌํํ ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ๊ธฐ์ ์คํ: ๋ค์ค ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉํ ๊ธฐ์ ์คํ์ ์ ํํ์ญ์์ค. React, Angular, Vue.js์ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค.
- ํต์ ํ๋กํ ์ฝ: ์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ธฐ ์ํ ํต์ ํ๋กํ ์ฝ์ ์ ํํ์ญ์์ค. ์น์์ผ์ ์ง์์ ์ธ ์๋ฐฉํฅ ํต์ ์ฑ๋์ ์ ๊ณตํฉ๋๋ค.
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ํ ๊ด๋ฆฌ์ ๋๊ธฐํ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด Redux๋ Vuex์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ณด์: ํ๋ ์ ํ ์ด์ ์ ๋ํ ๋ฌด๋จ ์ ๊ทผ ๋ฐ ์กฐ์์ผ๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํ ๋ณด์ ์กฐ์น๋ฅผ ๊ตฌํํ์ญ์์ค. HTTPS๋ฅผ ์ฌ์ฉํ๊ณ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ ๊ตฌํ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ฑ๋ฅ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ต์ ํํ์ฌ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๊ณ ํ๋ฉด ๊ฐ์ ์ํํ ์ ํ์ ๋ณด์ฅํ์ญ์์ค. ์บ์ฑ, ์ฝ๋ ๋ถํ , ์ด๋ฏธ์ง ์ต์ ํ์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ญ์์ค.
- ์ฌ์ฉ์ ๊ฒฝํ: ์ฌ์ฉ์๊ฐ ํ๋ ์ ํ ์ด์ ์ ์ฝ๊ฒ ์ ์ดํ๊ณ ์ฝํ ์ธ ์ ์ํธ ์์ฉํ ์ ์๋ ์ฌ์ฉ์ ์นํ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ์ญ์์ค.
- ์ ๊ทผ์ฑ: ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ ํ๋ ์ ํ ์ด์ ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ญ์์ค. ARIA ์์ฑ์ ์ฌ์ฉํ๊ณ ์ด๋ฏธ์ง์ ๋์ฒด ํ ์คํธ๋ฅผ ์ ๊ณตํ์ญ์์ค.
์ฌ์ฉ ์ฌ๋ก ์์
ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API ์กฐ์ ์์ง์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค:
- ์ธํฐ๋ํฐ๋ธ ๋์งํธ ์ฌ์ด๋์ง: ์ฌ์ฉ์ ์ํธ ์์ฉ ๋ฐ ํ๊ฒฝ ์กฐ๊ฑด์ ๋ฐ์ํ๋ ์ญ๋์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ๋์งํธ ์ฌ์ด๋์ง ๋์คํ๋ ์ด๋ฅผ ๋ง๋ญ๋๋ค. ๊ณตํญ์ด๋ ์ผํ๋ชฐ์ ์ธํฐ๋ํฐ๋ธ ์ง๋, ๋๋ ๊ณ ๊ฐ ์ธ๊ตฌ ํต๊ณ์ ๋ฐ๋ผ ์ฝํ ์ธ ๋ฅผ ๋ณ๊ฒฝํ๋ ์๋งค์ ์ ํ์ด ๋์คํ๋ ์ด ๋ฑ์ด ์์ ๋๋ค.
- ํ์ ํ์์ค: ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ณต์ ๋์คํ๋ ์ด์์ ์ฝํ ์ธ ๋ฅผ ๊ณต์ ํ๊ณ ์ ์ดํ ์ ์๋๋ก ํ์ฌ ํ์์ค์์ ์ํํ ํ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ค๋ฅธ ์์น(์: ๋์ฟ, ๋ฐ๋, ๋ด์)์ ์ฐธ๊ฐ์๋ค์ด ์ค์๊ฐ์ผ๋ก ๋์ผํ ์ฝํ ์ธ ๋ฅผ ๋ฐํํ๊ณ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
- ๋ชฐ์ ํ ๊ฒ์ด๋ฐ ๊ฒฝํ: ์ฌ๋ฌ ํ๋ฉด์ ๊ฑธ์ณ ๋ชฐ์ ํ ๊ฒ์ด๋ฐ ๊ฒฝํ์ ๋ง๋ค์ด ๋ ๋์ ์์ผ์ ๋ ๋งค๋ ฅ์ ์ธ ๊ฒ์ ํ๋ ์ด ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ์ด์ฑ ๊ฒ์์ ์ธ ๊ฐ์ ํ๋ฉด์ ํ์ฉํ์ฌ ๊ฐ์ธ๋ ๋ฏํ ์กฐ์ข ์ ๋ทฐ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
- ๊ต์ก์ฉ ์ ํ๋ฆฌ์ผ์ด์ : ์ฌ๋ฌ ํ๋ฉด์ ์ฌ์ฉํ์ฌ ํ์ต์ ํฅ์์ํค๋ ์ธํฐ๋ํฐ๋ธ ๊ต์ก์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํฉ๋๋ค. ๊ฐ์ ํด๋ถ ํ๋ก๊ทธ๋จ์ ํ ํ๋ฉด์ ํด๋ถํ์ ๋ชจ๋ธ์ ํ์ํ๊ณ ๋ค๋ฅธ ํ๋ฉด์ ์์ธ ์ ๋ณด๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- ๊ด์ ์ค ๋ฐ ๋ชจ๋ํฐ๋ง ์์คํ : ๊ด์ ์ค์ ์ฌ๋ฌ ํ๋ฉด์ ์ค์ํ ์ ๋ณด๋ฅผ ํ์ํ๋ ๋์๋ณด๋ ๋ฐ ๋ชจ๋ํฐ๋ง ์์คํ ์ ๋ง๋ค์ด ์ด์์๊ฐ ์ํฉ์ ์ ์ํ๊ฒ ํ๊ฐํ๊ณ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ค์๊ฐ ์๋์ง ์ฌ์ฉ๋, ๋คํธ์ํฌ ์ํ ๋ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋์คํ๋ ์ด๊ฐ ์๋ ์ ๋ ฅ๋ง ๊ด์ ์ผํฐ๊ฐ ์์ต๋๋ค.
๊ฐ๋จํ ์์ ๋ง๋ค๊ธฐ: ๋ค์ค ํ๋ฉด ์ฌ๋ผ์ด๋์ผ
๋ค์์ ํ๋ ์ ํ ์ด์ API์ ๊ธฐ๋ณธ์ ์ธ ์กฐ์ ์์ง์ ์ฌ์ฉํ์ฌ ๋ค์ค ํ๋ฉด ์ฌ๋ผ์ด๋์ผ๋ฅผ ๋ง๋๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๋ ๊ฐ๋จํ ์์ ๋๋ค:
1. ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ (์ ์ด ์ฑ): ```javascript // main.js const displayManager = new DisplayManager(); const messageRouter = new MessageRouter(); const stateManager = new StateManager(); // Register message routes messageRouter.registerRoute('nextSlide', () => { const currentSlide = stateManager.getState().currentSlide; stateManager.setState({ currentSlide: currentSlide + 1 }); }); messageRouter.registerRoute('previousSlide', () => { const currentSlide = stateManager.getState().currentSlide; stateManager.setState({ currentSlide: currentSlide - 1 }); }); // Subscribe to state changes stateManager.subscribe((state) => { displayManager.displays.forEach(display => { messageRouter.sendMessage(display, { type: 'updateSlide', slideIndex: state.currentSlide }); }); }); // Initialize displayManager.requestPresentation(); stateManager.setState({ currentSlide: 0 }); ``` 2. ํ๋ ์ ํ ์ด์ ๋์คํ๋ ์ด (presentation.html): ```html- ์ ์ด ์ ํ๋ฆฌ์ผ์ด์
์
main.js
ํ์ผ์ ๋์คํ๋ ์ด ์ฐ๊ฒฐ, ๋ฉ์์ง ๋ผ์ฐํ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. presentation.html
ํ์ผ์ ๋ณด์กฐ ํ๋ฉด์ ํ์๋๋ฉฐ ์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก๋ถํฐ ์ฌ๋ผ์ด๋ ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ๋ผ๋ ๋ฉ์์ง๋ฅผ ์์ ๋๊ธฐํฉ๋๋ค.DisplayManager
,MessageRouter
,StateManager
ํด๋์ค(์ด์ ์์ ์์ ์ ์๋จ)๋ ๋ค์ค ํ๋ฉด ๊ฒฝํ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ฒฐ๋ก
ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API๋ ๊ฐ๋ฐ์๊ฐ ๋งค๋ ฅ์ ์ด๊ณ ์ํธ์์ฉ์ ์ธ ๋ค์ค ํ๋ฉด ๊ฒฝํ์ ๋ง๋ค ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ ์ค๊ณ๋ ์กฐ์ ์์ง์ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ค์ค ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ํํ ๋๊ธฐํ, ์์ ์ ์ธ ํต์ ๋ฐ ๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์น ๊ธฐ์ ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ค์ค ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์๋ ๊ณ์ ์ฆ๊ฐํ ๊ฒ์ด๋ฉฐ, ์ด๋ ํ๋ก ํธ์๋ ํ๋ ์ ํ ์ด์ API์ ์กฐ์ ์์ง์ ํ๋ ์น ๊ฐ๋ฐ์ ํ์ ๋๊ตฌ๋ก ๋ง๋ค ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๊ฐ๋ ์ ์ดํดํ๋ฉด ๊ฐ๋ฐ์๋ ๋ค์ํ ์ฐ์ ์ ์ํ ํ์ ์ ์ธ ์๋ฃจ์ ์ ๊ตฌ์ถํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ ํ๋ถํ๊ณ ์ํธ์์ฉ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.