FastComments.com

FastComments Java SDK


์ด๊ฒƒ์€ FastComments์˜ ๊ณต์‹ Java SDK์ž…๋‹ˆ๋‹ค.

FastComments API์šฉ ๊ณต์‹ Java SDK

์ €์žฅ์†Œ

GitHub์—์„œ ๋ณด๊ธฐ


์„ค์น˜ Internal Link

Maven

ํ”„๋กœ์ ํŠธ์˜ POM์— Repsy ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

<repositories>
    <repository>
        <id>repsy</id>
        <name>FastComments Maven Repository on Repsy</name>
        <url>https://repo.repsy.io/mvn/winrid/fastcomments</url>
    </repository>
</repositories>

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

<dependencies>
    <!-- API Client -->
    <dependency>
        <groupId>com.fastcomments</groupId>
        <artifactId>client</artifactId>
        <version>2.0.0</version>
    </dependency>
    
    <!-- Core Library (includes SSO) -->
    <dependency>
        <groupId>com.fastcomments</groupId>
        <artifactId>core</artifactId>
        <version>2.0.0</version>
    </dependency>
    
    <!-- PubSub Library (for live events) -->
    <dependency>
        <groupId>com.fastcomments</groupId>
        <artifactId>pubsub</artifactId>
        <version>2.0.0</version>
    </dependency>
</dependencies>

Gradle

build.gradle ํŒŒ์ผ์— Repsy ์ €์žฅ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

repositories {
    mavenCentral()
    maven {
        url "https://repo.repsy.io/mvn/winrid/fastcomments"
    }
}

dependencies {
    // API Client
    implementation "com.fastcomments:client:2.0.0"
    
    // Core Library (includes SSO)
    implementation "com.fastcomments:core:2.0.0"
    
    // PubSub Library (for live events)
    implementation "com.fastcomments:pubsub:2.0.0"
}

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์„ฑ

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์„ธ ๊ฐœ์˜ ๋ชจ๋“ˆ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ API ํด๋ผ์ด์–ธํŠธ, API ์‚ฌ์šฉ์„ ๋” ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ์ˆ˜์ž‘์—… ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์ฝ”์–ด Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ ํ”ผ๋“œ๋ฅผ ๊ตฌ๋…ํ•˜๊ธฐ ์œ„ํ•œ pubsub ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

๊ณต๊ฐœ API vs ๋ณด์•ˆ API

API ํด๋ผ์ด์–ธํŠธ์—๋Š” DefaultApi, PublicApi, ModerationApi ์„ธ ๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. DefaultApi์—๋Š” API ํ‚ค๊ฐ€ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ , PublicApi์—๋Š” ๋ธŒ๋ผ์šฐ์ €/๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ๋“ฑ์—์„œ ์ธ์ฆ ์—†์ด ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ModerationApi๋Š” ์šด์˜์ž ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. ๋Œ“๊ธ€ ๊ด€๋ฆฌ(๋ชฉ๋ก, ์นด์šดํŠธ, ๊ฒ€์ƒ‰, ๋กœ๊ทธ, ๋‚ด๋ณด๋‚ด๊ธฐ), ๊ด€๋ฆฌ ์ž‘์—…(์ œ๊ฑฐ/๋ณต์›, ์‹ ๊ณ , ๊ฒ€ํ† /์ŠคํŒธ/์Šน์ธ ์ƒํƒœ ์„ค์ •, ํˆฌํ‘œ, ์Šค๋ ˆ๋“œ ์žฌ๊ฐœ/์ข…๋ฃŒ), ์ฐจ๋‹จ(๋Œ“๊ธ€ ์ฐจ๋‹จ, ์ฐจ๋‹จ ํ•ด์ œ, ์‚ฌ์ „ ์ฐจ๋‹จ ์š”์•ฝ, ์ฐจ๋‹จ ์ƒํƒœ ๋ฐ ์„ค์ •, ์ฐจ๋‹จ๋œ ์‚ฌ์šฉ์ž ์ˆ˜) ๋ฐ ๋ฐฐ์ง€์™€ ์‹ ๋ขฐ๋„(๋ฐฐ์ง€ ์ˆ˜์—ฌ/์ œ๊ฑฐ, ์ˆ˜๋™ ๋ฐฐ์ง€, ์‹ ๋ขฐ๋„ ์กฐํšŒ/์„ค์ •, ์‚ฌ์šฉ์ž ๋‚ด๋ถ€ ํ”„๋กœํ•„)๋ฅผ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ModerationApi ๋ฉ”์„œ๋“œ๋Š” sso ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ํ˜ธ์ถœ์„ SSO๋กœ ์ธ์ฆ๋œ ์šด์˜์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ์‹œ์ž‘ Internal Link

์ธ์ฆ๋œ API ์‚ฌ์šฉ (DefaultApi)

Important: ์ธ์ฆ๋œ ์š”์ฒญ์„ ํ•˜๊ธฐ ์ „์— ApiClient์— API ํ‚ค๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ์ด 401 ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

import com.fastcomments.invoker.ApiClient;
import com.fastcomments.invoker.ApiException;
import com.fastcomments.api.DefaultApi;
import com.fastcomments.model.*;

public class Example {
    public static void main(String[] args) {
        // API ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค
        ApiClient apiClient = new ApiClient();

        // ํ•„์ˆ˜: API ํ‚ค๋ฅผ ์„ค์ •ํ•˜์„ธ์š” (FastComments ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค)
        apiClient.setApiKey("YOUR_API_KEY_HERE");

        // ๊ตฌ์„ฑ๋œ ํด๋ผ์ด์–ธํŠธ๋กœ API ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค
        DefaultApi api = new DefaultApi(apiClient);

        // ์ด์ œ ์ธ์ฆ๋œ API ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
        try {
            // ์˜ˆ์‹œ: SSO ์‚ฌ์šฉ์ž ์ถ”๊ฐ€
            CreateAPISSOUserData userData = new CreateAPISSOUserData();
            userData.setId("user-123");
            userData.setEmail("user@example.com");
            userData.setDisplayName("John Doe");

            AddSSOUserAPIResponse response = api.addSSOUser("YOUR_TENANT_ID", userData)
                .execute();
            System.out.println("User created: " + response);

        } catch (ApiException e) {
            System.err.println("Error: " + e.getResponseBody());
            // ์ผ๋ฐ˜์ ์ธ ์˜ค๋ฅ˜:
            // - 401: API ํ‚ค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
            // - 400: ์š”์ฒญ ๊ฒ€์ฆ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค
        }
    }
}

๊ณต๊ฐœ API ์‚ฌ์šฉ (PublicApi)

๊ณต๊ฐœ ์—”๋“œํฌ์ธํŠธ๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

import com.fastcomments.api.PublicApi;
import com.fastcomments.invoker.ApiException;

PublicApi publicApi = new PublicApi();

try {
    var response = publicApi.getCommentsPublic("YOUR_TENANT_ID", "page-url-id")
        .execute();
    System.out.println(response);
} catch (ApiException e) {
    e.printStackTrace();
}

๋ชจ๋”๋ ˆ์ด์…˜ API ์‚ฌ์šฉ (ModerationApi)

The ModerationApi๋Š” ๋ชจ๋”๋ ˆ์ดํ„ฐ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์„œ๋“œ๋Š” ์š”์ฒญ์ด ๋Œ€๋ฆฌ๋กœ ์ˆ˜ํ–‰๋˜๋Š” SSO ์ธ์ฆ๋œ ๋ชจ๋”๋ ˆ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•˜๋Š” sso ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค:

import com.fastcomments.api.ModerationApi;
import com.fastcomments.invoker.ApiException;
import com.fastcomments.model.*;

ModerationApi moderationApi = new ModerationApi();

try {
    // ๋ชจ๋”๋ ˆ์ด์…˜ ๋Œ€๊ธฐ ์ค‘์ธ ๋Œ“๊ธ€ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค
    ModerationAPIGetCommentsResponse response = moderationApi.getApiComments()
        .sso("YOUR_SSO_TOKEN")
        .execute();
    System.out.println(response);
} catch (ApiException e) {
    e.printStackTrace();
}

์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ

  1. 401 "missing-api-key" ์˜ค๋ฅ˜: DefaultApi ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— apiClient.setApiKey("YOUR_KEY")๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  2. ์ž˜๋ชป๋œ API ํด๋ž˜์Šค: ์„œ๋ฒ„ ์ชฝ ์ธ์ฆ๋œ ์š”์ฒญ์—๋Š” DefaultApi๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ/๊ณต๊ฐœ ์š”์ฒญ์—๋Š” PublicApi๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  3. API ํ‚ค๊ฐ€ null์ธ ๊ฒฝ์šฐ: SDK๋Š” API ํ‚ค๊ฐ€ null์ด๋ฉด ์ธ์ฆ์„ ์กฐ์šฉํžˆ ๊ฑด๋„ˆ๋›ฐ์–ด 401 ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋…ธํŠธ Internal Link

๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ID

์ผ๋ถ€ API ํ˜ธ์ถœ์—์„œ broadcastId๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์ด ID๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‚™๊ด€์ ์œผ๋กœ ๋ณ€๊ฒฝ์„ ์ ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ๋ฅผ ๋ฌด์‹œํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์•„๋งˆ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์—ฌ๊ธฐ์— UUID๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”. ์ด ID๋Š” ๋ธŒ๋ผ์šฐ์ € ์„ธ์…˜ ๋‚ด์—์„œ ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ํ•„์š”ํ•˜์‹ ๊ฐ€์š”?

Java SDK์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ์„ ์ด์šฉํ•˜์„ธ์š”:

๊ธฐ์—ฌ

๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ๋ผ์ธ์€ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.