CoolSmsClient.java

package com.deveagles.be15_deveagles_be.features.messages.command.infrastructure;

import com.deveagles.be15_deveagles_be.features.messages.command.application.dto.SmsSendUnit;
import com.deveagles.be15_deveagles_be.features.messages.command.application.dto.response.MessageSendResult;
import jakarta.annotation.PostConstruct;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import net.nurigo.sdk.NurigoApp;
import net.nurigo.sdk.message.model.FailedMessage;
import net.nurigo.sdk.message.model.Message;
import net.nurigo.sdk.message.response.MultipleDetailMessageSentResponse;
import net.nurigo.sdk.message.service.DefaultMessageService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class CoolSmsClient {

  private DefaultMessageService messageService;

  @Value("${coolsms.apiKey}")
  private String apiKey;

  @Value("${coolsms.apiSecret}")
  private String apiSecret;

  @PostConstruct
  public void init() {
    this.messageService =
        NurigoApp.INSTANCE.initialize(apiKey, apiSecret, "https://api.coolsms.co.kr");
  }

  public List<MessageSendResult> sendMany(String sender, String content, List<SmsSendUnit> units) {
    List<Message> messages =
        units.stream()
            .map(
                unit -> {
                  Message message = new Message();
                  message.setFrom(sender);
                  message.setTo(unit.phoneNumber());
                  message.setText(content);
                  return message;
                })
            .toList();

    try {
      // 동기 호출
      MultipleDetailMessageSentResponse response = messageService.send(messages, false, true);

      // 실패한 번호 리스트 추출
      List<String> failedNumbers =
          response.getFailedMessageList().stream().map(FailedMessage::getTo).toList();

      // 각 유닛에 대해 결과 생성
      return units.stream()
          .map(
              unit -> {
                boolean isSuccess = !failedNumbers.contains(unit.phoneNumber());
                return new MessageSendResult(
                    isSuccess, isSuccess ? "발송 성공" : "발송 실패", unit.messageId());
              })
          .toList();

    } catch (Exception e) {
      log.error("CoolSMS sendMany 예외", e);
      String message = e.getMessage() != null ? e.getMessage() : "알 수 없는 예외 발생";

      // 예외 시 모든 메시지를 실패 처리
      return units.stream()
          .map(unit -> new MessageSendResult(false, "예외 발생: " + message, unit.messageId()))
          .toList();
    }
  }
}