본 글은 글쓴이의 개인적인 생각이 담겨있을 수 있습니다.
PICK(온라인 출석부 프로젝트)를 진행하던 중 서버가 켜지지 않는 현상이 발생했다.
당연히 서버가 켜지지 않으니 로컬에서도 테스트할 수 없었고,
AWS EC2에 배포해놓은 서버에서도 서버가 켜지질 않으니 무슨 오류인지 알 수가 없었다.
정확하게는 서버가 안 켜지는 것이 아니라 서버를 킨 후 약 10초 뒤 꺼지는 현상이었다.
해결한 지금 상황에서는 오히려 아예 켜지지 않았더라면 더 쉽게 찾았을 수도 있다는 생각이 든다.
여기서는 내가 이 오류를 어떻게 해결해 나갔는지에 대해서 말하고자 한다.
나중에 같은 오류가 발생했을 때 찾아보기 위함이기도 하고,
내가 해결해 나가는 과정이 도움이 될 수도 있다고 생각하기 때문이다.
일단 해결해 나가는 과정은 다음과 같았다.
😭 내가 뭘 잘못한 거지..
🤨 과거 되새기기
😵 구글링... 또 구글링...
그럼 해결해 나가는 과정을 하나하나 알아보자.
일단 오류가 처음 발생했을 땐 현실 부정을 시작했다.
내 잘못이 아니라 다른 문제일 수도 있다는 생각에 이것저것 문제일 법한 것들을 찾아봤지만
당연히 내 잘못이기에 외부 요소를 찾을 수 없었다.
지금에서야 깨달았지만 에러가 났을 때 현실 부정을 하고
다른 문제를 찾기 위해 노력하는 것은 즉, 시간 낭비라는 것을 깨달았다.
내가 짠 코드에게서 내가 아니면 누구의 문제겠습니까?
현실 부정의 시간이 끝나고 현실로 돌아왔을 때,
서버가 잘 돌아가던 때와 현재의 코드를 비교하게 되었다.
당연히 코드를 훑어보았지만 코드 상의 문제는 보이지 않았고,
과거에 비해서 변경된 나의 코드들을 의심해보았다.
의심 대상인 코드는 다음과 같았다.
가장 많은 의심이 갔던 코드는 Application.java였다.
Spring Boot 서버를 키는 주요 원인이기 때문이다.
Spring Boot를 키는 녀석이 이 녀석이니 당연히 이 녀석한테 문제가 있을 것이라고 생각했다.
하지만 결과적으로는 이녀석이 문제는 아니었다.
다음으로 build.gradle과 application.yml이 주요 후보로 올라와있었는데,
build.gradle은 JaCoCo 라이브러리를 이용하기 위해서 의존성을 추가한 상태였고
application.yml은 test 서버와 real 서버를 나누기 위해서
{profile}-application.yml 형태로 나눈 상태였기 때문이다.
이 둘은 최근에 가장 큰 변경이 있었던 설정 파일이기 때문에 의심을 하며 쳐다봤지만
그래도 문제는 순순히 나와주지 않았다.
이 때는 생각을 해보지 못했는데,
아무리 예전이라도 서버가 켜지던 시절이 있었고
그렇다면 그 때의 커밋으로 돌아가서 비교해봤으면 쉬웠을 것이라는 생각이 든다.
사실 과거를 되새기기 전에 구글링을 많이 진행했다.
"Spring Boot 서버 안 켜짐"
"Spring Boot 서버가 안 켜져요"
"Spring Boot 서버가 갑자기 끊김"
.
.
.
많은 구글링을 통해 오류의 원인을 찾으려고 했지만 그렇게 쉽게 나오지 않았다.
그런데 과거 되새기기보다 뒤에 있는 이유는 되새기기 전에 구글링 했던 시간보다
후에 구글링을 한 시간이 훠어어어어어어얼~씬 많기 때문이다.
이렇게 위와 같이 검색을 통해 찾다보니 한글로는 도저히 관련 자료를 찾을 수 없어
영어로 자료를 찾기 시작했다.
"Spring Boot Server Down"
"Spring Boot Server Stop"
"Spring Boot Server Close"
그러면서 찾아낸 문제들이 다음과 같았다.
이 외에도 수많은 해결 방법들이 있었지만 가장 나를 설레게 했던 해결 방법들은 저 방법들이었다.
물론 저 세 방법 모두 해결 방법이 아니였고, 나는 새로운 방법을 찾게 된다.
오류를 고치기 위해 구글링을 할 때 영어에 대한 기초 지식은 필수라고 생각한다.
물론 영어를 수준급 해야 하는 것은 아니지만
번역을 하지 않고도 읽히는 정도는 되어야 한다고 생각한다.
물론 난 영어를 잘 못한다.
일단 결론만 말하자면 application.yml 파일의 다음과 같은 코드가 문제였다.
spring:
main:
web-application-type: none
위 코드는 웹 서버를 사용하지 않겠다라는 설정문인데,
application.yml의 기본 설정을 긁어오다가 같이 딸려온 녀석인 것 같다.
결과를 보니 너무 허무하지만 이를 해결하기 위해 노력했던 것들을 생각하면 값지다고 생각한다.
아무튼 결론은 '뜻도 모르고 사용하는 코드를 없게 하자' 이다.