스프링 휴대전화 인증 - naver cloud sms를 사용해보자.

jinvicky·2023년 3월 6일
0

2023 Spring Project TIL

목록 보기
26/32

네이버 스마트 스토어의 경우 판매자 가입을 할 때 휴대전화 인증과 계좌인증을 진행한다.
판매자 가입이 아니더라도 api 사용을 많이 해보고 싶어서 달에 50건을 무료로 제공하는 네이버를 택했다.

쉬워보였는데 뭐가 이리 에러가 많지?

시작은 아래 블로그를 보고 시작했다. 클래스도 몇 개 없고 블로그의 결과화면을 보고
어 나도? 이 정도면 할 수 있겠다? 해서 시작했다.
https://giron.tistory.com/75

근데 인생 너무 고달프다... 일단 애플리케이션 설정은 위 블로그가 너무 설명 잘 해놓아서 스킵한다.
첫번째 에러 - json과 LocalDateTime 타입 변환

서버 에러 500에 메세지는 대충 NoHttpMessageConverterFound 식이었다. 자세히 보니 json과 LocalDateTime 사이의 변환에 문제가 있는 거 같았다.

내가 해본 방법들

  • 검색해서 @Jsonformat, @DateFormat 등등 온갖 형식 변환 애너테이션 전부 복붙하기
  • @Value 애너테이션을 이해 못해서 private iv에 하드코딩하기(일단 먼저 돌아가게 하기 위해서였다)
  • sendSms()에도 억지로 포맷 애너테이션 전부 복붙하기 (생각해보니 이건 아니었다;;)

에러메세지 중에서는 serialize, deserialize 키워드도 있었다. 그대로 복붙해서 다시 검색한다.
그냥 에러는 내용 바꿔가면서 키워드 조절해서 계속 파는 게 답이다. 왕도? 그런 거 없어.....

그리고 때로는 끄고 시간 좀 보내다 다시 해보면 되더라....
@DateTimeFormat 애너테이션과 껐다 이틀 있다 키기로 해결했다..
왜냐하면 바로 저 애너테이션 적용이 안 먹혔었기 때문이다...

그러면 배열로 requestTime 값이 넘어온다.

사실 한글이 ???로 뜨는 이슈도 있었는데 3일 삽질하고 포기했다.

다음 이슈는 갑자기 뜨는 noclassdeffounderror jsr310 이슈다.
갑자기 프로젝트 실행에 실패했다. 원인은 jsr310 라이브러리의 버전에 있다.
아래 사이트가 나를 구했다...
https://sejoung.github.io/2018/06/2018-06-21-JSR310/#JSR-310-Date-and-Time-API

해결: jackson-databind의 버전을 2.12.4로 높인다.

개선해보자 : iv에 박아버린 애플리케이션 개인 정보를 별도 파일로 분리해서 불러오자.
키값을 그대로 박는 것은 보안적으로 안 좋다고 한다. 처음에 기능 구현할 때는 @Value()안의 키값이 어디서부터 오는 것인지 알지 못했다.

1차: 검색을 해서 @Value의 사용법을 알아내서 @Value("${sms.secretKey}") 식으로 iv에 붙이고 resources 아래에 api_info.properties 파일을 만들었다. 근데 iv를 찍어보니까 ${sms.secretKey}가 그대로 출력된다... 예제를 뒤져봐도 내용은 이게 다였는데????

2차: 내용 찾을 때까지 검색을 시전한다. 경험으로 미루어 보건데 내가 설정 하나를 분명 빼먹었을 거란 확신이 있었다. 찾고 찾다가 https://j-sik.tistory.com/m/109에서 답을 찾았다.

xml설정과 애너테이션 설정이 있는데 나는 애너테이션 설정을 택했다.
이유: 한 파일에 코드와 설정이 있는게 나중에 설정 위치를 까먹어도 찾기가 쉬울 거 같았다.
xml파일의 경우 한 둘이 아니라서 맨날 얘가 어딨지하고 돌아다녔다. 아래처럼 설정했다!

와 또 에러나네??? 트루릴리?
정신이 나갈 것 같지만 다시 한다. 중첩 에러였다. 서버에서 발생한 에러인데 메세지 내용을 보니 401 httpClientException이 섞여 있었다. 검색해보니 사용했던 RestTemplate에서 자체적 에러가 발생했을 때라는 걸 알게 되었다. 일단 에러핸들러 처리를 추가했다.
핸들러를 추가하면 Exception 발생 대신, 에러가 발생할 경우 response가 null이 온다.

 RestTemplate restTemplate = new RestTemplate();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
            public boolean hasError(ClientHttpResponse response) throws IOException {
                //resttemplate 401 내부 에러 처리
                HttpStatus status = response.getStatusCode();
                return status.series() == HttpStatus.Series.SERVER_ERROR;
            }
        });

하지만 자체적인 에러 해결을 하지는 못했다. RestTemplate문제라면 내가 자주 연습을 위해 바꾸었던 application key 설정 값들을 properties에서 불러오게 다시 시도해볼까? 생각했다.
(이때는 돌아가게 하기 위해 iv로 다시 하드코딩한 상태였는데 이게 오히려 방해였는 듯하다.)
@Value 애너테이션으로 바꾸었더니 해결되었다. 이제 제대로 인증번호를 전송한다.

배운점

  • 라이브러리 버전은 정말 중요하다. restart server, redeploy가 실패할 때, pom.xml의 의존성 라이브러리 버전을 높이거나 연관 라이브러리와 맞춰주었더니 에러가 해결된 적이 많았다. ${}로 버전을 맞추거나 검색을 계속 해서 다른 사람들이 몇 버전을 썼는지 캐치하는 안목을 기르자.
  • 껐다 킨다, 찬바람 좀 쐬고 온다 => 가끔 360도 돌리면 해결된다는 소리가 괜한 소리는 아니다...
  • 스프링은 항상 설정인 듯 하다. 뭐가 안된다? 내가 설정을 빼먹은 것이다. 항상 객체를 빈으로 등록해야 주입이 이루어질 수 있듯이, 이건 등록 안하나? 고민을 해보는 게 좋다. (@Value가 여기 해당)
  • postman 같은 테스트 도구를 적극 사용하자! 이번에 테스트만 50번 정도 돌렸다. 무료 건수 넘길까봐 호곡했다.

*안된다고 하지 말고 방법을 찾아! 따라친다고 되면 좋지만 안되면 그 코드만 깔짝대지 말고 더 넓게 보도록 하자. 찾아보면서 에러 핸들링이나 다른 라이브러리 설정에 대해서 알게 되는 것이 참 신기하다.

나에게 고생을 안겨준 pom.xml 설정

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
		<dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-jsr310</artifactId>
			<version>2.14.2</version>
		</dependency>

<!--		버전 무조건 2.12.4-->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.12.4</version>
		</dependency>

		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.5.13</version>
		</dependency>

참고사이트

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글

관련 채용 정보