hyeonga_code

reProject_49_JAVA/SPRING SMS 문자 보내기 기능 구현 본문

Project_WEATHERWEAR

reProject_49_JAVA/SPRING SMS 문자 보내기 기능 구현

hyeonga 2024. 2. 22. 05:59
반응형

 

2024.02.21

문자 보내기 기능 구현하기

-- 회원 가입 후 이용해도 되지만 연결이 어려울 수도 있기에 무료체험 버전으로 연결해본 후 구현이 되는 경우 회원가입을 진행하려고 하였으나 발신번호를 등록할 수 없어 회원가입 후 진행해야 한다.

 

-- https://coolsms.co.kr/ 접속 > 회원가입 > 로그인

 

세상에서 가장 안정적이고 빠른 메시지 발송 플랫폼 - 쿨에스엠에스

손쉬운 결제 전용계좌, 신용카드, 계좌이체 등 국내 결제 뿐만 아니라 해용신용카드로 한번의 카드번호 등록으로 자동충전까지 지원합니다. 전용계좌, 신용카드, 계좌이체 등 다양한 결제 방식

coolsms.co.kr

 

 

 

https://developers.coolsms.co.kr/sdk-list/Java/send-message 참고하여 작업

 

메시지 발송 예제 | Documents for COOLSMS Developers

해당 페이지에서는 COOLSMS Java/Kotlin SDK를 이용하여 메시지를 발송하는 방법에 대해 가이드하고 있습니다.

developers.coolsms.co.kr

https://github.com/coolsms/coolsms-java-examples 참고하여 작업

 

GitHub - coolsms/coolsms-java-examples: CoolSMS Java/Kotlin SDK 예제 목록

CoolSMS Java/Kotlin SDK 예제 목록. Contribute to coolsms/coolsms-java-examples development by creating an account on GitHub.

github.com

>>> 최종적으로 다른 방법을 사용

 

-- 주의사항

---- 발송 요청시, 발신번호, 수신번호에는 기호가 포함되지 않아야 합니다.

 

 

-- 로그인 >> 개발/연동 >> API KEY 관리

-- 새 API 키 생성 시 예제를 확인할 수 있다.

 

 

 

- pom.xml 라이브러리 추가

<!-- 문자보내기 -->
    <dependency>
        <groupId>net.nurigo</groupId>
        <artifactId>sdk</artifactId>
        <version>4.2.7</version>
    </dependency>
	<!-- json 사용을 위한 추가 -->
    <dependency>
        <groupId>net.nurigo</groupId>
        <artifactId>javasdk</artifactId>
        <version>2.2</version>
    </dependency>

 

 

- properties 추가

#coolsms
api.key= [ API 키 값 ]
api.secretKey= [ APISecret 키 값 ]
sms.phoneNumber= [ 등록한 발신 번호 ]

 

1차 시도

-- 깃 허브에 나와있는 예제를 보며 열심히 작성하였으나, 오류 발생

SEVERE: 경로 [/w2]의 컨텍스트 내의 서블릿 [client]을(를) 위한 Servlet.service() 호출이, 
근본 원인(root cause)과 함께, 예외 [Handler dispatch failed; nested exception is 
java.lang.NoSuchFieldError: Companion]을(를) 발생시켰습니다.
java.lang.NoSuchFieldError: Companion
	at net.nurigo.sdk.message.service.DefaultMessageService.<init>(DefaultMessageService.kt:39)
	at net.nurigo.sdk.NurigoApp.initialize(NurigoApp.kt:8)
    ...
	@Value("${sms.phoneNumber}")
	private String FROM_NUMBER;

	@Value("${api.key}")
	private String APIKEY;
	
	@Value("${api.secretKey}")
	private String SECRETKEY;	

	private DefaultMessageService messageService;

/** 단일 메세지 발송 예제 */
	public SingleMessageSentResponse sentOneMessage() {
		System.err.println("FROM_NUMBER : " + FROM_NUMBER);
		System.err.println("APIKEY : " + APIKEY);
		System.err.println("SECRETKEY : " + SECRETKEY);
		this.messageService = NurigoApp.INSTANCE.initialize(APIKEY, SECRETKEY, "https://api.coolsms.co.kr");
		
		
		// Message 패키지가 중복되는 경우 > net.nurifo.sdk.message.model.Message로 치환
		Message message = new Message();
		
		message.setFrom(FROM_NUMBER);	//발신번호
		message.setTo(FROM_NUMBER);	// 수신번호
		message.setText("한건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
		// message.setSubject("문자제목"); > 파라미터 추가 시 자동으로 LMS로 변환됩니다.
		
		SingleMessageSentResponse response = messageService.sendOne(new SingleMessageSendingRequest(message));
		System.err.println("response : " + response);
		

		Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
		
		return response;
	}
    
/** 여러건 메세지 발송 예제 */ 
	@RequestMapping("testMultiMessage.do")
	public MultipleDetailMessageSentResponse sentMultiMessage() {
		DefaultMessageService messageService = NurigoApp.INSTANCE.initialize(APIKEY, SECRETKEY, "https://api.coolsms.co.kr");
		ArrayList<Message> messageList = new ArrayList<>();
		
		ArrayList<String> phoneNumber = new ArrayList<String>(){{
			add(FROM_NUMBER);
			add(FROM_NUMBER); 
			add(FROM_NUMBER);
		}};
		
		for(int i=0; i<phoneNumber.size(); i++) {
			Message message = new Message();
			
			message.setFrom(FROM_NUMBER);
			message.setTo(phoneNumber.get(i));
			message.setText("다건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
			
			// 메세지마다 커스텀하고 싶은 경우 map 형태로 기입후 전송
			HashMap<String, String> map = new HashMap<>();
			
			map.put("key", "value");
			message.setCustomFields(map);
			
			messageList.add(message);
		}
		
		try {
			/**
			 *  send 메소드로 단일 Message 객체 넣어도 동작
			 *  세 번째 파라미터인 showMessageList 값을 true로 설정하는 경우 
			 *  	> MultipleDetailMessageSentResponse에서 MessageList반환
			 */
			MultipleDetailMessageSentResponse response = messageService.send(messageList, false, true);
			// 중복 수신번호 허용 > this.messageService.send(messageList, true);
			
			System.err.println("response : " + response);
		} catch(NurigoMessageNotReceivedException e) {
			System.err.println(e.getFailedMessageList());
			System.err.println(e.getMessage());
			e.printStackTrace();
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}

 

 

2차 시도

>> 다른 방법 시도 

 

- java-sdk-2.1.zip 다운받기

---- java-sdk-2.1 > src

------ Coolsms.java

------ Https.java

 

- 두 파일 원하는 패키지에 복사

---- 각각 package 정보를 변경해주어야 한다.

 

- lib 폴더의 json-simple-1.1.1.jar 파일을 프로젝트의 라이브러리에 추가

 

ContactController.java 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.w2.admin.controller;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.w2.util.SmsUtil;
 
@Controller
public class ContactController {
 
    @Autowired
    private SmsUtil smsUtilService;
    
    /** 단일 메세지 발송 예제 */
    @RequestMapping("testOneMessage.do")
    public String sentOneMessage() {
        return smsUtilService.sentOneMessage();
    }
}
 

 

 

SmsUtil.java 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.w2.util;
 
import java.util.HashMap;
 
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
 
import net.nurigo.sdk.message.model.Message;
 
@Component
@PropertySource("classpath:config/webserverdb.properties")
public class SmsUtil {
 
    @Value("${sms.phoneNumber}")
    private String FROM_NUMBER;
 
    @Value("${api.key}")
    private String APIKEY;
    
    @Value("${api.secretKey}")
    private String SECRETKEY;    
 
    /** 단일 메세지 발송 예제 */
    public String sentOneMessage() {
        Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
        HashMap<StringString> set = new HashMap<StringString>();
        
        // Message 패키지가 중복되는 경우 > net.nurifo.sdk.message.model.Message로 치환
        Message message = new Message();
        
        set.put("from", FROM_NUMBER);    //발신번호
        set.put("to", FROM_NUMBER);    // 수신번호
        set.put("text""한건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
        set.put("type""sms");
        
        // 전송 결과 확인
        JSONObject result = coolsms.send(set);
        
        if((boolean)result.get("status"== true) {
            System.err.println("성공 =====");
            /**
             result.get("")
                 - group_id            : 그룹아이디
                 - result_code        : 결과코드
                 - result_message    : 결과메세지
                 - success_count        : 메세지아이디
                 - error_count        : 다건 전송시 오류 수
             */
        } else {
            System.err.println("실패 =====");
            /**
             result.get("")
                 - code            : REST API 에러코드
                 - message        : 에러메세지
             */
        }
        return "redirect:test.do";
    }
}
 

 

>>> 실행(http://localhost:8080/w2/testOneMessage.do)

 

 

한 건인 경우 문자가 잘 온다.

 

프로젝트에 적용할 때에는 다건을 넘길 수도 있어 이를 어떻게 처리할까 고민했다.

문자를 보낼 때 필요한 데이터는

-- text : 메세지 내용

-- to : 수신인 전화번호

-- type : sms / lms

 

다건 발송 시 사용자별로 커스텀 메세지를 보내는 경우가 있으므로 text도 같이 설정하도록 한다. 

  ex) 000 님 할인쿠폰이 발행되었습니다.

 

HashMap<HashMap<String, String>>과 List<HashMap<String, String>> 중 List로 작업했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.w2.util;
 
import java.util.HashMap;
import java.util.List;
 
import org.json.simple.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
 
@Component
@PropertySource("classpath:config/webserverdb.properties")
public class SmsUtil {
 
    @Value("${sms.phoneNumber}")
    private String FROM_NUMBER;
 
    @Value("${api.key}")
    private String APIKEY;
    
    @Value("${api.secretKey}")
    private String SECRETKEY;    
    
    // user(name_이름, text_문자, to_전화번호)
    public HashMap<String, JSONObject> sentMessage(List<HashMap<StringString>> toList) {
        Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
        HashMap<StringString> setMessage = new HashMap<StringString>();
        HashMap<String, JSONObject> resultMap = new HashMap<String, JSONObject>();
        
        setMessage.put("from", FROM_NUMBER);
        for(HashMap<StringString> user : toList) {
            setMessage.put("text", (String)user.get("text"));
            setMessage.put("to", (String)user.get("to").replace("-","").replace("/"""));
            if(((String)user.get("text")).length() < 45) {
                setMessage.put("type""sms");
            } else {
                setMessage.put("type""lms");
            }
            
            // 전송 결과 확인
            JSONObject result = coolsms.send(setMessage);
            
            //이름_전화번호 : result
            resultMap.put((String)user.get("name"+ "_" + (String)user.get("to"), result);
            if((boolean)result.get("status"== true) {
                System.err.println("성공 =====");
                /**
                 result.get("")
                     - group_id            : 그룹아이디
                     - result_code        : 결과코드
                     - result_message    : 결과메세지
                     - success_count        : 메세지아이디
                     - error_count        : 다건 전송시 오류 수
                 */
            } else {
                System.err.println("실패 =====");
                /**
                 result.get("")
                     - code            : REST API 에러코드
                     - message        : 에러메세지
                 */
            }
        }
        return null;
    }
    
    
    /** 단일 메세지 발송 예제 */
    public String sentOneMessage() {
        Coolsms coolsms = new Coolsms(APIKEY, SECRETKEY);
        HashMap<StringString> set = new HashMap<StringString>();
        set.put("from", FROM_NUMBER);    //발신번호
        set.put("to", FROM_NUMBER);    // 수신번호
        set.put("text""한건발송예제 : SMS/한글:45자,영문:90자, 그 이상인 경우 LMS로 변환");
        set.put("type""sms");
        
        // 전송 결과 확인
        JSONObject result = coolsms.send(set);
        
        if((boolean)result.get("status"== true) {
            System.err.println("성공 =====");
            /**
             result.get("")
                 - group_id            : 그룹아이디
                 - result_code        : 결과코드
                 - result_message    : 결과메세지
                 - success_count        : 메세지아이디
                 - error_count        : 다건 전송시 오류 수
             */
        } else {
            System.err.println("실패 =====");
            /**
             result.get("")
                 - code            : REST API 에러코드
                 - message        : 에러메세지
             */
        }
        return "redirect:test.do";
    }
}
 

 

반응형