해당 에러로그의 원인을 결론부터 말하자면 필요한 key 값이 저장된 파일이 제대로 된 위치에 존재하지 않고 있었다.
현재 진행 중인 프로젝트에서 솔라피를 통해 고객들에게 문자를 보내는 유료 서비스를 사용 중이다.
배포 중인 서버에서는 정상 작동하는데 개발용으로 운영 중인 서버들에서 문자가 제대로 전송되지 않고있다는 이슈를 전달받아 디버깅을 진행했다.
이전 개발자 분이 작성한 코드라 코드 분석과 함께 먼저 상황을 파악해보니 문자 전송이 되는 api를 스웨거로 실행해보면 api가 정상적으로 요청 성공했다는 response가 오고있지만 문자는 오고 있지 않았다.
배포 중인 서버와 문자가 오고 있지 않은 서버들의 코드또한 동일한 코드로 코드상으로 큰 특이점이 보이지 않았다.
코드에서 다른 점이 없다면 solapi내 설정이나 key 값과 같은 설정 값들에 문제가 있을 거라 생각하고 좀더 깊게 로그들과 설정 정보들을 뜯어볼 필요가 생겼다.
먼저, 솔라피 사이트에 로그인하여 정보들을 확인해봤는데 별다른 특이사항이 없었다.
다음으로, 관련 자료를 찾아보던 중 솔라피에서 제공해주는 java 예시 코드들 깃헙을 발견했고 해당 레포에서 아래 링크의 문자 전송관련 정보를 출력할 수 있는 코드를 발견했다.
https://github.com/solapi/solapi-java/blob/main/app/src/main/java/solapi/app/SendJsonLMS.java
위 링크의 코드를 참고해 아래와 같은 코드를 넣어 디버깅을 해보고자 시도했다.
System.out.println("statusCode : " + response.code());
System.out.println("groupId : " + body.getGroupId());
System.out.println("messageId : " + body.getMessageId());
System.out.println("to : " + body.getTo());
System.out.println("from : " + body.getFrom());
System.out.println("type : " + body.getType());
System.out.println("statusCode : " + body.getStatusCode());
System.out.println("statusMessage : " + body.getStatusMessage());
System.out.println("customFields : " + body.getCustomFields());
로컬에서 돌려 실험해봤는데 해당 정보들에는 문제가 없었다.
마지막으로 무중단 서비스를 돌리고 있었기 때문에 nohup.out 파일을 서버에 접속해 로그를 확인해봤다.
api 요청의 응답은 api 요청이 성공했다고 오고있었지만 위 파일에서 로그를 보니 문자 전송을 진행하는 과정에서 에러가 발생하고있었다.
에러가 발생한 경우 슬랙과 연동된 웹훅으로 에러 메시지를 받고있는데 해당 에러 로그는 웹훅 메시지가 오고 있지 않았다.
그래서 제일 마지막에 확인하게 된건데 아마 가끔씩 웹훅이 바로 안뜨고 엄청 늦게 연기되다 올때가 있는데 그런 케이스였던 것 같다..
12:31:01.726 ERROR [File:SolapiMessageSender.java] [Func:onResponse] [Line:40] [Message:{"errorCode":"Unauthorized","errorMessage":"권한이 없습니다."}]
12:38
java.io.FileNotFoundException: 파일경로임당 파일명임당 (No such file or directory)
해당 로그를 통해 문자 전송에 필요한 특정 파일이 존재하지 않고있다는 걸 알게됐다.
해당 파일은 키값과 같은 중요한 값들이 담긴 파일이었다.
빌드 파일만 서버로 옮겨 서버에서 돌리면 문자가 안오고 있었는데 빌드할 때 프로젝트 내에 해당 파일이 존재하고 있었지만 이와 상관없이 운영중인 서버에 해당 파일이 특정한 위치에 존재해야지만 문자 전송이 정상적으로 이루어지는 케이스였다.
배포 중인 서버에서 문자가 가고있던 건 이전 개발자분이 서버의 관련된 위치에 파일을 넣어두셨었다!
운영 중인 서버의 개발 서버 관련 폴더에 접근해 해당 파일을 정해진 경로에 위치시킨 후 다시 api를 실행해보니 정상작동됐다.
필자는 주로 키값을 다룰 때 프로젝트 내에 파일을 위치시키고 깃에서 제외시킨 후 빌드만 해도 바로 사용할 수 있도록 사용하고 있었는데 이전 개발자분은 프로젝트 빌드와 상관없는 위치에 따로 키값 정보가 담긴 파일을 위치시키고 해당 파일의 경로를 통해 값을 가져오는 방식을 사용하신 것 같다.
이런 방법은 생각해본 없었는데 서버에 접속해서 해당 파일을 열어봐야지만 키값을 확인할 수 있기때문에 조금 더 신경써야되는 부분이 많지만 유출에 있어서 더 안전한 방법인 것 같다!