프로젝트에 무분별한 회원가입을 방지하기 위해 휴대폰 인증 기능을 도입하게 되었다.
CoolSms
라는 문자발송대행 서비스를 찾아 구현하게 되었다.
회원가입 후, API Key 관리로 들어가 새로운 API KEY를 발급받는다.
implementation 'net.nurigo:sdk:4.3.0'
coolsms.apikey = {your_api_key}
coolsms.apisecret = {your_api_secret}
coolsms.fromnumber = {your_phone_number}
// 휴대폰 번호는 반드시 01012345678 형태로 입력
생성한 API KEY를 properties에 추가해줘야 한다.
fromnumber의 경우 송신자 번호로 실제 존재하는 번호로 설정해야 한다.
@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 구현을 해보자.
@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("문자를 전송했습니다.");
}
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SmsRequestDto {
@NotEmpty(message = "휴대폰 번호를 입력해주세요")
private String phoneNum;
}
@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를 사용하는 것은 비효율적이라 생각했다. 또 다른 방안은 다음 포스팅에서 인증번호 확인 기능 구현에 대한 방법을 적겠다.