네이버 스마트 스토어의 경우 판매자 가입을 할 때 휴대전화 인증과 계좌인증을 진행한다.
판매자 가입이 아니더라도 api 사용을 많이 해보고 싶어서 달에 50건을 무료로 제공하는 네이버를 택했다.
쉬워보였는데 뭐가 이리 에러가 많지?
시작은 아래 블로그를 보고 시작했다. 클래스도 몇 개 없고 블로그의 결과화면을 보고
어 나도? 이 정도면 할 수 있겠다? 해서 시작했다.
https://giron.tistory.com/75
근데 인생 너무 고달프다... 일단 애플리케이션 설정은 위 블로그가 너무 설명 잘 해놓아서 스킵한다.
첫번째 에러 - json과 LocalDateTime 타입 변환
서버 에러 500에 메세지는 대충 NoHttpMessageConverterFound 식이었다. 자세히 보니 json과 LocalDateTime 사이의 변환에 문제가 있는 거 같았다.
내가 해본 방법들
에러메세지 중에서는 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 애너테이션으로 바꾸었더니 해결되었다. 이제 제대로 인증번호를 전송한다.
배운점
*안된다고 하지 말고 방법을 찾아! 따라친다고 되면 좋지만 안되면 그 코드만 깔짝대지 말고 더 넓게 보도록 하자. 찾아보면서 에러 핸들링이나 다른 라이브러리 설정에 대해서 알게 되는 것이 참 신기하다.
나에게 고생을 안겨준 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>
참고사이트