솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!솔라피 개발자 샌드박스 홈페이지입니다. 실사용은 solapi.com 으로 이동해주세요!
SDK

메시지 발송 예제

작성일 2026.02.23 | 수정일 2026.02.26

해당 페이지에서는 SOLAPI Java/Kotlin SDK를 이용하여 메시지를 발송하는 방법에 대해 가이드하고 있습니다. Java/Kotlin SDK를 통해 빠르고 쉽게 메시지를 발송해보세요!

  • 해당 페이지에서 작성된 모든 코드는 Java로 작성되었습니다.

  • 해당 코드에서의 기반은 Spring Framework로 작성하는 것을 전제하고 있습니다.

  • 각 발송 예시에 대한 결과 값 표시 기능은 현재 준비중에 있습니다.

  • 해당 예제는 Kotlin SDK 1.0.3 버전을 기준으로 작성되었습니다.

  • 해당 페이지에서 안내되는 코드들은 import 구문이 제외되어 있습니다.

  • 여러 건 발송이나 더 다양한 예제를 확인해보고 싶으신 경우 SDK 샘플 코드 페이지를 확인해보세요!

warning

발송 요청을 하실 때 반드시 발신번호와 수신번호는 01012345678 형식으로 요청하셔야 합니다!

+, -, * 특수문자 등 삽입 불가

// 예시, 다른 파라미터 생략, json 형식
{
  "from": "15771603",
  "to": "15771603"
}

SDK Reference(send 메소드 명세 확인)
Kotlin SDK 및 예제
SOLAPI SDK for Kotlin(Includes Java). Contribute to solapi/solapi-kotlin development by creating an account on GitHub.

환경설정

연동하실 프로젝트로 이동하신 다음 선호하시는 환경을 선택하여 아래 코드를 추가하여 SDK를 설치해보세요!

<dependency>
  <groupId>com.solapi</groupId>
  <artifactId>sdk</artifactId>
  <version>1.0.3</version>
</dependency>
implementation 'com.solapi:sdk:1.0.3'
implementation("com.solapi:sdk:1.0.3")

문자 발송

Java/Kotlin으로 문자를 발송하는 방법에 대해 안내합니다.
연동하실 코드로 이동하신 다음, 아래의 각 유형별 문자 발송예시를 참고하셔서 원하시는 유형의 문자를 발송해보세요!

DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");
// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("SMS는 한글 45자, 영자 90자까지 입력할 수 있습니다.");

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}
DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");
// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("한글 45자, 영자 90자 이상 입력되면 자동으로 LMS타입의 문자메시지가 발송됩니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ");
// message.setSubject("문자 제목 입력"); // LMS, MMS 전용 옵션, SMS에서 해당 파라미터 추가될 경우 자동으로 LMS로 변환됩니다!

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}
DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

// 메소드 정의 부분에서 throws IOException이 미리 선언되거나, try catch를 통해 예외처리를 진행하셔야 합니다.
ClassPathResource resource = new ClassPathResource("이미지 경로");
File file = resource.getFile();

// 예시는 ClassPathResource 객체를 변환하지만 File 객체를 그대로 전달하여도 동작합니다! 단, 200kb 이내의 jpg 파일을 업로드 해주세요.
String imageId = messageService.uploadFile(file, StorageType.MMS, null);

Message message = new Message();
// 발신번호 및 수신번호는 반드시 01012345678 형태로 입력되어야 합니다.
message.setFrom("발신번호 입력");
message.setTo("수신번호 입력");
message.setText("MMS는 한글 45자, 영자 90자 이상을 입력할 수 있습니다. 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ");
message.setImageId(imageId);

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}
DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");
// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("SMS는 한글 45자, 영자 90자까지 입력할 수 있습니다.");
message.setCountry("1"); // 미국 국가번호, 국가번호 뒤에 추가로 번호가 붙는 국가들은 붙여서 기입해야 합니다. 예) 1 441 -> "1441"

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}

음성 메시지 발송

DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setTo("수신번호 입력");
message.setFrom("계정에서 등록한 발신번호 입력");
message.setText("음성 메시지 본문 내용 입력");

VoiceOption voiceOption = new VoiceOption();
// voiceType은 FEMALE이 기본값, MALE 값 사용 시 남성 음성으로 발송됩니다.
voiceOption.setVoiceType(VoiceType.FEMALE);
// headerMessage는 통화 시작 시 나오는 메시지, tailMessage는 통화 종료 시 나오는 메시지
voiceOption.setHeaderMessage("안녕하세요. 솔라피 쇼핑몰입니다.");
// headerMessage와 tailMessage는 최대 135자까지 입력 가능합니다.
voiceOption.setTailMessage("감사합니다. 좋은 하루 되세요.");
// replyRange는 통화 내용이 나온 후 1~3번까지의 버튼으로 받는 답변 (수신자에게서 입력받을 숫자, 1~9까지 입력가능, '3'입력 시 1~3번까지 누를 수 있음.)
voiceOption.setReplyRange(3);
// counselorNumber는 고객센터 연결 번호, replyRange와 병행 불가
// voiceOption.setCounselorNumber("01000000000");

message.setVoiceOptions(voiceOption);

try {
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}

카카오 알림톡/친구톡 발송

Java/Kotlin으로 알림톡/친구톡을 발송하는 방법에 대해 안내합니다.
연동하실 코드로 이동하신 다음, 아래의 각 유형별 문자 발송예시를 참고하셔서 원하시는 유형의 알림톡/친구톡을 발송해보세요!

알림톡 발송 시 text 항목에 데이터를 기입하지 않아야 합니다.

알림톡 발송

DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("연동한 비즈니스 채널의 pfId");
kakaoOption.setTemplateId("등록한 알림톡 템플릿의 ID");

// disableSms를 true로 설정하실 경우 문자로 대체발송 되지 않습니다.
// kakaoOption.setDisableSms(true);

// 치환문구(예) #{변수명})가 있을 경우 아래의 코드를 추가해보세요!
 /*
HashMap<String, String> variables = new HashMap<>();
variables.put("#{변수명1}", "치환문구 값 입력");
variables.put("#{변수명2}", "치환문구 값 입력2");
kakaoOption.setVariables(variables);
*/

// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setKakaoOptions(kakaoOption);

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}
DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("연동한 비즈니스 채널의 pfId");
kakaoOption.setTemplateId("등록한 알림톡 템플릿의 ID");

// disableSms를 true로 설정하실 경우 문자로 대체발송 되지 않습니다.
// kakaoOption.setDisableSms(true);

// 치환문구(예) #{변수명})가 있을 경우 아래의 코드를 추가해보세요!
 /*
HashMap<String, String> variables = new HashMap<>();
variables.put("#{변수명1}", "치환문구 값 입력");
variables.put("#{변수명2}", "치환문구 값 입력2");
kakaoOption.setVariables(variables);
*/

// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setKakaoOptions(kakaoOption);

// 해당 수신번호의 국가번호를 입력, 예) 미국: "1", 일본: "81"
// 국가번호 뒤에 추가로 번호가 붙는 국가들은 붙여서 기입해야 합니다. 예) 1 441 -> "1441"
message.setCountry("국가번호 입력");

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}

친구톡 발송

친구톡에서는 버튼과 이미지를 모두 포함하여 발송하실 수 있습니다.
아래의 예제등을 통해 친구톡을 발송해보세요!

warning

친구톡 버튼은 최대 5개 까지만 삽입하실 수 있습니다.

DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("연동한 비즈니스 채널의 pfId");
kakaoOption.setVariables(null);


// disableSms를 true로 설정하실 경우 문자로 대체발송 되지 않습니다.
// kakaoOption.setDisableSms(true);

// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("2,000 byte 이내의 메시지 입력");
message.setKakaoOptions(kakaoOption);

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}
DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("연동한 비즈니스 채널의 pfId");
kakaoOption.setVariables(null);

// disableSms를 true로 설정하실 경우 문자로 대체발송 되지 않습니다.
// kakaoOption.setDisableSms(true);

ArrayList<KakaoButton> kakaoButtons = new ArrayList<>();
// 웹링크 버튼
KakaoButton kakaoWebLinkButton = new KakaoButton(
        "테스트 버튼1", KakaoButtonType.WL,
        "https://example.com", "https://example.com",
        null, null
);

// 앱링크 버튼
KakaoButton kakaoAppLinkButton = new KakaoButton(
        "테스트 버튼2", KakaoButtonType.AL,
        null, null,
        "exampleapp://test", "exampleapp://test"
);

// 봇 키워드 버튼, 버튼을 클릭하면 버튼 이름으로 수신자가 발신자에게 채팅을 보냅니다.
KakaoButton kakaoBotKeywordButton = new KakaoButton(
        "테스트 버튼3", KakaoButtonType.BK, null, null, null, null
);

// 메시지 전달 버튼, 버튼을 클릭하면 버튼 이름과 친구톡 메시지 내용을 포함하여 수신자가 발신자에게 채팅을 보냅니다.
KakaoButton kakaoMessageDeliveringButton = new KakaoButton(
        "테스트 버튼4", KakaoButtonType.MD, null, null, null, null
);

/*
 * 상담톡 전환 버튼, 상담톡 서비스를 이용하고 있을 경우 상담톡으로 전환. 상담톡 서비스 미이용시 해당 버튼 추가될 경우 발송 오류 처리됨.
 * 아래의 링크를 참고하셔서 상담톡 딜러사를 확인해보세요! SOLAPI는 상담톡 서비스를 제공하지 않습니다.
 * https://business.kakao.com/info/bizmessage/
 */
/*KakaoButton kakaoBotCustomerButton = new KakaoButton(
        "테스트 버튼6", KakaoButtonType.BC, null, null, null, null
);*/

// 봇전환 버튼, 해당 비즈니스 채널에 카카오 챗봇이 없는 경우 동작안함.
// KakaoButton kakaoBotTransferButton = new KakaoButton("테스트 버튼7", KakaoButtonType.BT, null, null, null, null);

kakaoButtons.add(kakaoWebLinkButton);
kakaoButtons.add(kakaoAppLinkButton);
kakaoButtons.add(kakaoBotKeywordButton);
kakaoButtons.add(kakaoMessageDeliveringButton);

kakaoOption.setButtons(kakaoButtons);

// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("2,000 byte 이내의 메시지 입력");
message.setKakaoOptions(kakaoOption);

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}
DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

// 해당 예제는 ClassPathResource로 예시가 되어있지만 File 객체로 대체하여도 동작합니다!
ClassPathResource resource = new ClassPathResource("이미지 경로");
File file = resource.getFile();
// 이미지 크기는 가로 500px 세로 250px 이상이어야 하며 가로 세로 비율이 반드시 2:1로 유지되어야 합니다, 링크도 필수로 기입해주세요.
String imageId = messageService.uploadFile(file, StorageType.KAKAO, "링크 입력");

KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("연동한 비즈니스 채널의 pfId");
kakaoOption.setVariables(null);

// disableSms를 true로 설정하실 경우 문자로 대체발송 되지 않습니다.
// kakaoOption.setDisableSms(true);

// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("2,000 byte 이내의 메시지 입력");
message.setKakaoOptions(kakaoOption);

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}

브랜드 메시지 발송

브랜드 메시지는 대체 발송을 지원하지 않습니다. 수신번호는 반드시 01012345678 형식으로 입력해주세요.

DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");

KakaoOption kakaoOption = new KakaoOption();
kakaoOption.setPfId("연동한 비즈니스 채널의 pfId");
kakaoOption.setTemplateId("등록한 브랜드 메시지 템플릿의 ID");

// 치환문구가 있는 경우 추가, 반드시 key, value 모두 string으로 기입해야 합니다.
/*
HashMap<String, String> variables = new HashMap<>();
variables.put("#{변수명}", "임의의 값");
kakaoOption.setVariables(variables);
*/

// 발송 범위 설정, I: 채널 친구, N: 채널 친구를 제외한 마케팅 수신 동의 유저, M: 마케팅 수신 동의 유저 + 채널 친구
// 현재 브랜드 메시지는 M, N 값의 경우 인허가된 비즈니스 채널만 발송하실 수 있습니다.
KakaoBmsOption kakaoBmsOption = new KakaoBmsOption();
kakaoBmsOption.setTargeting(KakaoBmsTargeting.I);
kakaoOption.setBms(kakaoBmsOption);

Message message = new Message();
message.setTo("수신번호");
message.setKakaoOptions(kakaoOption);

try {
  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}

예약 발송

예약 발송은 모든 발송 수단(문자, 알림톡 등)에서 사용할 수 있는 기능입니다.
예약 발송 기능은 앞서 안내된 각 코드의 send 메소드에서 두 번째 파라미터로 날짜(Java Instant 타입)를 입력하면 해당 날짜로 예약 접수가 진행됩니다.

warning

예약 날짜가 현재 시각보다 더 과거의 시간일 경우 즉시 발송 접수가 진행됩니다.

발송 예시는 SMS(단문 문자)만 제공되지만, 모든 발송수단에서 사용할 수 있습니다!

DefaultMessageService messageService =  SolapiClient.INSTANCE.createInstance("API 키 입력", "API 시크릿 키 입력");
// Message 패키지가 중복될 경우 com.solapi.sdk.message.model.Message로 치환하여 주세요
Message message = new Message();
message.setFrom("계정에서 등록한 발신번호 입력");
message.setTo("수신번호 입력");
message.setText("SMS는 한글 45자, 영자 90자까지 입력할 수 있습니다.");

try {
  // Java LocalDateTime, Instant 기준
  LocalDateTime localDateTime = LocalDateTime.parse("2022-05-30 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  ZoneOffset zoneOffset = ZoneId.systemDefault().getRules().getOffset(localDateTime);
  Instant instant = localDateTime.toInstant(zoneOffset);

  SendRequestConfig config = new SendRequestConfig();
  config.setScheduledDate(instant);

  // send 메소드로 ArrayList<Message> 객체를 넣어도 동작합니다!
  messageService.send(message, config);
} catch (SolapiMessageNotReceivedException exception) {
  // 발송에 실패한 메시지 목록을 확인할 수 있습니다!
  System.out.println(exception.getFailedMessageList());
  System.out.println(exception.getMessage());
} catch (Exception exception) {
  System.out.println(exception.getMessage());
}