Weekly I Learned/2023's(1. ~ 12.) WIL

2023년 10월 2주차(10/9 ~ 10/13) Weekly I Learned "코드 리뷰를 통해 성장하기"

ikjo 2023. 10. 15. 21:04

지난 한 주 되돌아보기

10월 2주차의 시작에 앞서 주말부터 한글의 날까지 3일간의 연휴 덕에 다른 주차 때와 달리 한결 수월하게 하루를 시작할 수 있었다. 생각보다 회사 일로 바빠 당초의 목표와 달리 인프런 강의를 거의 듣지 못했었던 점이 아쉬웠다. 💦

 

코드 리뷰를 통한 코드 개선

지난 주에 이어서 서비스 성능 개선을 위해 기존 외부 서비스와 blocking I/O(RestTemplate) 방식으로 통신하는 것을 non-blocking I/O (WebClient) 방식으로 변경하는 작업을 지속하여 수행했다. 작업 중 까다로웠던 부분은 외부 서비스에 요청을 보냈을 경우 Access Token 이 유효하지 않을 경우(만료 등), 외부 서비스로부터 Access Token 을 재발급 받고 다시 재요청(retry)을 보내야 하는 부분이었다. (이 역시 비동기적으로 처리되어야 함)

 

이때, 외부 서비스로부터 Access Token 을 재발급받는 통신 과정은 blocking I/O 인데, 기본적으로 reactor netty 의 이벤트 스레드인 reactor-http-nio 스레드는 blocking I/O 를 지원하지 않기에, blocking I/O 을 지원하는 boundedelastic 이라는 별도의 스레드를 사용해야만 했다.

 

아울러, Access Token 을 재발급 받고 다시 재요청하는 로직 역시 비동기적으로 처리해야했기에, callback 함수 안에 callback 함수가 있는 구조(callback hell)가 되어버렸는데, 코드 리뷰를 받으면서 사수분께서 구조를 개선하자는 피드백을 주셨고, 함께 고민하면서 WebClient 에서 지원하는 onErrorResume 이라는 연산자를 통해 메서드 체이닝 형태로 개선시킬 수도 있었다.

 

또한, 기존 나의 코드에서는 클라이언트 측에서 비동기 로직을 핸들링하고있었는데, 또 다른 사수분께서 해당 로직을 서비스 측으로 옮기는 것을 제안해주셨고, 이에 클라이언트 측은 외부 서비스에 요청하는 역할에만 집중할 수 있는 구조로 개선할 수 있었다. (Single Responsibility Principle) 다만, 이 과정에서 기존 base-module 코드에도 일부 수정이 생겨, base-module 에 대한 동작 테스트도 다시 수행해야만 했다. 

 

최종적으로 10월 2주차간 non-blocking I/O 로 전환하는 작업과 함께, 로컬 환경에서 6가지의 시나리오별로 외부 서비스(Test Server)와 통신하는 테스트까지 모두 마쳤다. 다음 주에는 앞서 변경된 base-module 에 대한 테스트를 마무리하고 배포를 진행하고자 한다. 🚀

 

자기개발 스터디, 올해 목표

현재 매주 수요일마다 (화상으로) 모임을 가지는 자기개발 스터디는 2022년 1월에 알고리즘 스터디로 시작했는데, 점점 흐지부지 되다가 2022년 12월에 자기개발 스터디라는 명목(한주간 배우고 경험한 것 공유)으로 바뀌어 운영되었다. 그러다가 최근에 스터디원 중 한 분께서 각자 올해말까지 (현실적인) 목표를 수립해오고 이것을 공유해보자는 제안을 해주셨다.

 

나의 올해 말까지의 목표는 인프런의 김영한님의 Spring 로드맵 강의를 모두 듣는 것과 함께, 꾸준하게 WIL 작성 및 백준 1일 1커밋 운동을 하는 것이었다. (이를 못지킬 경우에 대한 패널티도 정했다. 😅) 회사 일로 바쁘지만, 요즘 들어 특히나 웹 개발에 몰입하면서 Spring 에 대한 본질적인 이해를 더 키우고 싶다는 생각이 들었고, 이때 김영한님의 Spring 강의가 번뜩 생각이 들었다. 2022년에는 구현 중심의 마음가짐이었다면 2023년은 동작 매커니즘에 대한 이해 중심의 마음가짐을 가지고 있다. 🚀

 

(백준 1일 1커밋 운동은 계속되는 중...🚀)