지난 한 주 되돌아보기
10월 4주차는 현 회사에 입사한 이래로 처음으로 굵직한 이벤트를 겪을 수 있었던 주차였다. 🚀 기존 시스템은 내가 입사하기 전부터 이미 구축이 되있었던 터라 비지니스적으로 새로운 기능 개발에 참여한 것은 없지만, 백엔드 성능 개선 TF 에 합류하여 일정 부분 서비스에 기여할 수 있었다. 🛒
배포 후 첫 장애...🧨
그동안 RestTemplate 기반의 Http Client 들을 WebClient 로 전환했었던 작업들을 배포했다. 그중에는 외부 서버와 blocking I/O 방식으로 통신하는 것을 non-blocking I/O 방식으로 전환하는 작업도 있었으며, blocking I/O 방식을 그대로 유지하되 WebClient 로만 전환(추후 non-blocking I/O 로 개선하기 위한)하는 작업도 있었다.
이때, non-blocking I/O 방식으로 전환하는 작업이 성능 개선에 있어 가장 중요한 부분이면서 비지니스 로직에 변경이 있어 전환 시 잠재적으로 side-effect 가 발생할 수 있는 여지가 많은 부분이었다. 즉, 전환 후에도 side-effect 없이 동작들이 정상적으로 처리되는지 면밀하게 확인할 필요가 있었다. 이에, 로컬 환경에서 target server 와 통신하면서 발생할 수 있는 각각의 시나리오들에 대해 정상적으로 동작하는지 테스트를 진행하였다. 다행히 해당 작업은 실 서비스에 배포된 이후에도 정상적으로 동작하여 서비스 성능 개선에 조금이나마 기여될 수 있었다.
다만, blocking I/O 방식을 그대로 유지한채(비지니스 로직 변경 없이) 단순히 RestTemplate 에 의존하는 것을 WebClient 에 의존하는 것으로 바꾸기만한 일부 Http Client 에서 예상치 못한 에러가 발생했다. 이는 이번에 작업한 WebClient 기본 설정 부분에서 기인한 것이었다. 💦
특정 target server 에서 응답하는 json 데이터는 EUC-KR 로 인코딩되어 있었는데, WebClient 기본 설정 시 json 데이터를 parsing 하기 위해 설정한 ObjectMapper 에서는 기본적으로 응답 데이터를 UTF8StreamJsonParser 를 통해 parsing 하고 있었기에, UTF-8 에 맞지 않는 EUC-KR 기반의 문자 코드를 감지해 에러가 발생한 것이었다. (대표적으로, 한글의 경우 UTF-8 의 경우 3byte 로 처리하는 반면, EUC-KR 의 경우 2byte 로 처리한다.)
또한, 이와 비슷한 에러도 있었는데, URL 쿼리 파라미터에 한글이 포함되는 경우 퍼센트 인코딩이 제대로 되지 않은 채로 target server 에 요청이 가버려 비정상적인 동작이 발생하는 경우도 있었다. 이는 WebClient 의 url 메서드에 URI 객체를 넣냐 URL String 을 넣냐에 따라 UriComponentBuilder 에 의한 퍼센트 인코딩 유무가 다르기 때문이었다. RestTemplate 기본 설정 시와는 다르게 WebClient 기본 설정 시에는 URL String 이 아닌 URI 객체를 직접 사용했기 때문에 퍼센트 인코딩이 되지 않았던 것이다.
아무쪼록, 이번에 발생한 에러로 해당 부분들은 급하게 rollback 시켰으나, 이번 이슈에 대한 면밀한 원인 분석과 해결 방안에 대해 따로 정리(일종의 버그 리포트?)할 필요성을 느꼈기에, "상황 - 원인 - 해결" 순서로 해당 이슈에 대해 상세하게 정리한 후 백엔드 팀원 모두와 공유하는 시간을 가졌다. 아울러, 단순히 WebClient 로만 전환하는 작업이었다고 해서 로컬 환경 테스트가 미흡했었던 점은 반성해야할 부분이었다.
쿼리 튜닝에 대한 도전 과제가 주어지다..!!
기존 DB 에 오랜 시간 축적된 (아주 많은) 데이터들 전반에 대해 Update 쿼리를 수행해야하는 작업이 필요로 했다. 다만, 단순한 Update 쿼리가 아니라, 연관 관계가 있는 다른 테이블에 있는 데이터를 기반으로 수정되어야 했기에, 최소 2번의 JOIN 이 발생하여 성능 저하가 매우 컸다. 더군다나 데이터가 굉장히 많았기에 해당 쿼리를 실행하는데 최소 1시간 이상이 소요되었다. (타임아웃 발생) 해당 쿼리는 서비스 상에서 발생하는 쿼리는 아니지만, (빌드 시 한 번 발생하는 쿼리) 해당 쿼리 튜닝에 대한 욕심이 생겨 나름대로 고민하여 쿼리 성능을 개선해보고자 한다. 🔧
(백준 1일 1커밋 운동은 계속되고 있다...🏃♂️)
'Weekly I Learned > 2023's(1. ~ 12.) WIL' 카테고리의 다른 글
2023년 11월 1주차(11/6 ~ 11/10) Weekly I Learned "수습 종료 그리고 회사 일 삼매경 🏃♂️" (44) | 2023.11.13 |
---|---|
2023년 10월 5주차(10/30 ~ 11/3) Weekly I Learned "점차 익숙해지고 있는 업무! 🐥" (2) | 2023.11.06 |
2023년 10월 3주차(10/16 ~ 10/20) Weekly I Learned "단계적으로 성장하기!" (0) | 2023.10.21 |
2023년 10월 2주차(10/9 ~ 10/13) Weekly I Learned "코드 리뷰를 통해 성장하기" (2) | 2023.10.15 |
2023년 10월 1주차(10/2 ~ 10/6) Weekly I Learned "의문을 통해 성장하기 🚀" (0) | 2023.10.09 |