๐ฐ๐ท ํ๊ตญ์ด | ๐บ๐ธ English
Loopback Social ๋ฐฐ๋ ๋ฆฌํฌ์งํฐ๋ฆฌ์ ๋๋ค.
Loopback Social์ ์ปค๋ฎค๋ํฐ ๊ฐ์ ์ฐ๋์ ์ฐํฉ์ ์ํ ํ๋ซํผ์ ๋๋ค.
์ด ์น์ฌ์ดํธ์์ ์ปค๋ฎค๋ํฐ ์ด์์๋ ๊ฐ ์ปค๋ฎค๋ํฐ ์๋จ์ ๋ถ์ฐฉํ ์ ์๋ ๊ฒ์์ ๋ ๋ฐฐ๋๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. ์ด ๋ฐฐ๋์๋ ์บ ํ์ธ์ ๋์ฐธํ๋ ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ์ ์ด๋ฆ์ด ํจ๊ป ํ์๋ฉ๋๋ค.
๋์จํ ์ฐ๊ฒฐ์ด์ง๋ง, ์๋ก ์ปค๋ฎค๋ํฐ๊ฐ ์ฐ๊ฒฐ๋์ด์๋ค๋ ์ ์ ์ดํํ๋ฉด์ ๋๋ก๋ ํ์ฌ ํ๋ณด ๋ฐฐ๋๋ ํ์ ์ ๋์ฐ๋ ๋ฑ ์ฌ๋ฌ ์๋จ์ ์ ๋ชฉํด๋ณธ๋ค๋ฉด ์ด๋จ๊น ํ๋ ์๊ฐ์ผ๋ก ์ด ํ๋ก์ ํธ๋ฅผ ์์ํด๋ณด์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ฅผ ํตํด ์ปค๋ฎค๋ํฐ ๊ฐ์ ์ฐ๊ฒฐ์ ์์งํ๊ณ , ํจ๊ปํ๋ ์บ ํ์ธ์ผ๋ก์ ์ด์ํ๊ณ ์ ํฉ๋๋ค.
์น์ฌ์ดํธ์ ์ฐ๋ ๋ฐฐ๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์ ํ ์ค์ ์ฝ๋๋ฅผ HTML ํ์ผ์ </body> ํ๊ทธ ๋ฐ๋ก ์์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
<script src="https://loopback.social/banner.js" defer></script>
data-color ์์ฑ์ผ๋ก ๋ฐฐ๋ ๋ฐฐ๊ฒฝ์์, data-textcolor ์์ฑ์ผ๋ก ํ
์คํธ ์์์, data-lang ์์ฑ์ผ๋ก ํ์ ์ธ์ด๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
| ์์ฑ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ | ์์ |
|---|---|---|---|
data-color |
๋ฐฐ๋ ๋ฐฐ๊ฒฝ์ (16์ง์) | #000000 |
#005a9c |
data-textcolor |
๋ฐฐ๋ ํ ์คํธ/๋งํฌ ์์ (16์ง์) | #ffffff |
#f0f0f0 |
data-lang |
ํ์ ์ธ์ด (auto, ko, en) |
auto |
ko |
<script src="https://loopback.social/banner.js" data-color="#005a9c" data-textcolor="#ffffff" data-lang="en" defer></script>
data-lang์ด auto์ด๋ฉด ํ์ด์ง์ lang ์์ฑ์ด๋ URL์ ๊ธฐ๋ฐ์ผ๋ก ์๋ ๊ฐ์งํฉ๋๋ค.
์ด ๋จ๊ณ์ ๋ชจ๋ ์ต์ ์ Step 1. ์ค์นํ๊ธฐ์ ๋ฐ๋ผ ์ด์ํ์๋ ์ปค๋ฎค๋ํฐ ์ฌ์ดํธ ์๋จ์ ๋ฐฐ๋๋ฅผ ๋จผ์ ์ค์นํ ๋ค ์งํํด์ฃผ์ธ์. ๋ฐฐ๋๊ฐ ์ค์น๋์ด ์์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ์ ์์์ด ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ ๋ฐฉ๋ฌธ์์๊ฒ ๋ ธ์ถ๋์ง ์๊ณ , ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋ ์๋ฐฉํฅ์ผ๋ก ์ด๋ค์ง์ง ์์ต๋๋ค.
์ปค๋ฎค๋ํฐ์์ ์ด์ํ์๋ ๋๋ฉ์ธ์ news.json ํ์์ ํ์ผ์ ํธ์คํ
ํ์๊ณ , ์ปค๋ฎค๋ํฐ ๋ฑ์ฌ ์ด์์ ํด๋น URL์ ํจ๊ป ์ ์ถํด์ฃผ์ธ์. ๋ฑ์ฌ๊ฐ ๋จธ์ง๋๋ฉด Loopback Social ๋ด์ด 6์๊ฐ๋ง๋ค ์๋์ผ๋ก ๊ฐ์ ธ์ ๋ฐฐ๋์ ๊ณต์ฉ ํผ๋(RSS/Atom/JSON/iCal)์ ๋
ธ์ถํฉ๋๋ค. ์ดํ์๋ ํธ์คํ
ํ์ ํ์ผ๋ง ๊ฐฑ์ ํ์๋ฉด ๋ค์ ์ฌ์ดํด์ ๋ฐ์๋์ด, ๋งค๋ฒ PR์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค. ๋ฐฐ๋์๋ [์ปค๋ฎค๋ํฐ ์ด๋ฆ] ๋ฉ์์ง ํํ๋ก ์ถ์ฒ๊ฐ ํญ์ ๋ช
์๋ฉ๋๋ค.
ํธ์คํ ์๊ตฌ์ฌํญยท์ ํ ๊ท์นยท๊ฐฑ์ ์ฃผ๊ธฐยท์ฅ์ ๋์ ๋ฑ ์ด์์๊ฐ ์์์ผ ํ ์์ธ ๋ช ์ธ๋ ๋ณ๋ ํ์ด์ง์ ์ ๋ฆฌํด๋์์ต๋๋ค โ ๋คํธ์ํฌ ํผ๋ ํธ์คํ ๋ช ์ธ (๊ณต๊ฐ URL)๋ฅผ ์ฐธ์กฐํ์ธ์.
์๋ ๊ฒ์ ํ๊ฒฝ์ ์ด์ํ๊ธฐ ์ด๋ ต๋ค๋ฉด, ์ข ์ ๋ฐฉ์๋๋ก ํญ๋ชฉ ๋จ์ ์ ๋ณด๋ก๋ ๊ณ์ ์ฐธ์ฌ ๊ฐ๋ฅํฉ๋๋ค.
- ์ปค๋ฎค๋ํฐ ๋ฑ์ฌ ์ด์์ ์ปค๋ฎค๋ํฐ ์ ๋ณด๋ฅผ ์ ์ถ (๋คํธ์ํฌ URL ์นธ์ ๋น์๋์ธ์).
- ์์์ด ์๊ธธ ๋๋ง๋ค ๋ด์ค ์ ๋ณด ๋ฑ์ฌ ์ด์๋ฅผ ์ ์ถํ๊ฑฐ๋
docs/news.json์ ์ง์ ์์ ํ๋ PR์ ๋ณด๋ ๋๋ค. - ์ด์์๊ฐ ๊ฒํ ยท๋จธ์งํ๋ฉด ๋ค์ ์ฌ์ดํด์ ๋ฐฐ๋์ ๊ณต์ฉ ํผ๋์ ๋ฐ์๋ฉ๋๋ค.
Loopback Social ์ด์์ง์ด ํ๋ ์ด์ ํด ๊ฐ์กฐํ๊ณ ์ถ์ ์์๋ ์ด ๊ฒฝ๋ก๋ก ์ง์ ๋ฑ์ฌ๋ฉ๋๋ค.
๋ฐฐ๋ ํ๋จ ๋ด์ค ํฐ์ปค์ ํ์ํ ํญ๋ชฉ์ docs/news.json ํ์ผ์ ์๋ ํ์์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
{
"start": "YYYY-MM-DD HH:mm:ss",
"end": "YYYY-MM-DD HH:mm:ss",
"timezone": "+09:00",
"message": {
"ko": "ํ๊ตญ์ด ๋ฉ์์ง",
"en": "English message"
},
"link": "https://example.com",
"display": true
}| ํ๋ | ํ์ | ์ค๋ช |
|---|---|---|
start |
โ | ๋ฐฐ๋ ํ์ ์์ ์ผ์ (YYYY-MM-DD HH:mm:ss) |
end |
โ | ๋ฐฐ๋ ํ์ ์ข
๋ฃ ์ผ์ (YYYY-MM-DD HH:mm:ss) |
timezone |
โ | ์๊ฐ๋. ์๋ต ์ UTC. ์คํ์
("+09:00") ๋๋ IANA ์ด๋ฆ("Asia/Seoul") ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ (๋์๋ฌธ์ ๋ฌด๊ด) |
event_start |
โ | ์ค์ ์ด๋ฒคํธ ์์ ์ผ์. ์บ๋ฆฐ๋(news.ics)์ Schema.org Event ๋ฐ์ดํฐ์ ์ฌ์ฉ. ์๋ต ์ start ์ฌ์ฉ |
event_end |
โ | ์ค์ ์ด๋ฒคํธ ์ข
๋ฃ ์ผ์. ์๋ต ์ end ์ฌ์ฉ |
category |
โ | event / campaign / release / recruit / announcement ์ค ํ๋. event๋ก ์ง์ ํ๊ฑฐ๋ event_start๋ฅผ ํจ๊ป ๋ฃ์ผ๋ฉด ์บ๋ฆฐ๋์ ์ ํํ ๋ฐ์๋ฉ๋๋ค |
location |
โ | ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ฅ์ ์ด๋ฆ. ์บ๋ฆฐ๋ LOCATION๊ณผ Schema.org Event.location.name์ ์ฌ์ฉ |
message |
โ | ํ์ํ ๋ฉ์์ง. ๋ฌธ์์ด ๋๋ {"ko": "...", "en": "..."} ํํ์ ๋ค๊ตญ์ด ๊ฐ์ฒด |
link |
โ | ํด๋ฆญ ์ ์ด๋ํ URL. ๋ฌธ์์ด ๋๋ {"ko": "...", "en": "..."} ํํ์ ๋ค๊ตญ์ด ๊ฐ์ฒด |
display |
โ | ํ์ ์ฌ๋ถ. true, "true", "yes", "1" ๋ชจ๋ ํ์ฑ์ผ๋ก ์ธ์ |
id |
โ | RSS GUID/iCalendar UID๋ก ์ฐ์ผ ๊ณ ์ ์๋ณ์. ์๋ต ์ ๋ฉ์์ง+์์ ์๊ฐ์ผ๋ก ์๋ ์์ฑ |
{
"start": "2026ๅนด03ๆ01ๆฅ 00:00:00",
"end": "2026ๅนด03ๆ31ๆฅ 23:59:59",
"timezone": "Asia/Seoul",
"message": {
"ko": "3์ ๋ฐ์
์ ์ฐธ์ฌํ์ธ์!",
"en": "Join our March meetup!"
},
"link": {
"ko": "https://example.com/ko",
"en": "https://example.com/en"
},
"display": true
}3์ 1์ผ๋ถํฐ 14์ผ๊น์ง ๋ฐฐ๋์ ๋
ธ์ถ๋์ง๋ง, ์ค์ ํ์ฌ๋ 3์ 14์ผ 14:00โ17:00์ ์ด๋ฆฌ๋ ๊ฒฝ์ฐ. categoryยทevent_startยทevent_endยทlocation์ ํจ๊ป ์ง์ ํ๋ฉด news.ics์ events.jsonld์ ์ ํํ ์๊ฐ๊ณผ ์ฅ์๋ก ๋ฐ์๋ฉ๋๋ค.
{
"start": "2026ๅนด03ๆ01ๆฅ 00:00:00",
"end": "2026ๅนด03ๆ14ๆฅ 17:00:00",
"timezone": "Asia/Seoul",
"event_start": "2026ๅนด03ๆ14ๆฅ 14:00:00",
"event_end": "2026ๅนด03ๆ14ๆฅ 17:00:00",
"category": "event",
"location": "์์ธ ๊ฐ๋จ",
"message": {
"ko": "3์ ์ ๊ธฐ ๋ฐ์
",
"en": "March Regular Meetup"
},
"link": "https://example.com/march-meetup",
"display": true
}์ฐธ๊ณ :
linkยทmessageยทlocation์ ๋จ์ผ ๋ฌธ์์ด๋ก๋ ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ๋ชจ๋ ์ธ์ด์ ๋์ผํ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
docs/news.json๊ณผ docs/communities.json์ด ๋ฐ๋ ๋๋ง๋ค GitHub Actions๊ฐ ๋ค์ ํ์ผ์ ์๋์ผ๋ก ๋ค์ ๋น๋ํฉ๋๋ค. ๋ชจ๋ https://loopback.social/ ์๋์ ์ ์ ์ผ๋ก ์๋น๋ฉ๋๋ค.
ํผ๋ ํ์๋ณ๋ก ์ธ ๊ฐ์ง ๋ณํ์ ๋ฐํํฉ๋๋ค:
- ์ด์ค ์ธ์ด (
feed.xml,news.ics, ...): ํญ๋ชฉ ์ ๋ชฉยท์ค๋ช ์ ํ๊ตญ์ด์ ์์ด๋ฅผ ๋ชจ๋ ํ๊ธฐ. ์์ชฝ ์ธ์ด๋ฅผ ๋ค ๋ณด๊ณ ์ถ์ ๋. - ํ๊ตญ์ด ์ ์ฉ (
feed.ko.xml,news.ko.ics, ...): ํ๊ตญ์ด ํ ์คํธ๋ง ํ๊ธฐ (ํด๋น ํญ๋ชฉ์ ํ๊ตญ์ด๊ฐ ์์ผ๋ฉด ์์ด๋ก ์๋ ํด๋ฐฑ). - ์์ด ์ ์ฉ (
feed.en.xml,news.en.ics, ...): ์์ด ํ ์คํธ๋ง ํ๊ธฐ (ํด๋น ํญ๋ชฉ์ ์์ด๊ฐ ์์ผ๋ฉด ํ๊ตญ์ด๋ก ์๋ ํด๋ฐฑ).
๋ฐฐ๋์ "ํผ๋"/"์บ๋ฆฐ๋" ๋ฒํผ์ data-lang(๋๋ ์๋ ๊ฐ์ง)์ ๋ฐ๋ผ ์ฌ์ฉ์ ์ธ์ด์ ๋ง๋ ๋ณํ URL์ ์๋์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
์๋ ์์ฑ๋๋ ๋ชจ๋ ํผ๋(events.jsonld ํฌํจ)๋ https://loopback.social/feeds/ ์๋์ ๋ณด๊ด๋ฉ๋๋ค. sitemap.xml๋ง ๊ฒ์์์ง ์ปจ๋ฒค์
(/sitemap.xml ๊ธฐ๋ณธ ๊ฒฝ๋ก)์ ๋ฐ๋ผ ์ฌ์ดํธ ๋ฃจํธ์ ์ ์ง๋ฉ๋๋ค.
| ๊ฒฝ๋ก | ํ์ | ์ฉ๋ |
|---|---|---|
/feeds/news.ics ยท /feeds/news.ko.ics ยท /feeds/news.en.ics |
iCalendar (RFC 5545) | Google/Apple/Outlook ์บ๋ฆฐ๋ ๊ตฌ๋
. category: event์ด๊ฑฐ๋ event_start๊ฐ ์๋ ํญ๋ชฉ, ๋๋ 7์ผ ์ด๋ด ๊ธฐ๊ฐ์ ํญ๋ชฉ๋ง ํฌํจ |
/feeds/feed.xml ยท /feeds/feed.ko.xml ยท /feeds/feed.en.xml |
RSS 2.0 | RSS ๋ฆฌ๋๋ก ๋ชจ๋ ํ์ฑ ๋ด์ค ํญ๋ชฉ์ ์์ |
/feeds/feed.atom ยท /feeds/feed.ko.atom ยท /feeds/feed.en.atom |
Atom 1.0 | feed.xml๊ณผ ๋์ผ ๋ด์ฉ์ Atom ํ์ |
/feeds/feed.json ยท /feeds/feed.ko.json ยท /feeds/feed.en.json |
JSON Feed 1.1 | JSON ํ์. ํญ๋ชฉ๋ง๋ค _loopback_social ํ์ฅ ํ๋๋ก KO/EN ์๋ฌธยท์ด๋ฒคํธ ์๊ฐยท์ฅ์๋ฅผ ํจ๊ป ๋
ธ์ถ |
/feeds/feeds.opml ยท /feeds/feeds.ko.opml ยท /feeds/feeds.en.opml |
OPML 2.0 | ํผ๋ + ์ฐธ์ฌ ์ปค๋ฎค๋ํฐ ๋ฌถ์. RSS ๋ฆฌ๋์์ OPML ๊ฐ์ ธ์ค๊ธฐ(Import)๋ก ๋คํธ์ํฌ ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๊ตฌ๋ |
/feeds/events.jsonld |
Schema.org JSON-LD | ๊ฒ์ ์์งยทAI ์์ด์ ํธ์ฉ Organization + Event ๊ทธ๋ํ (์ด์ค ์ธ์ด ๊ณ ์ ) |
/llms.txt |
Markdown | AI ์์ด์ ํธ์ฉ ์ฌ์ดํธ ์๋ด. ์๋ํฌ์ธํธ ๋ชฉ๋ก๊ณผ ๋ฐ์ดํฐ ํด์ ๋ฐฉ๋ฒ ๋ช ์ |
/sitemap.xml |
XML ์ฌ์ดํธ๋งต | ๊ณต๊ฐ ์์ฐ ์ธ๋ฑ์ค |
/robots.txt |
robots.txt | ์ฌ์ดํธ๋งต ์์น ๋ช ์, ์ ์ฒด ํฌ๋กค๋ง ํ์ฉ |
๋น๋ ํธ๋ฆฌ๊ฑฐ:
- ์ด์ โ PR ์๋ํ์์
news.json/communities.json์ ์์ ํ PR์ ๋ง๋ค ๋ ํจ๊ป ๋น๋๋์ด PR์ ํฌํจ๋ฉ๋๋ค. main๋ธ๋์น์news.json/communities.json์ด ํธ์๋๋ฉดbuild-feeds.yml์ด ๊ฒฐ๊ณผ๋ฌผ์ ์๋ ์ปค๋ฐํฉ๋๋ค.- ๋งค์ผ 00:00 UTC (09:00 KST)์๋ ํ ๋ฒ ์คํ๋์ด, ๋ง๋ฃ๋ ํญ๋ชฉ์ด ์์ฐ์ค๋ฝ๊ฒ ๋น ์ง๊ณ
lastBuildDate๊ฐ ๊ฐฑ์ ๋ฉ๋๋ค. - ์๋์ผ๋ก ๋๋ฆฌ๋ ค๋ฉด:
node .github/scripts/build-feeds.mjs
docs/banner.js: ๊ฐ๋ฒผ์ด ๋ก๋ ์คํฌ๋ฆฝํธ (์บ์๋์ด๋ ๋ฌด๋ฐฉ)docs/banner.impl.js: ์ค์ ๋ฐฐ๋ ๊ตฌํ์ฒด (ํ์์คํฌํ๋ก ์บ์ ๋ฌดํจํ)docs/communities.json: ์ฐธ์ฌ ์ปค๋ฎค๋ํฐ ๋ชฉ๋กdocs/news.json: ๋ด์ค ํฐ์ปค ์ฝํ ์ธdocs/news.ics,docs/feed.xml,docs/events.jsonld,docs/sitemap.xml: ์๋ ์์ฑ ํผ๋ (์ง์ ํธ์งํ์ง ๋ง ๊ฒ)docs/llms.txt,docs/robots.txt: ๊ฒ์/AI ์นํ ๋ฉํ๋ฐ์ดํฐdocs/schemas/:communities.json/news.jsonJSON Schema (CI์์ ๊ฒ์ฆ์ ์ฌ์ฉ).github/ISSUE_TEMPLATE/: ๊ตฌ์กฐํ๋ ์ ์ถ ์์ (์๋ํ ๋ด์ด ํ์ฑ).github/scripts/: ์์ โ JSON ๋ณํ, ํผ๋ ๋น๋ ์คํฌ๋ฆฝํธ.github/workflows/issue-to-pr.yml: ์ด์ โ PR ์๋ํ ์ํฌํ๋ก.github/workflows/build-feeds.yml: ํผ๋ ์ฌ๋น๋ ์ํฌํ๋ก
banner.js๊ฐ ๋ก๋๋๋ฉด ํ์ฌ ํ์์คํฌํ๋ฅผ ํฌํจํ URL๋กbanner.impl.js๋ฅผ ๋์ ๋ก๋banner.impl.js๋ ํ์ด์ง ์๋จ์ ๊ฒ์์ ๋ ๋ฐฐ๋๋ฅผ ์์ฑํ๊ณ ์ฝ์- ๋ฐฐ๋์๋
loopback.social์ ๋ชฉ๊ณผ ์ปค๋ฎค๋ํฐ ๋๋กญ๋ค์ด ๋ฉ๋ด๊ฐ ํฌํจ - ๋ด์ค ํฐ์ปค๋ ํ์ฌ ์๊ฐ์ ํด๋นํ๋
news.jsonํญ๋ชฉ๋ค์ ์ํ ํ์
GitHub Pages์ ์บ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด 2๋จ๊ณ ๋ก๋ฉ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค:
banner.js: ํญ์ ๋์ผํ ๋ก๋ ์ฝ๋ (๋ธ๋ผ์ฐ์ ์บ์ ๊ฐ๋ฅ)banner.impl.js: ํ์์คํฌํ ํ๋ผ๋ฏธํฐ(?ts=)๋ก ๊ฐ์ ์๋ก๊ณ ์นจ
์ด๋ฅผ ํตํด ๋ฐฐ๋ ์ ๋ฐ์ดํธ ์ ์ฆ์ ๋ฐ์์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ
๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ๊ณ ํ์ธ์.