해당 형식으로 인터넷에서 핸드폰으로 메세지가 들어오는 경우가 종종 있는데 이것을 실제 DB에 존재하는 전화번호에 전송 및 자동화를 진행하려고 한다.

 

 

초기 회원가입시 300P를 제공하며 무료로 메세지 전송 15건을 사용할수 있다. 감사히 사용하자!

(카카오톡은 메세지 1건에 17원이 들어서 이거로 진행한다!...ㅠ)

링크 : https://api.coolsms.co.kr


의존성 넣기

net.nurigo

라고 하는 JAVA SDK의 그룹ID로 메세지를 보내는 로직(DefaultMessageService)을 위해 의존성을 추가하였다.

 

pom.xml

<dependency>
			<groupId>net.nurigo</groupId>
			<artifactId>sdk</artifactId>
			<version>4.2.7</version>
		</dependency>

테스트용 코드

jsp페이지에서 /sendSms라는 요청이 들어올때 진행되는 코드로 실제 내 번호 

 

Controller

@RequestMapping("/sendSms")
    public String sendSms(HttpServletRequest request) throws Exception {

		DefaultMessageService messageService =  NurigoApp.INSTANCE.initialize("개인 API키", "Secrit API키", "https://api.coolsms.co.kr");
		//예시 : DefaultMessageService messageService =  NurigoApp.INSTANCE.initialize("N....UF", "3........QX", "https://api.coolsms.co.kr");
        Message message = new Message();
		message.setFrom("보낼사람 번호");
		message.setTo("받을사람 번호");
		message.setText("메세지 보내기 완료");

		try {
		  messageService.send(message);
		} catch (NurigoMessageNotReceivedException exception) {
		  System.out.println(exception.getFailedMessageList());
		  System.out.println(exception.getMessage());
		} catch (Exception exception) {
		  System.out.println(exception.getMessage());
		}
      return "notice/notice";
    }

 

 

만일 문제없이 작동이 되도록 하였다면 하단의 사진과 같은 결과를 볼수있다.

 

실제 코드( messageService.send(message); 부분)를 확인해보니 Kotlin함수로 이뤄져있었고

//1. 예외처리 어노테이션
@Throws(
        NurigoMessageNotReceivedException::class,
        NurigoEmptyResponseException::class,
        NurigoUnknownException::class
    )
//2. send함수 정의
    fun send(message: Message): MultipleDetailMessageSentResponse {
//3. 메세지 전송 요청
        val multipleParameter = MultipleDetailMessageSendingRequest(
            messages = listOf(message),
            scheduledDate = null
        )
//4.HTTP 요청 실행
        val response = this.messageHttpService.sendManyDetail(multipleParameter).execute()
//5. 응답처리
        if (response.isSuccessful) {
            val responseBody = response.body()
//6. 성공시 본문처리
            if (responseBody != null) {
                val count: Count = responseBody.groupInfo?.count ?: Count()
                val failedMessageList = responseBody.failedMessageList
//7. 전송실패
                if (failedMessageList.isNotEmpty() && count.total == failedMessageList.count()) {
                    // TODO: i18n needed
                    val messageNotReceivedException = NurigoMessageNotReceivedException("메시지 발송 접수에 실패했습니다.")
                    messageNotReceivedException.failedMessageList = failedMessageList
                    throw messageNotReceivedException
                }
//8. 반환
                return responseBody
            }
            throw NurigoEmptyResponseException("서버로부터 아무 응답을 받지 못했습니다.")
        } else {
            val errorString = response.errorBody()?.string() ?: "Server error encountered"
            throw NurigoUnknownException(errorString)
        }
    }

로직은 다음과 같았다.

1. 자바에서 코틀린 호출이 안될경우 해당 어노테이션을 사용한다

2. fun을 통한 send 함수 정의

3. 실제 메세지를 넣을객체 생성

4. http 요청

5. 네트워크 통신을 확인

6. 네트워크 통신이 성공(할경우 메세지를 넣은 객체를 저장

7. 전송 실패시 예외를 객체에 저장

8. 객체 반환

 

의문점

여기서 5. 의 네트워크 통신을 확인 부분에서 의문점이 들었다.

 !=null이면 이라고 작성되있는데 이것이 만약 sucess가 아니라 timeout으로 안되는 상황이라 error가 반환된 상황이라면 이건 에러가 아닐까?

해당 부분을 확인해보니 GPT의 답변은 다음과 같았다.

오류 응답: 요청 처리 중 오류가 발생했지만,서버가 여전히 HTTP 응답을 반환하는 경우입니다.
이때 responseBody는 오류 메시지나 오류 코드 등 오류와 관련된 정보를 담을 수 있습니다.
이 경우 responseBody가 null이 아니더라도 요청 자체는 실패한 것으로 간주됩니다.

 

즉, responseBody에서 해당 로직이 잘못된건지 아닌지는 정보를 가져온뒤 열어보면 확인이 가능하며 실제 개발자 도구의 network탭의 preview와 initiator 사이에 있는 response에서 확인이 가능하다.

 

참고 링크 : https://dlgkstjq623.tistory.com/344

'Spring' 카테고리의 다른 글

스프링 시큐리티  (0) 2024.02.20
웹에서 핸드폰으로 메세지 보내기 - 2  (0) 2024.02.05
카카오 api 로그인  (0) 2024.02.04
Mybatis, BulkInsert  (0) 2024.02.01
putty를 활용해 EC2에 접근하기  (0) 2024.02.01

+ Recent posts