본문 바로가기

개발/Error

대박 에러 해결(하는 거 구경한) 썰

최근 새벽 3시에 퇴근하는 진귀한 경험을 했다.

 

내가 맡은 유지보수 프로젝트 중에 하나가 로컬이 안 돌아간 지 거의 6개월이 다 되어가는 레거시 프로젝트였다. 입사 후에 인수인계를 받고 틈이 날 때마다 서버를 살려보려고 했지만 안돼서 반쯤 포기하고 업무를 하고 있었다. 해당 프로젝트는 대부분 jsp단에서 처리하면 끝나는 작업들이 많아서 거의 운영에서 작업을 하고 반영을 하는 식으로 진행하고 있었다.

 

그러던 중에 메인화면에서 게시판 미리보기 기능이 안된다는 연락을 받아서 해당 기능에 대해서 알아보았다. 메인 페이지의 service 단에서 뿌려주는 값을 확인하기 위해서는 디버깅을 해봐야 하는데 로컬 서버가 작동을 안 하니 운영에서 service 페이지만 살짝 바꿔서 달라지는 게 있는지 보려고 했다. 운영은 잘 돌아가니까 서버를 재가동해도 될 거라고 생각했다.

 

그러다가 문제가 발생했다. 운영 서버가 안 돌아가는 것이다. 로그를 확인해보니 로컬에서 나는 오류가 똑같이 발생했다.

 

Caused by: org.xml.sax.SAXParseException: s4s-elt-character: 'xs:appinfo' 및 'xs:documentation' 외에 다른 스키마 요소에서는 공백이 아닌 문자가 허용되지 않습니다. '301 Moved Permanently'이(가) 발견되었습니다.

 

문제의 오류다. 특정 xml 파일의 특정 위치에 공백이 있다는데 아무리 봐도 공백이 없었다. 해당 xml이 참조하고 있는 스키마 내부에 공백이 있다는 말인가 했는데 해당 스키마를 다른 프로젝트에서는 잘 참조해서 쓰고 있었다. 옆자리 선배님과 계속해서 찾아보고 있으니까 다른 동료 분도 오시고, PM 님도 오시고, 수석님도 오셨다. 그렇게 5명이서 뭐가 문제인지 찾고 또 찾았다. 사실 나는 큰 도움이 되지는 못했을 것이다.

 

찾아보니 '301 Moved Permanently'는 HTTP 상태 코드 중 하나로 요청한 리소스가 영구적으로 새로운 위치로 이동했다는 뜻이라고 한다. 개발자 도구의 네트워크 창에서 보니 에러 페이지를 계속해서 요청한 것을 확인할 수 있었다. redirection location이 없어서 무언가를 계속 요청하다가 멈춘 것 같다.

 

여러가지 시도를 한 끝에 오류가 나는 xml에서 클래스들을 bean이 아닌 다른 태그로 관리하는 것을 알아냈다. 오류가 나는 부분도 해당 태그와 관련된 부분이었다. 해당 태그들을 한 번 bean으로 다 바꿔보니 다른 오류가 났다.

 

특정 bean이 정의되지 않아서 찾을 수 없다는 오류였다. 해당 클래스를 bean으로 등록하니 이번엔 다른 클래스가 bean으로 정의되지 않아서 찾을 수 없다는 오류가 났다. 이것들을 하나하나 다 bean으로 등록하려니 끝도 없었다. 뭔가 이게 아닌 것 같아서 다시 처음으로 돌려놓았다. 그렇게 시행착오를 거듭하다가 어느덧 새벽 3시가 다 되었다. 수석님께서 금방 안 끝날 것 같으니 퇴근하고 다음날 다시 하자고 말씀하셨다.

 

집에 가서 씻고 누워서 눈을 살짝 감고 떴는데 아침이었다. 다시 서둘러 준비를 하고 회사로 향했다. 회사에 도착하니 수석님이 모니터를 보시면서 심각한 표정을 짓고 계셨다. 운영 서버에는 서비스 복구중이라는 문구를 띄우고 계속해서 문제를 찾고 계셨다. 그러다가 뭔가 실마리가 풀렸다. 우리가 외부에서 참조했던 스키마들을 소스 쪽으로 옮겨서 참조 경로를 내부로 돌리니 오류가 사라진 것이다. 이제 다른 오류들을 하나하나 해결하고 나니 마침내 서버가 정상적으로 돌아갔다.

 

수석님의 위엄을 느낄 수 있었던 날이었다. 우리를 괴롭힌 이 대박 오류는 기록을 해놔야 할 것 같아서 이렇게나마 블로그에 남긴다.

 

ps.

그리고 이 일을 통해서 느낀 것이 하나 있다. 문제의 원인을 파악하고자 오류 메세지를 구글에 검색해서 여러 글을 참고했고 나온 글에서 조치하라는 대로 했지만 소용이 없었다. 같은 오류라도 각자의 상황에 따라 해결책이 다르기 때문이다. 따라서 소스 이해도와 오류 분석력을 많이 키워야겠다는 생각을 했다.