[Spring] 문자 인증 구현하기 - coolSMS

Dunkin00·2023년 6월 28일
3
post-thumbnail

항해 99 최종 프로젝트를 진행 중 Nice API와 같은 인증 서비스를 도입하고 싶었으나, 사업자 등록이 필요하다는 답변을 받고 차선책으로 이메일 찾기 기능의 인증 수단으로서 사용하였습니다.

Old-Version Java SDK 2.~ 의 레퍼런스는 많았지만
최신 버전인 4.3은 레퍼런스를 찾을 수 없어서 coolSMS에서 제공해준 예제 코드를 바탕으로 작성했습니다.

coolsms-java-examples
https://github.com/coolsms/coolsms-java-examples

이 글이 누군가에게 도움이 될 수 있길 바랍니다.

CoolSMS 사용 준비

coolSMS는 한 건당 20P(충전 포인트), 첫 가입시 300P를 지급해준다.

Spring 적용

  • build.gradle 의존성 추가

implementation 'net.nurigo:sdk:4.3.0'
  • application.yml

coolsms:
  api:
    key: "your API Key"
    secret: "your API Secret"
  • application.properties(사용시)

coolsms.api.key="your API Key"
coolsms.api.secret="your API Secret"
  • SmsUtil

@Component
public class SmsUtil {

    @Value("${coolsms.api.key}")
    private String apiKey;
    @Value("${coolsms.api.secret}")
    private String apiSecretKey;

    private DefaultMessageService messageService;

    @PostConstruct
    private void init(){
        this.messageService = NurigoApp.INSTANCE.initialize(apiKey, apiSecretKey, "https://api.coolsms.co.kr");
    }
	
    // 단일 메시지 발송 예제
    public SingleMessageSentResponse sendOne(String to, String verificationCode) {
        Message message = new Message();
		// 발신번호 및 수신번호는 반드시 01012345678 형태로 입력되어야 합니다.
        message.setFrom("발신번호 입력");
        message.setTo(to);
        message.setText("[Moyiza] 아래의 인증번호를 입력해주세요\n" + verificationCode);

        SingleMessageSentResponse response = this.messageService.sendOne(new SingleMessageSendingRequest(message));
        return response;
    }
    
}
  • UserService

    사용자의 이름과 핸드폰 번호를 입력 받아 조회 후, verificationCode를 문자로 보낸다.
    인증코드와 사용자의 이메일을 key, value로 redis에 저장해서 올바른 code를 입력하면
    이메일을 반환할 수 있도록 작성했습니다.
    redis의 자세한 내용은 아래 링크로 들어가면 확인할 수 있습니다.
public ResponseEntity<?> sendSmsToFindEmail(FindEmailRequestDto requestDto) {
        String name = requestDto.getName();
        //수신번호 형태에 맞춰 "-"을 ""로 변환
        String phoneNum = requestDto.getPhoneNum().replaceAll("-","");
        
        User foundUser = userRepository.findByNameAndPhone(name, phoneNum).orElseThrow(()->
                new NoSuchElementException("회원이 존재하지 않습니다."));
                
        String receiverEmail = foundUser.getEmail();
        String verificationCode = validationUtil.createCode();
        smsUtil.sendOne(phoneNum, verificationCode);
        
        //인증코드 유효기간 5분 설정
        redisUtil.setDataExpire(verificationCode, receiverEmail, 60 * 5L);

        return ResponseEntity.ok(new Message("SMS 전송 성공"));
    }

RedisUtil 설정 게시글 확인

💡 확인


정상적으로 문자가 전송되는걸 확인할 수 있습니다.

📚 참고

profile
🌊 파도가 칠 때는 서핑을

1개의 댓글

comment-user-thumbnail
2024년 8월 16일

안녕하세요 혹시 구현하실때 발송번호는 어떻게 설정하셨나요?
개인 핸드폰 번호말고 다른 번호를 등록하고 싶은데 증명서를 요구하는것 같아서요

답글 달기