Post

TIL(20240912) [project:Mixin] 회원가입-인증문자전송

TIL(20240912) [project:Mixin] 회원가입-인증문자전송

오랫만에 인텔리제이를 여니.. 감회가 새롭다..🤣

일단 인증문자 전송 구현전에 대학교 검색 오픈 API가 필요해서 학교 정보 API 신청해두었다. 커리어넷 OPEN API 일단 대학교 검색 API를 구성하기 위해서 두 가지 방법이 있다는 것을 확인했는데, RestTemplate과 Webclient인데 RestTemplate는 구 버전(?) 이라고 하면은 Webclient는 최신 버전 같은 느낌이다. 어쨋든 동기식과 비동기식 처리에서 차이가 있는 것을 확인했는데.. 이 부분에 대해서는 구현할 때 조금 더 깊이 공부가 필요할 듯 하다.

일단 오픈 API 신청 대기중이라 마냥 기다릴 수 없어서 인증문자 전송기능을 구현하려고 넘어왔다.

보통 SMS전송은 SMS 게이트웨이 서비스를 이용하며, 대표적인 서비스로는 Twilio, Nexmo, 카카오톡 알림톡, CoolSMS가 있다. 나는 처음에 네이버클라우드 플랫폼을 사용하려고 시도했는데 사업자만 사용할 수 있는 서비스라고 확인을 해서 Coolsms로 선택했다. (블로그 자료도 훨씬 많았고, 공식문서도 확인할 수 있었다.)

회원가입-> API 발급 -> APIkey와 secret을 메모장에 적어두자. 그리고 추가로 버전을 잘 확인해서 구현을 해야한다. 버전마다 구현 방법이 다른 듯 하다.

💡 Coolsms를 통해 SMS 인증번호 문자전송 구현

1
2
	// nurigo SMS인증
	implementation 'net.nurigo:sdk:4.3.0'

의존성을 추가해주고,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Component
public class SmsCertificationUtil {
    
    @Value("${coolsms.apikey}")
    private String apiKey;

    @Value("${coolsms.apisecret}")
    private String apiSecret;

    @Value("${coolsms.fromnumber}")
    private String fromNumber;

    private 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("[Mixin]인증번호는 " + certificationCode + " 입니다.");

        this.messageService.sendOne(new SingleMessageSendingRequest(message));
    }
}

그리고 sevice layer 패턴을 이용해서 SmsServiceImple은 SmsService를 implements 받아서 해당 클래스에서 실제 구현을 담당하게 된다.

  • 서비스 레이어 (Service Layer): 비즈니스 로직을 담당하며, 다양한 서비스의 메서드를 호출하여 실제 작업을 수행합니다. 이 레이어는 데이터베이스 접근, 외부 API 호출, 트랜잭션 처리 등과 같은 비즈니스 로직을 포함합니다.
  • 서비스 인터페이스 (Service Interface): 서비스 레이어의 메서드를 정의하는 인터페이스로, 구현체와의 의존성을 줄이기 위해 사용됩니다.
  • 서비스 구현체 (Service Implementation): 인터페이스에서 정의한 메서드를 실제로 구현한 클래스입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
@RequiredArgsConstructor
public class SmsServiceImpl implements SmsService{

    private final SmsCertificationUtil smsCertificationUtil;

    @Override
    public void sendSms(SmsRequestDto smsRequestDto) {
        String phoneNumber = smsRequestDto.getPhoneNumber();
        String certificationCode = Integer.toString((int)(Math.random() * (999999 - 100000 + 1)) + 100000);
        smsCertificationUtil.sendSMS(phoneNumber, certificationCode);
    }
}

마지막으로 controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class AuthController {

	private final AuthService authService;
	private final SmsService smsService;

	@PostMapping("/signup/sms")
	public ResponseEntity<CommonResponse<String>> sendSms(@Valid @RequestBody SmsRequestDto smsRequestDto) {
		smsService.sendSms(smsRequestDto);
		CommonResponse<String> response = new CommonResponse<>("인증번호가 발송되었습니다.", 200, null);
		return new ResponseEntity<>(response, HttpStatus.OK);
	}
}

controller의 역할

  • 요청 수신 및 처리: 클라이언트(사용자 또는 다른 시스템)로부터의 HTTP 요청을 수신하고, 요청 URL, HTTP 메서드(GET, POST 등)에 따라 적절한 메서드를 호출합니다.
  • 비즈니스 로직 호출: 요청에 따라 필요한 비즈니스 로직을 수행하기 위해 서비스 레이어의 메서드를 호출합니다. 서비스 레이어는 비즈니스 로직을 처리하며, 컨트롤러는 이러한 서비스를 호출하여 결과를 얻습니다.
  • 데이터 변환: 요청에서 전달된 데이터를 필요한 형태로 변환하거나, 응답 데이터를 클라이언트에 맞는 형태로 변환합니다. 예를 들어, 요청 파라미터를 DTO(Data Transfer Object)로 변환하거나, 서비스로부터 받은 데이터를 JSON 또는 HTML로 변환합니다.
  • 응답 생성: 서비스 레이어에서 처리된 결과를 바탕으로 HTTP 응답을 생성합니다. 이는 웹 페이지, JSON 데이터, XML 데이터 등 다양한 형태가 될 수 있습니다.
  • 에러 처리: 요청 처리 중 발생할 수 있는 예외를 처리하여 적절한 에러 메시지나 페이지를 반환합니다.

참고 CoolSMS를 통해 프로젝트에 휴대폰 인증 기능 구현

This post is licensed under CC BY 4.0 by the author.