[SpringBoot] CoolSMS를 통해 프로젝트에 휴대폰 인증 기능 구현[1]

한동근·2024년 6월 1일
0

SpringBoot

목록 보기
9/12

프로젝트에 무분별한 회원가입을 방지하기 위해 휴대폰 인증 기능을 도입하게 되었다.

CoolSms라는 문자발송대행 서비스를 찾아 구현하게 되었다.


https://coolsms.co.kr/

준비

회원가입 후, API Key 관리로 들어가 새로운 API KEY를 발급받는다.

  • build.gradle 의존성 추가
implementation 'net.nurigo:sdk:4.3.0'
  • application.properties 설정 추가
coolsms.apikey = {your_api_key}
coolsms.apisecret = {your_api_secret}
coolsms.fromnumber = {your_phone_number}
// 휴대폰 번호는 반드시 01012345678 형태로 입력

생성한 API KEY를 properties에 추가해줘야 한다.
fromnumber의 경우 송신자 번호로 실제 존재하는 번호로 설정해야 한다.

  • SmsCertificationUtil 코드
@Component
public class SmsCertificationUtil {

    @Value("${coolsms.apikey}") // coolsms의 API 키 주입
    private String apiKey;

    @Value("${coolsms.apisecret}") // coolsms의 API 비밀키 주입
    private String apiSecret;

    @Value("${coolsms.fromnumber}") // 발신자 번호 주입
    private String fromNumber;

    DefaultMessageService messageService; // 메시지 서비스를 위한 객체

    @PostConstruct // 의존성 주입이 완료된 후 초기화를 수행하는 메서드
    public void init(){
        this.messageService = NurigoApp.INSTANCE.initialize(apiKey, apiSecret, "https://api.coolsms.co.kr"); // 메시지 서비스 초기화
    }

    // 단일 메시지 발송
    public void sendSMS(String to, String certificationCode){
        Message message = new Message(); // 새 메시지 객체 생성
        message.setFrom(fromNumber); // 발신자 번호 설정
        message.setTo(to); // 수신자 번호 설정
        message.setText("본인확인 인증번호는 " + certificationCode + "입니다."); // 메시지 내용 설정

        this.messageService.sendOne(new SingleMessageSendingRequest(message)); // 메시지 발송 요청
    }
}

준비단계는 모두 끝났다. 이제 API 구현을 해보자.

구현

  • Controller
@RestController
@RequestMapping("/sms")
public class SmsController {

    private final SmsService smsService;

    public SmsController(@Autowired SmsService smsService){
        this.smsService = smsService;
    }

    @PostMapping("/send")
    public ResponseEntity<?> SendSMS(@RequestBody @Valid SmsRequestDto smsRequestDto){
        smsService.SendSms(smsRequestDto);
        return ResponseEntity.ok("문자를 전송했습니다.");
    }
}
  • Dto
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SmsRequestDto {
    @NotEmpty(message = "휴대폰 번호를 입력해주세요")
    private String phoneNum;
}
  • Service
@Service
public class SmsServiceImpl implements SmsService {

    private final SmsCertificationUtil smsCertificationUtil;

    //의존성 주입
    public SmsServiceImpl(@Autowired SmsCertificationUtil smsCertificationUtil) {
        this.smsCertificationUtil = smsCertificationUtil;
    }

    @Override // SmsService 인터페이스 메서드 구현
    public void SendSms(SmsRequestDto smsRequestDto) {
        String phoneNum = smsRequestDto.getPhoneNum(); // SmsrequestDto에서 전화번호를 가져온다.
        String certificationCode = Integer.toString((int)(Math.random() * (999999 - 100000 + 1)) + 100000); // 6자리 인증 코드를 랜덤으로 생성
        smsCertificationUtil.sendSMS(phoneNum, certificationCode); // SMS 인증 유틸리티를 사용하여 SMS 발송
    }
}

이제 http://localhost:8080/sms/send 에 Postman 요청을 보내보자.

성공적으로 인증번호가 전송되었다!

인증번호 확인은?

랜덤 생성된 인증번호를 검증하는 기능이 필요했다. 휴대폰 번호와 그에 따른 인증번호를 잠시 저장하고 삭제하는 저장 공간이 필요했지만, 이 기능을 구현하는데 MySQL과 MariaDB를 사용하는 것은 비효율적이라 생각했다. 또 다른 방안은 다음 포스팅에서 인증번호 확인 기능 구현에 대한 방법을 적겠다.

profile
와플대조교의 개발 블로그

0개의 댓글