Framework/Spring

[Spring Boot]알림톡 보내기

SHXL2 2024. 3. 28. 16:25
반응형

오랜만에 알림톡을 다시 구현할 일이 생겼는데요.

연동 방법을 포스팅으로 남겨도 좋을 것 같아 내용을 정리해봤습니다.

알림톡 사용을 위해서 NHN Notification - KakaoTalk Bizmessage 서비스를 사용했으며, 발신 프로필이 등록되어야 테스트할 수 있습니다.

 

※ 테스트 환경
  • Spring Boot

1. 알림톡 템플릿 등록

알림톡 전송시 사용될 템플릿이 등록되어야 합니다. NHN 접속 후 알림톡 - 템플릿 관리로 이동합니다.

 

템플릿 등록을 통해 각 내용을 기입합니다. 템플릿 내용에는 변수를 사용할 수 있습니다.

템플릿에는 변수를 사용해서 내용을 등록해두고 API 호출시 변수에 대응하는 값을 넣어주면 호출 내용대로 알림톡이 발송됩니다.

*템플릿  : #{이름} 알림톡입니다. 
*API 호출 : 홍길동 알림톡입니다.

 

알림톡에 버튼도 추가할 수 있습니다.

본 예제에서는 버튼 타입의 웹 링크를 테스트해보겠습니다. 각 타입별로 코드가 다르고 API 호출시 해당 코드를 입력해야 합니다.

 

2. API 테스트

2-1) API 키 추가

API 호출시 3개의 키(발신키, 앱키, 시크릿키)가 필요합니다.

발신키는 발신 프로필에서 확인할 수 있고, API 키는 아래 화면에서 확인할 수 있습니다.

 

application.properties

spring.biz.senderKey=발신키
spring.biz.appKey=앱키
spring.biz.secretKey=시크릿키

 

2-2) DTO 생성

package com.app.basic.common.api.biz;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class BizDTO {

	private String templateCode;
	private String mobile;

}

 

컨트롤러에서 반환할 타입 Entity도 생성합니다.

@Data
@Builder
public class MsgEntity {

    private StatusEnum message;
    private Object result;

}

 

2-3) Controller 생성

@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("biz")
public class BizmessageApi {

	private static final String ALIMTALK_API_URL = "https://api-alimtalk.cloud.toast.com/alimtalk/v2.2/appkeys";

    @Value("${spring.biz.senderKey}")
    private String BIZ_SENDER_KEY;
    @Value("${spring.biz.appKey}")
    private String BIZ_APP_KEY;
    @Value("${spring.biz.secretKey}")
    private String BIZ_SECRET_KEY;

    @PostMapping(value="/send")
    public MsgEntity send(@RequestBody BizDTO bizDTO) {
        JSONArray recipientList = new JSONArray();
        recipientList.add(getTemplateBody(bizDTO.getMobile()));

        Map<String, Object> apiParamMap = callRestApi(bizDTO.getTemplateCode(), recipientList);

        return MsgEntity.builder()
                .message(StatusEnum.OK)
                .build();
    }
}

 

2-4) 템플릿 생성 메소드

1. 에서 등록한 알림톡 템플릿과 동일하게 파라미터를 셋팅합니다.

*버튼명이 다르거나 주소가 다른 경우에 전송이 안될 수 있습니다.

public JSONObject getTemplateBody(String mobile) {
    JSONObject recipientJson = new JSONObject();
    recipientJson.put("recipientNo", mobile);
    recipientJson.put("content", "테스트 알림톡입니다.");

    // 템플릿 버튼 추가
    JSONArray buttonList = new JSONArray();
    JSONObject buttonJson = new JSONObject();

    buttonJson.put("ordering", 1);
    buttonJson.put("type"    , "WL");
    buttonJson.put("name"    , "테스트 이동");
    buttonJson.put("linkMo"  , "https://codedream.co.kr");
    buttonJson.put("linkPc"  , "https://codedream.co.kr");
    buttonList.add(buttonJson);

    recipientJson.put("buttons", buttonList);

    return recipientJson;
}

 

2-5) API 호출 메소드

RestTemplate을 이용해 셋팅한 파라미터를 추가해 실제 API를 호출합니다.

private Map<String, Object> callRestApi(
		String templateCode,
		JSONArray recipientList
) {
    String bizApiUrl = ALIMTALK_API_URL + "/" + BIZ_APP_KEY + "/raw-messages";

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.set("X-Secret-Key", BIZ_SECRET_KEY);

    JSONObject paramJson = new JSONObject();
    paramJson.put("senderKey", BIZ_SENDER_KEY);
    paramJson.put("templateCode", templateCode);
    paramJson.put("recipientList", recipientList);

    HttpEntity<String> requestEntity = new HttpEntity<>(paramJson.toString(), headers);

    ResponseEntity<String> responseEntity = restTemplate.postForEntity(bizApiUrl, requestEntity, String.class);
    String responseBody = responseEntity.getBody();

    Map<String, Object> resultMap = new HashMap<>();
    resultMap.put("code", responseEntity.getStatusCodeValue());
    resultMap.put("message", responseEntity.getStatusCode().getReasonPhrase());

    if (responseEntity.getStatusCode() == HttpStatus.OK) {
        JsonParser parser = new JsonParser();
        JsonObject responseData = parser.parse(responseBody).getAsJsonObject();
        resultMap.put("responseData", responseData);
    }

    return resultMap;
}

 

3. 테스트

템플릿코드와 핸드폰 번호를 추가해 테스트해봅니다.

 

참고문서
 

콘솔 사용 가이드 - NHN Cloud 사용자 가이드

Notification > KakaoTalk Bizmessage > 콘솔 사용 가이드 본인 인증 어뷰징 방지를 위한 카카오톡 정책으로 KakaoTalk Bizmessage 서비스에 강화된 본인 인증 사전등록제가 적용되었습니다. 2023년 4월 25일 이후

docs.nhncloud.com

반응형