๋๋ง์ ๊ตฌ๋ ์ ์ ์ฉ ์ฝํ ์ธ ๋ธ๋ก๊ทธ ๋ง๋ค๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ, ๊ตฌ๊ธ ์ฑ์ค ์คํฌ๋ฆฝํธ, ๊ตฌ๊ธ์ํธ๋ฅผ ํ์ฉํด ๋น์ฉ 0์์ผ๋ก ๊ตฌ๋ ์ ์ ์ฉ ์ฝํ ์ธ ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํ์ต๋๋ค.
๋ธ๋ก๊ทธ๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด ์ ๋ง ๊ณต๋ค์ฌ ์์ฑํ ์์ง์ ์ ๋ณด๋ฅผ ์ค์ง ๋ด ์์คํ '๊ตฌ๋ ์'๋ถ๋ค์๊ฒ๋ง ํน๋ณํ๊ฒ ์ ๊ณตํ๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ ๋ฌธ์ ์ธ ์๋ฒ ์ง์์ด ์๊ฑฐ๋, ์ ๋ฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ์๋ ๋ถ๋ด์ค๋ฌ์ด ๊ฒ์ด ํ์ค์ ๋๋ค.
๋ฐ์ผ๋ฆฌํ๋ธ์์๋ ์ด๋ฌํ ๊ณ ๋ฏผ์ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ(JavaScript), ๊ตฌ๊ธ ์ฑ์ค ์คํฌ๋ฆฝํธ(Google Apps Script, GAS), ๊ทธ๋ฆฌ๊ณ ๊ตฌ๊ธ ์ํธ(Google Sheets)๋ฅผ ์กฐํฉํ ์ฝํ ์ธ ์ ๊ธ ๋ฐฉ๋ฒ์ ์ ์ฉํด ๋ดค์ต๋๋ค. ๋น์ฉ์ 0์, ๋ณด์์ ์ฒ ์ ํ๊ฒ, ๊ตฌ๋ ์ ๊ด๋ฆฌ์ ๋ถํ์ํ ๋งคํฌ๋ก ๋๊ธ ๋ถ์๊น์ง ํด๊ฒฐํด ๋ธ๋ก๊ทธ๋ฅผ ์ค๋งํธํ๊ฒ ์ ์งํ ์ ์๋ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
1. ์ '๊ตฌ๊ธ ์ํธ'๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฌ์ฉํ๋์?
์ผ๋ฐ์ ์ธ ์น ๊ฐ๋ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ค๋ฉด MySQL, MongoDB ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฅผ ๊ตฌ๋ํ ์๋ฒ๊ฐ ํ์ํฉ๋๋ค. ํ์ง๋ง ํฐ์คํ ๋ฆฌ๋ ๊ฐ์ธ ๋ธ๋ก๊ทธ๋ฅผ ์ด์ํ๋ ๋ถ๋ค์๊ฒ๋ ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ ํฐ ์ํฉ์ด ๋ ์ ์์ฃ .
- ์์ ๋ฌด๋ฃ: ๊ตฌ๊ธ ๊ณ์ ๋ง ์๋ค๋ฉด ๋ฌด์์ผ๋ก ๊ฐ๋ ฅํ ํด๋ผ์ฐ๋ ์ ์ฅ์๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
- ์ง๊ด์ ์ธ UI: ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์์ด๋์ง ์์ ์ฒ๋ผ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ณ ์ง์ ์์ ํ ์ ์์ต๋๋ค.
- ์๋ฒ๋ฆฌ์ค ์ธํ๋ผ: Google Apps Script๊ฐ API ์๋ฒ ์ญํ ์ ๋์ ํด์ฃผ๋ฏ๋ก, ๋ณ๋์ ํธ์คํ ๋น์ฉ์ด ๋ค์ง ์์ต๋๋ค.
2. ์๋ ์ํคํ ์ฒ: 3๋จ๊ณ ๋ฐ์ดํฐ ๊ณผ์
์ฌ์ฉ์๊ฐ ๋ด ๋ธ๋ก๊ทธ์ ์ ์ํด์ ๊ตฌ๋ ์ธ์ฆ์ ์๋ฃํ๊ธฐ๊น์ง, ์์ ๊ณผ์ ์ ๋ค์์ ์ธ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
- ํ๋ก ํธ์๋ (JavaScript): ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ธ๋ก๊ทธ URL์ ์์งํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์
fetch()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๊ธ ์๋ฒ(GAS)๋ก ์์ ์ฌ๋ฆฝ๋๋ค. - ๋ฏธ๋ค์จ์ด (Google Apps Script): ๋ธ๋ผ์ฐ์ ์ ๊ตฌ๊ธ ์ํธ ์ฌ์ด์ '์ค๊ฐ ๊ด๋ฆฌ์'์ ๋๋ค. ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ํจํ์ง ๊ฒ์ฌํ๊ณ , ๋ณด์ ์ด์์ธ CORS(Cross-Origin Resource Sharing) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์ํธ์ ์์ ํ๊ฒ ์ ๋ฌํฉ๋๋ค.
- ๋ฐฑ์๋ (Google Sheets): ์ ๋ฌ๋ ๋ฐ์ดํฐ๊ฐ ์ต์ข ์ ์ผ๋ก ๊ธฐ๋ก๋๋ ์ฅ์์ ๋๋ค. ๋ฑ๋ก๋ ๊ตฌ๋ ์ ๋ฆฌ์คํธ๋ฅผ ํ์ธํ๊ฑฐ๋ ์๋ก์ด ์ ์ ๋ก๊ทธ๋ฅผ ์ ์ฅํฉ๋๋ค.
3. [1๋จ๊ณ] ๊ตฌ๊ธ ์ํธ ์ค์ ๋ฐ ์๋ฒ ์ฝ๋(GAS) ์์ฑ
๋จผ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๊ทธ๋ฆ์ ์ค๋นํด์ผ ํฉ๋๋ค.๋ฌผ๋ฐ ๊ตฌ๋ ์ ๋ฐ์ดํฐ ์ ๋๋ค.๊ตฌ๋ ์ ๋ฐ์ดํฐ๋์ด ๋งํฌ๋ฅผ ํตํด ์ฝ๊ฒ ์๋์ผ๋ก ์์งํ ์ ์์ต๋๋ค.
- ๊ตฌ๊ธ ์ํธ๋ฅผ ์์ฑํ๊ณ ์ ๋ชฉ์ ์ค์ ํฉ๋๋ค (์: ๊ตฌ๋ ์ ์ธ์ฆ ๊ด๋ฆฌ).
- ์๋จ ๋ฉ๋ด์ ํ์ฅ ํ๋ก๊ทธ๋จ Apps Script๋ฅผ ํด๋ฆญํฉ๋๋ค.
- ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ชจ๋ ์ง์ฐ๊ณ ์๋์ ์ฝ๋(1๋ฒ ์ฝ๋)๋ฅผ ๋ถ์ฌ๋ฃ์ต๋๋ค.
4. [2๋จ๊ณ] ์น ์ฑ์ผ๋ก ๋ฐฐํฌํ๊ธฐ
์๋ ์ฝ๋(1๋ฒ)๋ฅผ ์์ฑํ์ผ๋ฉด, ์ธ๋ถ(๋ธ๋ผ์ฐ์ )์์ ์ ๊ทผํ ์ ์๋๋ก URL์ ์์ฑํด์ผ ํฉ๋๋ค.
- ์คํฌ๋ฆฝํธ ํธ์ง๊ธฐ ์ฐ์ธก ์๋จ [๋ฐฐํฌ] [์ ๋ฐฐํฌ]๋ฅผ ํด๋ฆญํฉ๋๋ค.
- ์ ํ ์ ํ์์ [์น ์ฑ]์ ์ ํํฉ๋๋ค.
- ์ค์ ๊ฐ ํ์ธ:
- ๋ค์ ์ฌ์ฉ์ ๊ถํ์ผ๋ก ์คํ: ๋ (๋ณธ์ธ ๊ณ์ )
- ์ก์ธ์ค ๊ถํ์ด ์๋ ์ฌ์ฉ์: ๋ชจ๋ ์ฌ์ฉ์ (Anyone) - ์ด ์ค์ ์ 'Anyone'์ผ๋ก ํด์ผ ๋ก๊ทธ์ธํ์ง ์์ ๋ฐฉ๋ฌธ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
- ๋ฐฐํฌ ๋ฒํผ์ ๋๋ฅด๊ณ ์์ฑ๋ ์น ์ฑ URL์ ์์ ํ ๊ณณ์ ๋ณต์ฌํด ๋ก๋๋ค.
5. [3๋จ๊ณ] ๋ธ๋ก๊ทธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ์ฉ
์๋ ์ฝ๋(2๋ฒ)์ ๋ธ๋ก๊ทธ ์คํจ์ HTML์ด๋ ์ฝํ ์ธ ์์ญ์ ํ์ ์ ์ด์ ๋ฐ์ดํฐ ์ ์ก ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค.
6. ์๋ฐ์คํฌ๋ฆฝํธ๋ง ์ฌ์ฉํ๋ฉด ์ ๋ ๊น?
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ง์ ๊ตฌ๊ธ ์ํธ๋ฅผ ์์ ํ๋ ค๊ณ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋นจ๊ฐ์ ์๋ฌ๋ฅผ ๋ด๋ฑ์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ณด์(Security) ๋๋ฌธ์ ๋๋ค.
โ CORS(Cross-Origin Resource Sharing) ์ด์
๋ธ๋ผ์ฐ์ ๋ abc.com์์ ์คํ ์ค์ธ ์คํฌ๋ฆฝํธ๊ฐ ํ๋ฝ ์์ด google.com์ ๋ฐ์ดํฐ๋ฅผ ๊ฑด๋๋ฆฌ๋ ๊ฒ์ ๋ง์ต๋๋ค. ๋ง์ฝ ์ด๊ฒ์ด ํ์ฉ๋๋ค๋ฉด, ์
์ฑ ์ฌ์ดํธ๊ฐ ์ฌ๋ฌ๋ถ์ ๊ตฌ๊ธ ์ํธ ๋ฐ์ดํฐ๋ฅผ ๋ง์๋๋ก ํ์ณ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. GAS๋ ๊ตฌ๊ธ ์๋ฒ ๋ด๋ถ์์ ์๋ํ๋ฏ๋ก ์ด ์ ์ฝ์ ์ฐํํ ์ ์๋ ์์ ํ ํต๋ก๊ฐ ๋ฉ๋๋ค.
โก ์ธ์ฆ๊ณผ ๊ถํ(OAuth 2.0)
๊ตฌ๊ธ ์ํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๊ณต๊ฐ ์ํ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์ ๊ตฌ๊ธ ๊ณ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ด๋ ์๋ ์์ฃ . GAS๋ฅผ ์ฌ์ฉํ๋ฉด "๋ด ๊ณ์ ๊ถํ์ผ๋ก ์คํํ๋, ๋ฐ์ดํฐ ์ ๊ตฌ๋ง ์ธ๋ถ์ ์ด์ด๋๋ค"๋ ์์ ํ ๋ฐฉ์์ ๊ถํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.
โข ๋ฐ์ดํฐ ํฌ๋งท์ ๋ฒ์ญ
๊ตฌ๊ธ ์ํธ๋ 'ํ' ํํ์ ๋ฐ์ดํฐ์ด๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ๋ JSON ํํ๋ฅผ ์ข์ํฉ๋๋ค. GAS๋ ํ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก, ํน์ JSON์ ํ๋ก ๋ณํํด ์ฃผ๋ ํต์ญ์ฌ ์ญํ ์ ์ํํฉ๋๋ค.
7. ์์ฝ ๋ฐ ์ถ์ฒ ์ ๋ต
๋ธ๋ก๊ทธ๋ ์ฌ์ดํธ์ ํ๋ก์ ํธ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ์ต์ ํ๋ ์กฐํฉ์ ์ ํํ ์๋ ์์ต๋๋ค.
| ๋ชฉ์ | ์ถ์ฒ ์กฐํฉ | ๋์ด๋ |
|---|---|---|
| ๋จ์ ๋ฐ์ดํฐ ์ถ๋ ฅ | ์ํธ ์น ๊ฒ์ + fetch() | ํ(Low) |
| ๊ตฌ๋ ์ธ์ฆ ๋ฐ ์ ์ฅ | JS + GAS + ๊ตฌ๊ธ ์ํธ | ์ค(Mid) |
| ๋๊ท๋ชจ ์๋น์ค | JS + Firebase / Supabase | ์(High) |

๊ตฌ๊ธ ์ํธ์ GAS๋ฅผ ํ์ฉํ ์์คํ ์ ๋ธ๋ก๊ทธ ์ด์์์๊ฒ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค. ๋ณ๋์ ์๋ฒ ์ ์ง๋น ์์ด๋ ์ ๋ฌธ์ ์ธ ํ์์ ์์คํ ๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค๋ง ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ์์๋ ์ฌ๋ฌ ๋ฒ์ ์ ๋ธ๋ก๊ทธ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ์ ์ฝ์ด ์๊ธฐ๋ ํฉ๋๋ค.
๋ฐ์ผ๋ฆฌ ํ๋ธ์ ์ ์ฉํ ์ฝ๋ ์์
์๋ ์ฝ๋๋ ๋ฐ์ผ๋ฆฌํ๋ธ์์ ์ง์ ์ค๊ณ ํ ์คํธํ ๊ตฌ๋ ์ ์ ์ฉ ์ฝํ ์ธ ์ด์ ์ฌ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
[์ฝ๋1] ๊ตฌ๊ธ ์ฑ์ค ์คํฌ๋ฆฝํธ(Google Apps Script, GAS)
์๋ ์ฝ๋์์ ๊ตฌ๊ธ ์ํธ ์ฃผ์์ ๊ตฌ๋ ์ ๋ฐ์ดํฐ ์ํธ ์ด๋ฆ์ ํ๊ฒฝ์ ๋ง๊ฒ ์์ ํ์ธ์
const SPREADSHEET_ID = '๊ตฌ๊ธ์ํธ ์ฃผ์';
const SUBSCRIBERS_SHEET_NAME = '์:๋๋ฅผ๊ตฌ๋
';
function doGet(e) {
const visitorLink = (e && e.parameter && e.parameter.visitorLink) ? e.parameter.visitorLink : null;
let result = { access: false, message: '' };
try {
if (!visitorLink) {
result.message = "Error: visitorLink parameter is missing.";
} else {
const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
let subscribersSheet = spreadsheet.getSheetByName(SUBSCRIBERS_SHEET_NAME);
if (!subscribersSheet) {
subscribersSheet = spreadsheet.insertSheet(SUBSCRIBERS_SHEET_NAME);
subscribersSheet.appendRow(['๋งํฌ', '์ ์ฅ์ผ์']);
}
const lastRow = subscribersSheet.getLastRow();
const subscriberLinks = lastRow 1 ? subscribersSheet.getRange(2, 1, lastRow - 1, 1).getValues().flat() : [];
const normalizedVisitorLink = normalizeUrl(visitorLink);
const isMySubscriber = subscriberLinks.some(subLink = {
if (!subLink) return false;
return normalizedVisitorLink === normalizeUrl(subLink);
});
result.access = isMySubscriber;
result.message = isMySubscriber ? 'Access granted' : 'Access denied';
result.success = true;
}
} catch (error) {
result.access = false;
result.message = "Error: " + error.message;
}
return ContentService.createTextOutput(JSON.stringify(result))
.setMimeType(ContentService.MimeType.JSON);
}
function normalizeUrl(url) {
if (!url) return '';
let normalized = url.toLowerCase().trim();
normalized = normalized.replace(/^(https?:\/\/)?(www\.)?/, '');
if (normalized.endsWith('/')) {
normalized = normalized.slice(0, -1);
}
return normalized;
}
[์ฝ๋2] ๋ธ๋ก๊ทธ์ ์ ์ฉํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋
ํ์ฌ ๋ฐ์ผ๋ฆฌํ๋ธ ๋ธ๋ก๊ทธ์ ์ ์ฉํ ์ฝ๋์ ๋๋ค. ์์ ์ ๋ธ๋ก๊ทธ์ ์ด์ฐ๋ฆฌ๋ ํ์ ์ฐฝ CSS,์ ์๋ด ๋ฌธ๊ตฌ๋ฅผ ์ ์ฉํ๊ณ , ๊ตฌ๊ธ ์ฑ์ค ์คํฌ๋ฆฝํธ ์น ์ฃผ์๋ฅผ ๋ฃ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.
script
(function () {
document.addEventListener('DOMContentLoaded', function () {
const hasPreview = !!document.querySelector('.prime-preview');
if (!hasPreview) return;
/* ===============================
ํ์
์์ฑ
=============================== */
const popup = document.createElement('div');
popup.id = 'access-popup';
popup.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(10,10,10,0.85);
color: white;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 99999;
padding: 20px;
text-align: center;
overflow: hidden;
backdrop-filter: blur(10px);
`;
popup.innerHTML = `
div style="
background: rgba(20,20,20,0.95);
padding: 40px;
border-radius: 20px;
border: 1px solid #444;
box-shadow: 0 20px 60px rgba(0,0,0,0.9);
max-width: 420px;
width: 95%;
box-sizing: border-box;
z-index: 1;
"
h2 style="
font-size: 1.6rem;
color: #27ae60;
margin: 0 0 15px 0;
font-weight: bold;
" ๊ตฌ๋
์ ์ ์ฉ ์ฝํ
์ธ /h2
p style="
font-size: 1rem;
margin: 0 0 10px 0;
line-height: 1.6;
color: #eee;
"
์ด ์ฝํ
์ธ ๋ ๋ณดํธ๋์ด ์์ต๋๋ค.br
๊ตฌ๋
์ค์ธ ๋ธ๋ก๊ทธ URL์ ์
๋ ฅํ์ธ์.
/p
p style="
font-size: 0.85rem;
margin: 0 0 20px 0;
color: #bbb;
line-height: 1.5;
"
โป ๊ตฌ๋
์์์๋ ์ ์์ด ๋ถ๊ฐํ ๊ฒฝ์ฐ ๋๋ ๋น๊ตฌ๋
์๋,br
๋๊ธ๋ก span style="color:#ffcc00;font-weight:bold;"'์น์ธ ์์ฒญ'/span์ ๋จ๊ฒจ์ฃผ์ธ์.
/p
input
type="text"
id="visitor-url"
placeholder="https://์์ด๋.tistory.com"
style="
width: 100%;
padding: 14px;
margin-bottom: 15px;
border-radius: 8px;
border: none;
outline: none;
text-align: center;
color: #000;
font-size: 1rem;
box-sizing: border-box;
background: #fff;
"
div style="display:flex;flex-direction:column;gap:10px;"
button
id="check-access-btn"
style="
width: 100%;
padding: 14px;
font-size: 1.1rem;
cursor: pointer;
background: #087e3a;
color: white;
border: none;
border-radius: 8px;
font-weight: bold;
transition: 0.3s;
"
์ ๊ทผ ํ์ธ/button
a
href="ํ.์ด๋ํ ์ฃผ์"
style="
width: 100%;
padding: 12px;
font-size: 1rem;
cursor: pointer;
background: rgba(255,255,255,0.1);
color: white;
border: 1px solid rgba(255,255,255,0.3);
border-radius: 8px;
font-weight: bold;
text-decoration: none;
display: inline-block;
box-sizing: border-box;
transition: 0.3s;
"
ํ์ผ๋ก ์ด๋/a
/div
p
id="access-message"
style="
margin-top: 20px;
font-size: 0.95rem;
min-height: 24px;
font-weight: bold;
"
/p
/div
`;
document.body.appendChild(popup);
document.body.style.overflow = 'hidden';
/* ===============================
์ฌ์ฉ์ ํ๋ ์ ํ
=============================== */
const preventActions = (e) = {
if (e.target.id === 'visitor-url') return;
e.preventDefault();
};
document.addEventListener('contextmenu', preventActions);
document.addEventListener('selectstart', preventActions);
document.addEventListener('dragstart', preventActions);
/* ===============================
์ ๊ทผ ํ์ธ ๋ก์ง
=============================== */
const btn = document.getElementById('check-access-btn');
const input = document.getElementById('visitor-url');
const msg = document.getElementById('access-message');
btn.onclick = async () = {
const val = input.value.trim();
if (!val) {
msg.textContent = "URL์ ์
๋ ฅํด์ฃผ์ธ์.";
return;
}
btn.disabled = true;
btn.textContent = "ํ์ธ ์ค...";
try {
const url = `https://script.google.com/๊ตฌ๊ธGAS์ฃผ์๋ก ๋ณ๊ฒฝ?visitorLink=${encodeURIComponent(val)}`;
const res = await fetch(url);
const data = await res.json();
if (data.access) {
msg.textContent = " ํ์ธ๋์์ต๋๋ค!";
msg.style.color = "#00ff00";
document.removeEventListener('contextmenu', preventActions);
document.removeEventListener('selectstart', preventActions);
document.removeEventListener('dragstart', preventActions);
setTimeout(() = {
popup.remove();
document.body.style.overflow = 'auto';
}, 800);
} else {
msg.textContent = "โ ๊ตฌ๋
์ ๋ณด๊ฐ ์์ต๋๋ค.";
msg.style.color = "#ff4444";
btn.disabled = false;
btn.textContent = "์ ๊ทผ ํ์ธ";
}
} catch (e) {
msg.textContent = "โ ์ฐ๊ฒฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.";
btn.disabled = false;
btn.textContent = "์ ๊ทผ ํ์ธ";
}
};
input.onkeypress = (e) = {
if (e.key === 'Enter') btn.click();
};
});
})();
/script
[์ฝ๋ 3] ๊ตฌ๋ ์ ์ ์ฉ ๋ธ๋ก๊ทธ ๊ธ์์ฑ์ ์ ์ฉํ๋ ์ฝ๋
๊ตฌ๋ ์ฆ ์ ์ฉ ๋ธ๋ก๊ทธ ๊ธ์ ์์ฑํ ๋ ๊ธ ์๋จ ๋๋ ํ๋จ์ ์๋ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํด๋น ์ฝ๋๊ฐ ํฌํจ๋ ๊ธ๋ง ์๋์ผ๋ก ๊ฐ์งํ์ฌ ๊ตฌ๋ ์ ์ ์ฉ ์ฝํ ์ธ ๋ก ์ฒ๋ฆฌํ๊ณ ์ ๊ธ ํ์ ์ฐฝ์ ํ์ํฉ๋๋ค.
div class="prime-preview"/div