그누보드5 ActivityPub 그 이후 나온 이야기들 > RESTful

RESTful

그누보드5 ActivityPub 그 이후 나온 이야기들 정보

그누보드5 ActivityPub 그 이후 나온 이야기들

본문

조만간 그누보드를 다시 만지게 될 것으로 보이는데 아마 과거에 개발해두었던 ActivityPub 플러그인을 사용하게 될 것 같습니다.

개선을 해야되는데 어딘가에 이야기를 안해주면 의지박약(..)으로 계속 뒤로 미뤄질까봐 그간에 했던 고민들을 정리해보고자 합니다.

1. 그누보드5 ActivityPub 플러그인 공개 이후 현황

그누보드5 ActivityPub 플러그인 공개 이후 SIR 회원 분들께 칭찬을 많이 들어서 감사하다는 말씀 먼저 드립니다. 특히, 그누보드 기반에서 REST API 구현이 현실적으로 어렵다고 여겨졌는데 이걸 깔끔하게 해결한 예시를 제시했다는 평을 주셔서 기쁘게 생각합니다.

특정 프로토콜이 언급된 만큼 말 그대로 특정 프로토콜이 호환되는 앱(마스토돈, 미스키 등) 사이의 통신을 위해 공개한 것이지만, 본래의 스펙상 메시지를 주고받을 수 있는 앱이라면 어떤 것이든 연동하기 위한 중간 서버로 활용될 수 있는 특징이 있습니다.

가령, 웹사이트를 Discord 같은 채팅 앱과 연동하거나, ChatGPT API 등을 연동할 때 상호 작용의 과정과 결과를 기록하고 보관할 수 있는데 실제 프로덕션 환경에서의 사용은 여기서 일어나고 있는 것으로 보입니다. (사용자 분들이 해당 활용에 대한 이메일을 주셔서 자세한 내용을 파악할 수 있었습니다.)

2. 현재는 어떤걸 계획하고 있나?
ActivityPub 프로토콜은 이전의 ActivityStreams라는 프로토콜에서 영향을 받았습니다. ActivityStreams 또는 유사한 포맷의 활용 사례를 보면, 표준 문서에서는 미리 계획되지 않은 외부정보 또는 부가정보를 언더바(_) 필드로 표현하곤 했습니다. (과거 트위터를 포함한 소셜 미디어 업체가 제공하는 data export 결과물을 보면 확인할 수 있습니다.)

 

이러한 점을 참고하여 구현한 현재 배포한 플러그인에서는 위치(표준 필드), 날씨 및 환율(비표준 필드) 등의 표현이 가능합니다.

 

{
    "@context": "https://www.w3.org/ns/activitystreams",
    "type": "Create",
    "id": "http://example.org/bbs/board.php?bo_table=apstreams&wr_id=235",
    "to": ["https://www.w3.org/ns/activitystreams#Public", "http://example.org/?route=activitypub.user&mb_id=admin"],
    "actor": "http://example.org/?route=activitypub.user&mb_id=admin",
    "object": {
        "type": "Note",
        "generator": "GNUBOARD5 ActivityPub Plugin (INSTANCE_ID: 4d6076784cbd864ade7c746690d37051, INSTANCE_VERSION: 0.1.11-dev)",
        "id": "http://example.org/bbs/board.php?bo_table=free&wr_id=1",
        "attributedTo": "http://example.org/?route=activitypub.user&mb_id=admin",
        "content": "안녕하세요 @*** 개인정보보호를 위한 이메일주소 노출방지 ***",
        "icon": "https://www.gravatar.com/avatar/bdbd5eb70305f1eaaa0340687758676a",
        "location": {
            "name": "xxx.xxx.xxx.xxx, 서울특별시 금천구 가산동 (Korea Telecom), Seoul, Seoul-teukbyeolsi, Korea (Republic of), KR, 06030, +09:00",
            "type": "Place",
            "longitude": 126.8917326,
            "latitude": 37.4769094,
            "units": "m",
            "_weather": {
                "dt": 1657163472,
                "sunrise": 1657138663,
                "sunset": 1657191385,
                "temp": 305.42,
                "feels_like": 309.65,
                "pressure": 1005,
                "humidity": 56,
                "dew_point": 295.52,
                "uvi": 8.53,
                "clouds": 100,
                "visibility": 10000,
                "wind_speed": 5.72,
                "wind_deg": 186,
                "wind_gust": 10.14,
                "weather": [{
                    "id": 804,
                    "main": "Clouds",
                    "description": "overcast clouds",
                    "icon": "04d"
                }]
            },
            "_exchange": {
                "KRW": {
                    "AED": 355.94,
                    "AUD": 887.07,
                    "BHD": 3467.72,
                    "BND": 930.73,
                    "CAD": 1003.15,
                    "CHF": 1346.86,
                    "CNH": 194.76,
                    "DKK": 178.9,
                    "EUR": 1331.33,
                    "GBP": 1558.81,
                    "HKD": 166.61,
                    "IDR(100)": 8.72,
                    "JPY(100)": 960.93,
                    "KRW": 0,
                    "KWD": 4253.09,
                    "MYR": 295.49,
                    "NOK": 128.98,
                    "NZD": 804.44,
                    "SAR": 348.27,
                    "SEK": 124.02,
                    "SGD": 930.73,
                    "THB": 36.12,
                    "USD": 1307.4
                }
            }
        }
    },
    "published": "2022-07-07T03:11:12Z",
    "updated": "2022-07-07T03:11:12Z"
}

 

하지만 이 경우 모든 메시지 트랜젝션에 대해서 외부 정보를 요청하고 전문에 포함하는게 반복되기 때문에 연산량 및 API 호출수 낭비로 이어집니다.

최근 청취한 요구사항에 맞게 계획하고 있는 내용은 다음과 같습니다.
 

콘텐츠 내 특정 키워드 및 키워드 유형을 자동 감지해서 전문에 부가 정보를 자동으로 붙이는 기능 추가


가령,

 

  • 본문 내 국가에 관한 정보 존재 -> 자동으로 환율 부가정보 추가 (현재는 환율 정보 활성화 시, 모든 전문에 붙게되어 트랜젝션이 많이 발생함)
  • 본문 내 주식회사(S&P, 나스닥, 코스닥, 비상장/장외 등) 정보 존재 -> 주식회사와 관련된 부가정보 추가
  • 본문 내 특정 날짜 또는 장소에 대한 정보 존재 -> 특정 날짜 또는 장소에 대한 날씨 정보를 부가정보로 추가 (현재는 날씨 정보 활성화 시, 모든 전문에 붙게되어 트랜젝션이 많이 발생함)


다음 버전이 나오게 된다면 전송되는 컨텐츠 내에 날짜, 장소 등을 유추할만한 정보가 있는지 찾아내는 쪽으로 이뤄지지 않을까 합니다.

 

3. 데모 앱 구현은 가능한가?

결론부터 말씀드리면, 현재 구현된 API 스펙 수준으로도 다른 웹 앱과 연동하거나, 안드로이드, iOS 등 앱 구현이 가능합니다.

 

다만, 원래 구현하기로 생각해두었던 보안수준 대비 기초적인 구현만 들어있고 실제 앱으로 사용되기 위한 추가 사항들이 현재는 빠져있습니다. 개발 역량이 있으신 분은 더 보강해서 앱 개발 용으로 사용하셔도 될 것 같습니다.

물론 직접 수정하기에는 ActivityPub 프로토콜이 비록 JSON + REST API 라고는 하지만 일반적인 API 컨셉하고는 약간의 차이가 있어 현재 기준으로는 숙달된 개발자가 적다는 문제가 있다는걸 알고 있습니다.

그래서 다음 버전이 나오면 제기된 해당 사항에 대해 보완이 이뤄질 것으로 보입니다.

추천
1
  • 복사

댓글 0개

© SIRSOFT
현재 페이지 제일 처음으로