https://coolsms.co.kr/
위 링크에서 회원가입 및 로그인 후 API KEY, API SECRET KEY를 발급받는다.
받은 API KEY는 다른 곳에 노출되지 않도록 조심해야 한다.
추후 깃허브에 올릴 것을 대비해, application properties에 아래와 같은 형태로 키 값들을 저장해주었다.
smsApiKey = 복사해온 API KEY
smsSecretKey = 복사해온 API SECRET KEY
이렇게 저장해둔 키 값들은 아래 이미지와 같이 컨트롤러에서 Value 어노테이션으로 호출해 사용해주었다.
https://github.com/coolsms/coolsms-java-examples
위 링크에 예제 및 maven, gradle, kotlin의 의존성 주입 코드가 작성되어 있다.
나는 gradle을 사용했기에 build gradle에 작성해주었다.
gradle에 새로운 의존성 주입을 해주었다면,
꼭 gradle refresh를 해주어야 한다!
진행중인 프로젝트에서 마우스 우클릭 ->
Gradle -> Refresh Gradle Project
의존성 주입까지 끝났다면 코드를 작성할 때가 왔다.
coolsms에서 제공하는 예제 코드를 확인해보면 아래와 같다.
@RestController
public class ExampleController {
final DefaultMessageService messageService;
public ExampleController() {
// 반드시 계정 내 등록된 유효한 API 키, API Secret Key를 입력해주셔야 합니다!
this.messageService = NurigoApp.INSTANCE.initialize("INSERT_API_KEY", "INSERT_API_SECRET_KEY", "https://api.coolsms.co.kr");
}
// 중략
/**
* 단일 메시지 발송 예제
*/
@PostMapping("/send-one")
public SingleMessageSentResponse sendOne() {
Message message = new Message();
// 발신번호 및 수신번호는 반드시 01012345678 형태로 입력되어야 합니다.
message.setFrom("발신번호 입력");
message.setTo("수신번호 입력");
message.setText("한글 45자, 영자 90자 이하 입력되면 자동으로 SMS타입의 메시지가 추가됩니다.");
SingleMessageSentResponse response = this.messageService.sendOne(new SingleMessageSendingRequest(message));
System.out.println(response);
return response;
}
여러 메소드가 있는데, 나는 그 중에서도 단일 메세지 발송만 할거라 해당 예제만 가져왔다.
코드를 살펴보면, 생성자에 API KEY 등을 입력해 새로 정의해주는 모습을 볼 수 있다.
그런데 예제와 동일하게 사용하자니, 나는 UserController 인터페이스를 UserControllerImpl 클래스에서 구현해주는 방식으로 작성하고 있어서 잘 되지 않았다.
그래서 아래와 같이 변형했다.
생성자가 아닌 메소드를 하나 만들어주고, 생성자의 역할을 대신하도록 했다.
이 방식으로 사용할 경우 중간에 @PostConstruct라는 어노테이션을 작성해주어야 작동을 하는데, 이는 UserControllerImpl 클래스가 다 준비된 이후 스프링이 자동으로 해당 메소드를 실행해주도록 하는 역할을 맡고 있다.
생성자가 아닌 @PostConstruct를 사용하는 이유
생성자는 클래스 생성과 동시에 실행된다.
위에서 사용한 @Value를 통해 프로퍼티에 정의된 값을 가져오려면 빈이 다 만들어지고 값이 주입되어야 하는데, 생성자에서는 아직 @Value로 주입된 값들이 준비되지 않았을 수 있다.
그래서 @PostConstruct로 값이 모두 주입된 후에 실행하도록 실행 시점을 늦추는거다.
이제 문자발송 메소드를 작성해보자.
위의 예제를 그대로 사용하는데, 필요에 따라 변경을 했다.
ajax로 문자 발송을 할거라 상단에 @ResponseBody를 작성해주었다.
그리고 인증할 번호를 받아와야 문자를 보낼 수 있으므로, post 형식으로 input 박스에 입력한 값을 받아왔다.
message.setFrom("발신번호");
이 부분에는 회원가입 시 작성한 번호를 입력해준다.
문자 발송 ajax는 위와 같이 작성했다.
메소드가 성공적으로 실행되면 숨겨두었던 인증번호 입력칸이 보이도록 작성했다.
문자 발송에 성공하면 아래와 같이 문자가 오는 것을 확인할 수 있다.
참고로 coolsms 회원가입 시 300 포인트를 제공하고, 발송할 때마다 20 포인트가 차감된다. 결제할게 아니라면 이를 유의해서 작업할 것!
인증 방법은 세션에 임시로 인증번호를 저장해두었다가, 인증에 성공하거나 시간이 만료되면 세션에서도 없애는 방식을 사용했는데, Redis 등을 사용하는 더 좋은 인증 방법도 많으니 따로 작성하지는 않겠다.