플랫폼에서 일어나는 모든 움직임 기록
‘로그’는 고객 신뢰와 긴밀하게 맞닿아
서비스에 갑자기 오류가 발생했을 때, 작업 데이터가 기록돼 있지 않으면 원인을 찾아 해결하는 데 어려움이 생긴다. 오류 발생 전, 사용자가 어떤 요청을 했는지도 알 수 없어 시스템 운영의 가시성도 떨어진다. 시스템의 동작 정보와 이벤트, 에러 등을 나타내는 데이터 ‘로그(Log)’가 중요한 이유다. 특히 데일리펀딩이 몸 담은 금융권에서 로깅(Logging) 작업은 서비스 신뢰와도 연관된다. 고객이 대출을 신청하고 실행까지 완료됐는데 그 데이터가 남아 있지 않다면 사실관계를 파악할 수 없으니 말이다.
데일리펀딩 IT실 인턴십 과제로 ‘로깅 레이어 프로젝트’를 하게 된 이유다. 로깅 레이어 작업은 사용자가 요청하고 서버가 응답하는 과정 사이사이에 발생하는 정보를 기록하는 것으로, 체계적이고 구조화된 형식을 구성하는 것이 특징이다. 레이어 작업을 해 두면 향후 서비스가 거대해졌을 때도 정보를 즉각 찾을 수 있다.
물론 로그는 이슈 상황에서만 필요한 게 아니다. 로그는 고객이 서비스를 이용하면서 남긴 발자국인 만큼 고객이 어떤 니즈가 있는지, 어떤 동선으로 움직이는지 파악하는 데 도움이 된다. 고객의 행동을 객관적인 기록으로 확인해 서비스를 먼저 개선하는 것. 이는 데일리펀딩이 그려 가는 미래 모습과 맞닿은 이야기라 인턴십 과제가 더욱 의미 깊다.
요청-응답 모두 기록하는 drf-api-logger
임시 데이터베이스 Redis 활용해 효율성 더해
로깅 레이어 작업의 첫 단계는 로그 라이브러리를 조사하는 것이었다. 로그 라이브러리 각각의 장단점은 물론, 데이터 관리 효율성과 데이터 저장 시점 등을 두루 고려해 총 2개의 라이브러리를 후보군으로 간추렸다. 그중에서 최종 선택된 것은 drf-api-logger 라이브러리로, 미들웨어 기반으로 동작해 요청과 응답 정보를 가로채 로깅할 수 있다는 게 구조적 장점이다. 다만 기본 동작은 응답 시점에 로그를 저장하는 방식이라 요청 단계에서 로그를 선 저장한 뒤 응답 단계에서 업데이트하는 방식으로 구조를 개선, 요구사항을 충족했다.
본격적으로 로깅 레이어 작업을 시작했을 때 가장 먼저 고려한 것은 서버 과부하 방지였다. 사용자의 요청이 들어왔을 때 정보를 추출해서 바로 데이터베이스에 저장하면, 그리고 그게 누적되면 서버는 굉장히 큰 부하를 받게 된다. 그래서 임시 데이터베이스 Redis를 활용하기로 결정했다. 이 Redis는 가볍고 접근이 빠르며 읽고 쓰기에 특화돼 성능 저하가 발생하지 않기 때문이다. Redis에는 사용자의 요청 내용과 정보가 비동기적으로 우선 저장되며, 용량이 초과됐거나 일정 시간이 지났을 경우 데이터베이스에 저장하도록 해 서버 운영의 효율성을 높였다.
멀티 스레드 설정하다 마주친 데드락 상황
해결 과정에서 느낀 개발자로의 책임감
프로젝트 초반, 데이터가 비정상적으로 저장되거나 요청이 지연되는 현상이 발생했다. 원인은 스레드 구조와 로깅 모듈의 동작 방식에 있었다. 시스템 효율성을 높이기 위해 일반적으로 요청사항을 여러 스레드로 처리하는 ‘멀티 스레드’를 설정하곤 한다. 여러 사용자의 요청이 동시에 발생하더라도 각 스레드가 병렬로 작업을 수행해 응답 성능이 안정적으로 유지되기 때문이다. 그런데 drf-api-logger가 각 요청의 로그를 DB에 기록하면서 동시 접근이 발생했다. 그 결과 자원 획득 순서가 엇갈리며 데드락(Deadlock)이 발생했다.
동시 접근을 제어하기 위해 자원에 락(Lock)을 설정했으나, 스레드 간 자원 획득 순서가 일관되지 않으면서 문제가 발생했다. 예를 들어 다음과 같은 상황이 발생할 수 있었다.
이처럼 두 스레드가 서로가 점유한 자원을 기다리는 상태에 빠지면서 순환 대기(Circular Wait) 구조가 형성됐고, 결국 데드락이 발생한 것이다. 다행히 데드락은 필수 발생 조건 4가지 중 하나만 미충족해도 해제된다. 그중의 하나인 순환 대기 조건을 제거, 모든 스레드가 무조건 자원 A를 먼저 획득한 후 자원 B를 요청하도록 획득 순서를 강제했더니 정상 작동했다.
데드락을 발견하고 해결하는 과정에서 ‘문제 발생 시 어떻게 해결하느냐’가 중요함을 느꼈다. 로깅은 어떤 오류 상황에서 빠르게 이슈를 파악하고 대응하는 힘이며, 고객의 시간과 자산을 다루는 금융업에서 꼭 필요한 작업이다. 실사용자가 존재하는 서비스를 고려하면서 책임감 있는 자세로 속도와 자원 관리 측면을 챙기기도 했다. 고객에게 신뢰를 드린다는 것은 시야를 넓혀 서비스를 바라보는 것이고, 프로젝트 목적 하나에만 집중하기보다는 여러 영역에서 책임감을 발휘하는 것임을 깨달았다.