Kotlin๊ณผ Java์์ SOLAPI ๋ฉ์์ง ๋ฐ์ก ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ณต์ SDK์ ๋๋ค.
Claude Code, Cursor, Windsurf ๋ฑ AI ์ฝ๋ฉ ๋๊ตฌ์ ์๋ ํ๋กฌํํธ๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐํ์ธ์:
Implement messaging feature using SOLAPI SDK.
Guide: https://raw.githubusercontent.com/solapi/solapi-kotlin/main/LLM_GUIDE.md
SDK ๊ฐ์ด๋๋ฅผ ๊ฐ์ ธ์จ ํ LLM ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅด์ธ์.
curl -s https://raw.githubusercontent.com/solapi/solapi-kotlin/main/LLM_GUIDE.md| ์ํฉ | ํ๋กฌํํธ |
|---|---|
| SMS/MMS ๋ฐ์ก | "SOLAPI SDK๋ก SMS ๋ฐ์ก ์ฝ๋ ์์ฑํด์ค" |
| ์นด์นด์ค ์๋ฆผํก | "SOLAPI SDK๋ก ์นด์นด์ค ์๋ฆผํก ๋ฐ์ก ๊ตฌํํด์ค" |
| ๋๋ ๋ฐ์ก | "SOLAPI SDK๋ก ๋๋ ๋ฌธ์ ๋ฐ์ก ๊ธฐ๋ฅ ์ถ๊ฐํด์ค" |
| ์์ฝ ๋ฐ์ก | "SOLAPI SDK๋ก ์์ฝ ๋ฐ์ก ๊ตฌํํด์ค" |
| ๋ฐ์ก ์กฐํ | "SOLAPI SDK๋ก ๋ฐ์ก ๊ฒฐ๊ณผ ์กฐํ ์ฝ๋ ์์ฑํด์ค" |
dependencies {
implementation("com.solapi:sdk:1.1.0")
}dependencies {
implementation 'com.solapi:sdk:1.1.0'
}<dependency>
<groupId>com.solapi</groupId>
<artifactId>sdk</artifactId>
<version>1.1.0</version>
</dependency>import com.solapi.sdk.SolapiClient;
import com.solapi.sdk.message.dto.response.MultipleDetailMessageSentResponse;
import com.solapi.sdk.message.model.Message;
import com.solapi.sdk.message.service.DefaultMessageService;
public class Main {
public static void main(String[] args) {
DefaultMessageService messageService = SolapiClient.INSTANCE.createInstance("API_KEY", "API_SECRET");
Message message = new Message();
message.setFrom("๋ฐ์ ๋ฒํธ");
message.setTo("์์ ๋ฒํธ");
message.setText("์๋
ํ์ธ์. SOLAPI SDK ํ
์คํธ์
๋๋ค.");
MultipleDetailMessageSentResponse response = messageService.send(message, null);
System.out.println("Group ID: " + response.getGroupInfo().getGroupId());
}
}import com.solapi.sdk.SolapiClient
import com.solapi.sdk.message.model.Message
fun main() {
val messageService = SolapiClient.createInstance("API_KEY", "API_SECRET")
val message = Message(
from = "๋ฐ์ ๋ฒํธ",
to = "์์ ๋ฒํธ",
text = "์๋
ํ์ธ์. SOLAPI SDK ํ
์คํธ์
๋๋ค."
)
val response = messageService.send(message)
println("Group ID: ${response.groupInfo?.groupId}")
}| ํ๊ฒฝ๋ณ์ | ์ค๋ช | ํ์ |
|---|---|---|
SOLAPI_API_KEY |
SOLAPI API ํค | O |
SOLAPI_API_SECRET |
SOLAPI API ์ํฌ๋ฆฟ | O |
SOLAPI_SENDER |
๋ฑ๋ก๋ ๋ฐ์ ๋ฒํธ | O |
SOLAPI_RECIPIENT |
์์ ๋ฒํธ | O |
SOLAPI_KAKAO_PF_ID |
์นด์นด์ค ๋น์ฆ๋์ค ์ฑ๋ ID | ์นด์นด์ค ๊ณ์ด ๋ฉ์์ง ๋ฐ์ก ์ |
SOLAPI_KAKAO_TEMPLATE_ID |
์นด์นด์ค ์๋ฆผํก ํ ํ๋ฆฟ ID | ์๋ฆผํก ๋ฐ์ก ์ |
# Java ์์ ์คํ
./gradlew :solapi-kotlin-example-java:run -Pexample=SendSms
# Kotlin ์์ ์คํ
./gradlew :solapi-kotlin-example-kotlin:run -Pexample=SendSmsSDK ์ฌ์ฉ ์: ๋ณธ SDK๋ JDK 8 ์ด์์์ ์ ์ ๋์ํฉ๋๋ค. Maven Central์์ ์์กด์ฑ์ ์ถ๊ฐํ๋ฉด JDK 8 ํ๊ฒฝ์์ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์์ ์คํ ์: ์ด ์ ์ฅ์์ ์์ ๋ฅผ ์ง์ ์คํํ๋ ค๋ฉด Gradle 9.x๊ฐ ํ์ํ๋ฉฐ, ์ด๋ JDK 21 ์ด์์ ์๊ตฌํฉ๋๋ค.
JDK 8๋ง ์ค์น๋ ํ๊ฒฝ์์ ์์ ๋ฅผ ์คํํ๋ ค๋ฉด:
Gradle Toolchain์ด ์๋์ผ๋ก JDK 8์ ๋ค์ด๋ก๋ํ์ฌ ์์ ๋ฅผ ์ปดํ์ผํฉ๋๋ค. Gradle ์คํ์ฉ์ผ๋ก๋ง JDK 21 ์ด์์ด ํ์ํฉ๋๋ค.
# macOS (Homebrew)
brew install openjdk@21
# Ubuntu/Debian
sudo apt install openjdk-21-jdk
# SDKMAN (๊ถ์ฅ)
sdk install java 21.0.2-temJDK 8 ํ๊ฒฝ์ ์์ฒด ํ๋ก์ ํธ์์ SDK๋ฅผ ์ถ๊ฐํ๊ณ ํ ์คํธํ ์ ์์ต๋๋ค:
// build.gradle (Groovy)
plugins {
id 'java'
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
dependencies {
implementation 'com.solapi:sdk:1.1.0'
}// src/main/java/MyTest.java
import com.solapi.sdk.SolapiClient;
import com.solapi.sdk.message.model.Message;
import com.solapi.sdk.message.service.DefaultMessageService;
public class MyTest {
public static void main(String[] args) {
DefaultMessageService messageService = SolapiClient.INSTANCE.createInstance(
"YOUR_API_KEY",
"YOUR_API_SECRET"
);
Message message = new Message();
message.setFrom("๋ฐ์ ๋ฒํธ");
message.setTo("์์ ๋ฒํธ");
message.setText("ํ
์คํธ ๋ฉ์์ง");
messageService.send(message, null);
}
}์ฐธ๊ณ : Gradle 7.x (JDK 11+) ๋๋ Gradle 6.x (JDK 8+)๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ ์ ์ค์ ์ผ๋ก ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
| ์์ | ์ค๋ช |
|---|---|
SendSms |
SMS ๋จ๊ฑด ๋ฐ์ก |
SendMms |
MMS ์ด๋ฏธ์ง ์ฒจ๋ถ ๋ฐ์ก |
SendBatch |
๋๋ ๋ฉ์์ง ๋ฐ์ก |
SendScheduled |
์์ฝ ๋ฐ์ก |
SendVoice |
์์ฑ ๋ฉ์์ง ๋ฐ์ก |
KakaoAlimtalk |
์นด์นด์ค ์๋ฆผํก ๋ฐ์ก |
KakaoBrandMessage |
์นด์นด์ค ๋ธ๋๋ ๋ฉ์์ง ๋ฐ์ก |
GetBalance |
์์ก ์กฐํ |
GetMessageList |
๋ฐ์ก ๋ด์ญ ์กฐํ |
| ํ์ | ์ค๋ช |
|---|---|
SMS |
๋จ๋ฌธ๋ฌธ์ (80 byte ๋ฏธ๋ง) |
LMS |
์ฅ๋ฌธ๋ฌธ์ (80 byte ์ด์, 2,000 byte ๋ฏธ๋ง) |
MMS |
์ด๋ฏธ์ง ํฌํจ ๋ฌธ์ (200KB ์ด๋ด ์ด๋ฏธ์ง 1์ฅ) |
ATA |
์นด์นด์ค ์๋ฆผํก |
BMS_* |
์นด์นด์ค ๋ธ๋๋ ๋ฉ์์ง (ํ ํ๋ฆฟ, ์์ ํ) |
RCS_* |
RCS ๋ฌธ์ (SMS, LMS, MMS, TPL) |
NSA |
๋ค์ด๋ฒ ์ค๋งํธ ์๋ฆผ |
FAX |
ํฉ์ค |
VOICE |
์์ฑ ๋ฉ์์ง |
Java:
// ์ด๋ฏธ์ง ์
๋ก๋
String imageId = messageService.uploadFile(imageFile, StorageType.MMS, null);
// MMS ๋ฉ์์ง ์์ฑ ๋ฐ ๋ฐ์ก
Message message = new Message();
message.setType(MessageType.MMS);
message.setFrom("๋ฐ์ ๋ฒํธ");
message.setTo("์์ ๋ฒํธ");
message.setText("MMS ๋ฉ์์ง ๋ด์ฉ");
message.setSubject("MMS ์ ๋ชฉ");
message.setImageId(imageId);
messageService.send(message, null);์ด๋ฏธ์ง ๊ท๊ฒฉ: JPG/JPEG, ์ต๋ 200KB, ๊ถ์ฅ ํด์๋ 1000x1000 ์ดํ
Java:
List<Message> messages = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
Message msg = new Message();
msg.setFrom(sender);
msg.setTo("010XXXX000" + i);
msg.setText("๋ฉ์์ง " + i);
messages.add(msg);
}
// ์ค๋ณต ์์ ๋ฒํธ ํ์ฉ ์ต์
SendRequestConfig config = new SendRequestConfig();
config.setAllowDuplicates(true);
messageService.send(messages, config);- ํ ๋ฒ์ ์ต๋ 10,000๊ฑด ๋ฐ์ก ๊ฐ๋ฅ
allowDuplicates = true๋ก ๋์ผ ์์ ๋ฒํธ ์ค๋ณต ๋ฐ์ก ํ์ฉ
Java:
SendRequestConfig config = new SendRequestConfig();
config.setScheduledDateFromLocalDateTime(
LocalDateTime.now().plusMinutes(10),
ZoneId.of("Asia/Seoul")
);
messageService.send(message, config);- ์ต์ 10๋ถ ํ๋ถํฐ ์ต๋ 6๊ฐ์ ์ด๋ด ์์ฝ ๊ฐ๋ฅ
- ๊ณผ๊ฑฐ ์๊ฐ ์ง์ ์ ์ฆ์ ๋ฐ์ก ์ฒ๋ฆฌ
Java:
Map<String, String> variables = new HashMap<>();
variables.put("name", "ํ๊ธธ๋");
variables.put("code", "123456");
KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("์นด์นด์ค์ฑ๋ID");
kakaoOption.setTemplateId("ํ
ํ๋ฆฟID");
kakaoOption.setVariables(variables);
Message message = new Message();
message.setType(MessageType.ATA);
message.setFrom("๋ฐ์ ๋ฒํธ");
message.setTo("์์ ๋ฒํธ");
message.setKakaoOptions(kakaoOption);
messageService.send(message, null);- ๊ฒ์ ์น์ธ๋ ํ ํ๋ฆฟ๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- ์ ๋ณด์ฑ ๋ฉ์์ง ์ ์ฉ (๊ด๊ณ ๋ถ๊ฐ)
| ๋ฉ์๋ | ์ค๋ช |
|---|---|
send(message) |
๋จ๊ฑด ๋ฉ์์ง ๋ฐ์ก |
send(messages) |
๋ค๊ฑด ๋ฉ์์ง ๋ฐ์ก (์ต๋ 10,000๊ฑด) |
send(message, config) |
์ค์ ๊ณผ ํจ๊ป ๋ฐ์ก (์์ฝ, ์ค๋ณต ํ์ฉ ๋ฑ) |
uploadFile(file, type) |
ํ์ผ ์ ๋ก๋ (MMS, FAX ๋ฑ) |
| ๋ฉ์๋ | ์ค๋ช |
|---|---|
getBalance() |
์์ก ์กฐํ |
getQuota() |
์ผ์ผ ๋ฐ์ก๋ ํ๋ ์กฐํ |
getMessageList(request) |
๋ฉ์์ง ๋ฐ์ก ๋ด์ญ ์กฐํ |
| ๋ฉ์๋ | ์ค๋ช |
|---|---|
getKakaoAlimtalkTemplates() |
์๋ฆผํก ํ ํ๋ฆฟ ๋ชฉ๋ก ์กฐํ |
getKakaoAlimtalkTemplate(id) |
์๋ฆผํก ํ ํ๋ฆฟ ์์ธ ์กฐํ |
createKakaoAlimtalkTemplate(request) |
์๋ฆผํก ํ ํ๋ฆฟ ์์ฑ |
getSendableKakaoAlimtalkTemplates() |
๋ฐ์ก ๊ฐ๋ฅํ ํ ํ๋ฆฟ ์กฐํ |
getKakaoBrandMessageTemplates() |
๋ธ๋๋ ๋ฉ์์ง ํ ํ๋ฆฟ ์กฐํ |
try {
messageService.send(message, null);
} catch (SolapiBadRequestException e) {
System.out.println("์๋ชป๋ ์์ฒญ: " + e.getMessage());
} catch (SolapiInvalidApiKeyException e) {
System.out.println("์๋ชป๋ API ํค: " + e.getMessage());
} catch (SolapiMessageNotReceivedException e) {
System.out.println("๋ฐ์ก ์คํจ: " + e.getMessage());
} catch (SolapiException e) {
System.out.println("๊ธฐํ ์ค๋ฅ: " + e.getMessage());
}| ์์ธ ํด๋์ค | ์ค๋ช |
|---|---|
SolapiBadRequestException |
์๋ชป๋ ์์ฒญ ํ๋ผ๋ฏธํฐ |
SolapiInvalidApiKeyException |
์ ํจํ์ง ์์ API ํค |
SolapiApiKeyException |
API ํค ๊ด๋ จ ์ค๋ฅ |
SolapiFileUploadException |
ํ์ผ ์ ๋ก๋ ์คํจ |
SolapiMessageNotReceivedException |
๋ฉ์์ง ์์ ์คํจ |
SolapiEmptyResponseException |
๋น ์๋ต ์์ |
SolapiUnknownException |
์ ์ ์๋ ์ค๋ฅ |
- Java 8 ์ด์
- Kotlin 2.2.0 ์ด์ (Kotlin ์ฌ์ฉ ์)
MIT License - ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.