반응형
05-17 07:25
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

첫 서비스 장애, 느낀점 본문

잡동사니

첫 서비스 장애, 느낀점

조용한고라니 2022. 1. 16. 20:00
반응형

이번 한 주는 특별히 다른 점은 없었으나, 유난히 시간이 빨리가버린 그리고 정신없이 흘러간 한 주가 아니었나 싶다. 아마도 제목과 같이 서비스 장애를 겪었고, 갖은 문제가 발생했기 때문이라 생각한다.

 

사실 어디부터가 장애고, 어디까지가 장애라고 해야하는지 모르겠지만. 이미 배포 중인 서비스가 예기치 못한 이슈를 겪으면 장애라고 생각한다. 그리고 내가 겪은 현상은 확실히 서비스 장애이다 :).

 

우선, 물품 별 배송정보를 토대로 상태를 업데이트 하며 고객에게 톡이 전송되는 프로세스가 있는데, 기존에는 메뉴얼로 작업되고 있었다. 이를 최근 자동화 로직을 설계하고, 나름대로 검증 후 배포를 내보냈다. 3주 정도는 문제없이 동작하는 줄 알았는데, 금주 일부 고객의 문의가 들어왔다. 30분 마다 동일한 톡이 반복적으로 온다는 내용이었다.

 

이를 보자마자 아득했다. 이는 내가 짠 로직에서 발생한 내용이었기 때문이다. 우선 이 작업에 대해 누구보다 잘 알고 있기에 해당 자동화 작업을 중지하고, 원인과 현재 상태를 파악하기 시작했다. 원인은 100% 명확하게 뽑아내지 못했으나, JPA 관련 문제였다. 덧붙여 말하면 영속성 컨텍스트와 트랜잭션을 완전히 컨트롤하지 못한 코드를 짰다. 영향은 약 180명 가량 고객에게 동일한 톡이 3~6개정도 전송되었다.

 

그나마 다행히 크리티컬한 문제는 아니었으나, 고객 경험에 있어 불편을 초래한 것은 맞다. 나는 Spring Data JPA를 사용할 때 UPDATE에 대해서 merge()를 사용하지 않는다. JPA를 사용하는 이유가 객체지향 패러다임에 맞게 코딩하려고 하는건데, 왜 자바 코드로 값을 변경하고 추가 액션을 해주어야 하는가? 라는 생각이 먼저 들어서 되도록 사용하지 않으려고 한다. 그러나 완벽히 제어하지 못한 상황에서 명시적으로 사용해야 한다면 사용해야하는 것을 느꼈다.

 

달랑 코드 한 줄 때문에 장애를 겪으니 허탈했다. 그리고 찝찝했다. 과연 이게 해결책이 맞는 것인지. 그래도 그 한 줄을 추가하고 나니 더 이상 동일한 상황은 재현되지 않았다.

 

그리고 장애를 처리하고 난 뒤 해당 로직에 기능을 덧붙이며 내부적으로 리팩토링을 진행해서 더 직관적이고 깔끔해졌다. (이 부분은 굉장히 만족하지만 아직 아쉬운 점은 조금 남아있는 것 같다.)

그리고 목, 금에 리팩토링하고 추가된 내용을 로컬, 개발환경에서 테스트 하고 배포했는데, 바로 에러가 떠서 어질어질했다.

 

원인은 운영 데이터 쪽에 항상 clean한 데이터만 있는 것이 아니기 때문에 발생한 문제였고, 이를 다잡는데 4~5시간 정도 원인 파악, 수정 및 검증 등을 거쳤다. 몇 일 지난 일이라 가물가물하기도 하고 워낙 정신없던 때라 두서가 없지만 조언을 주신 점과 느낀점을 요약하자면.. 다음과 같다.

 

[조언]

최적화를 할 때는 다음 두 규칙을 따르라.첫 번째, 하지마라.
두 번째, (전문가 한정) 아직 하지 마라. 다시 말해, 완전히 명백하고 최적화되지 않은 해법을 찾을 때까지는 하지 마라.
- M.A 잭슨 (Jackson75) 

큰 울림을 주는 메세지가 아니었나 싶다. '이렇게 짜면 성능이 느릴 것 같으니까 저렇게 짜면 더 잘나오겠지?' 하는 막연한 생각으로 코드를 짰다가 문제가 발생할 수도 있으니 우선 제어하기 쉽고 직관적으로 개발 한 뒤, 문제를 마주하면 그때 성능 최적화를 하는 방안이 더 나을 수도 있겠다고 생각하게 되었다.

 

단, 인덱스를 걸거나, 누가봐도 터무니 없는 로직은 피해야겠다.

 

[느낀점]

오롯이 내가 개발한 기능에서 장애가 나니 흔히 말해 멘탈이 터질 뻔 했다. 어디부터 봐야하지? 어떤 문제지? 어떻게 해결하지? 짧은 순간 많은 생각이 들었다. 이 감정은 내가 예전에 코딩테스트를 처음 볼때, 수능을 볼때 느꼈던 감정과 매우 흡사했다. 시간 제한이 있고, 해결해야하는 것은 어렵고... 하지만 지금은 코테를 본다면 그때 처럼 무거운 긴장과 두려움 속에 응시하진 않을 것이다. 수능도 마찬가지 이다. 즉, 앞으로 마주할 수많은 장애에 대해 침착하게 대응한다면, 피해를 최소화할 수 있을 것이라 믿으며 그래야만 한다.

 

아 그리고 무엇보다 팀원분들이 많이 격려해주시고 함께 고민해주셔서 그날 바로 해결하였다. :)

반응형
Comments