쿼리 실행 오류 해결

Y·2023년 8월 10일
0

문제해결

목록 보기
1/2

개인적으로 오류 해결 요청을 받아서 정말 오랜만에 PHP 코드를 볼 일이 생겼다. 거두절미하고 문제상황에 대해서 설명하면, 다음과 같다.

해당 코드는 하루에 한 번씩 실행되는 코드였는데, DB 테이블(MySQL)에 날짜를 저장해두고 현재 서버의 날짜값과 DB테이블에 저장된 날짜값이 다르다면 로직을 실행시키도록 하고 이후에 테이블의 날짜값을 갱신시키는 방식이었다. (이 코드가 포함된 파일 자체는 사이트가 로딩 될때마다 실행되는 파일이었다.) 사실 나는 하루에 한 번 실행시킨다..라는 설명을 듣고 스케줄러부터 떠올렸기 때문에 코드를 보고 나서 이런 방식으로도 구현할 수 있다는 것 자체부터가 신기했다.(ㅎㅎ) 아무튼 문제가 발생한 것은 하루에 한 번 실행되어야 하는 코드가 비주기적으로 여러 번 실행되기도 한다는 것이었다. 코드를 확인해봤을 때 로직상으로는 문제가 없어보였는데(가끔씩 오류가 발생하는 것 외에는 정상적으로 작동하기도 하였고), 그래서 뭐가 문제인지 감이 잘 안 잡혔다. 언뜻 드는 생각으로는 동시 접속 때문에 발생하는 에러인가? 싶기도 했지만 그렇다면 애초부터 에러가 발생해야 했을 것 같아서...

그래서 정확한 오류 상황을 확인하려고 여쭤봤는데 정확히는 모르겠다고 하셨다. 그래서 일단은 로그파일을 생성하고 정확한 상황을 확인하기로 했다. 며칠동안은 아무런 오류가 없이 잘 실행되다가, 5-6일쯤 된 시점에 드디어 오류가 발생했다! 로그를 확인해보니 로직을 실행한 후에 DB에 값을 갱신하는 과정에서 오류가 발생하였고, 갱신 과정에서 오류가 반복적으로 발생하면서 로직 역시 반복적으로 실행된 것이었다. (DB에 날짜값이 0000-00-00으로 들어가있었다.) 사실 로그에 에러 내용도 기록하도록 해놨어야 했는데, 갱신 과정에서 오류가 발생할 거라는 생각을 전혀 못했어서 이 부분에 대해서는 기록을 해두지를 않았다. 갱신 과정에서 오류가 발생할 수 있는 이유는 다양할 수 있기 때문에 우선은 코드를 에러 처리를 하는 방향으로 바꾸기로 했다.

기존 코드는 값이 다르면 일단 로직을 실행하고 그 후에 갱신을 하니, 갱신 과정에서 오류가 발생하는 경우 로직이 여러 번 실행된 것이었다. 따라서 갱신을 먼저 한 후에 오류가 발생하지 않았다면, 그리고 DB의 값이 정확히 업데이트가 됐는지를 다시 한 번 확인하고 나서 로직을 실행하는 방식으로 코드를 수정하였다. 사실 임시방편 수준이기는 하지만... 단기간에 빠르게 문제를 해결할 수 있는 방법은 이정도인 것 같다. 더 이상 오류가 발생하지 않는지에 대해서는 시간을 두고 좀 더 지켜 보기로 했다.

이번 작업을 하면서 오류 처리의 중요성과 로깅의 중요성을 다시 한 번 느끼게 된 것 같다. 코드 자체에 문제가 없어도 다른 여러 이유 때문에 갑작스럽게 오류가 발생할 수 있고, 이런 상황에 대비하려면 오류 처리를 꼭 해야겠구나... 다시 한 번 느끼게 됐다. 그리고 이래서 SRP가 강조되는구나.. 도 느끼게 되었다.

profile
개발자, 학생

0개의 댓글