본문 바로가기

project

이상금융거래 탐지 시스템 구축 프로젝트 회고

728x90
반응형

1. 프로젝트 개요

이번 프로젝트는 금융권에서 이상금융거래를 탐지하기 위한 FDS 시스템을 신규 구축하는 프로젝트였다. 프로젝트 기간은 2024년 9월부터 2025년 3월까지 진행되었으며, PM 1명, 배치 개발자 1명, 엔진 개발자 1명, 컨설팅 및 데이터 분석 담당 2명으로 구성된 5명의 팀으로 진행되었다.
나는 데이터 분석 역할을 맡아 현업에서 사용 중인 ASIS 룰과 금융투자업권에서 제시한 신규 룰을 분석하고 구현하는 업무를 담당했다.
기존 시스템은 사용자 친화적이지 않고, 담당자의 부재로 인해 실제로 운용되지 못하고 있었다. 또한 데이터 분석 관점에서는 중복된 룰이 많아 관리가 어려웠다. 이번 프로젝트에서는 중복 룰을 제거하고 최신 금융투자업권의 가이드에 맞는 신규 시나리오를 반영하여 시스템을 개선하는 것이 목표였다.

2. 프로젝트 진행 과정

초기 데이터 분석을 위해 필요한 로그인 관련 데이터(UUID, MAC 등)가 현업에서 저장되지 않아 분석 데이터 확보에 어려움이 있었다. 또한 FDS 분석을 위한 데이터 마트 구축 과정에서 차장님이 데이터를 구성하고 관리하는 과정 중 예상치 못한 데이터 불일치 문제가 있었고, 이로 인해 내가 작성한 분석 코드가 정상적으로 작동하지 않아 어려움을 겪었다. 특히 데이터 파일이 변경될 때 백업이 충분히 이루어지지 않아 혼자 늦은 시간까지 작업하며 문제를 해결한 경험이 있었다. 이 사건을 계기로 데이터 관리 및 백업의 중요성을 깊이 느꼈다.
FDS 룰 분석 중 가장 어려웠던 부분은 과거 거래 데이터를 집계하는 룰이었다. 초반에는 모든 데이터를 순회하면서 처리해 분석 시간이 매우 길었으나, pandas의 rolling 함수를 활용하여 집계 함수를 구현하면서 처리 성능을 수 시간에서 수 분 이내로 획기적으로 개선하였다.
성능 최적화를 위해 txt 형식의 데이터를 Parquet 파일 형식으로 변환하여 I/O 부문의 성능을 향상시켰다. IP 주소의 국가코드 매핑 과정에서도 국가코드가 누락되는 문제가 있었으나, KISA의 IP 정보 데이터를 적절한 데이터 타입으로 변환하여 처리하는 방식으로 해결했다.

3. 기술적 성장과 배움

이번 프로젝트를 통해 pandas의 rolling 함수를 활용한 데이터 집계 처리 방식에 대해 깊이 이해할 수 있었다. rolling 함수의 개념과 활용 방식을 이해하면서 성능 최적화에 대한 자신감을 얻었다.
특히 집계함수를 구현하면서 데이터 처리 성능을 극적으로 개선했던 경험이 가장 의미 있는 기술적 성과였다.

# COUNT 함수 구현 예시: rolling을 활용한 집계함수
def COUNT(start, end, condition, YN, df, group_col, result_col):
    df.loc[:,"dum"] = 1
    condition = eval(condition)
    if end == 0:
        df = df.merge((df[condition].groupby([group_col])
                     .rolling(start, on='WRK_dt')["dum"].sum() - YN)
                    .rename(result_col).reset_index(), on=[group_col, 'WRK_dt'], how='left')
        df.loc[:,result_col] = df.loc[:,result_col].fillna(0)
    else:
        df = df.merge((df[condition].groupby([group_col])
                     .rolling(start, on='WRK_dt')["dum"].sum() - 
                     df[condition].groupby([group_col])
                     .rolling(end, on='WRK_dt')["dum"].sum())
                    .rename(result_col).reset_index(), on=[group_col, 'WRK_dt'], how='left')
        df.loc[:,result_col] = df.loc[:,result_col].fillna(0)
    df = df.drop(['dum'], axis=1)
    return df
반응형
728x90

4. 협업과 의사소통

팀 내에서 시나리오를 구현한 후 차장님과의 피드백을 통해 업무를 진행했다. 피드백을 통해 문제점을 발견하고 개선하는 방식은 효과적이었으나, 각자 업무가 명확히 구분되어 있어 실시간으로 문제를 해결하기 어려운 부분은 아쉬웠다. 향후 프로젝트에서는 실시간 문제 해결을 위해 페어 프로그래밍과 같은 방식을 고려해 보면 좋겠다는 생각이 들었다.

5. 개선할 점과 아쉬운 점

프로젝트 후반부에 시나리오들의 코드를 유지보수하기 쉽도록 통합하거나 리팩토링하고자 했으나, 서버 장애로 인해 하지 못한 점이 아쉬웠다. 또한 코드와 산출물 관리 측면에서도 git 등 이력관리 도구를 사용하지 않아 코드 변경의 이유를 명확히 파악하는 데 어려움이 있었다. 다음 프로젝트에서는 코드의 이력관리와 문서화를 철저히 하고 싶다.
회의록 관리 측면에서도 현업 미팅 외에 자체 미팅에서 나온 내용을 별도로 정리하지 못한 점이 아쉬웠다. 다음 프로젝트에서는 미팅 내용을 체계적으로 관리하여 명확한 커뮤니케이션을 유지할 계획이다.

6. 총평 및 앞으로의 방향

모든 시나리오를 성공적으로 구현하여 프로젝트를 마무리했던 순간이 가장 뿌듯했다. 이번 프로젝트를 통해 대용량 데이터 처리의 중요성과 성능 최적화 방법을 실제로 경험하고 이해하게 되었다.
앞으로 데이터 엔지니어로 성장하기 위해 대용량 데이터 처리와 성능 최적화를 위한 기술적 접근, 특히 Spark와 같은 분산 처리 기술을 깊이 있게 공부하여 적용하고 싶다. 또한 협업 및 관리 측면에서 버전 관리 도구 활용과 회의 기록의 체계적 관리를 통해 업무의 효율성을 더욱 높이고자 한다.
이번 프로젝트는 개인적으로도 큰 성장과 많은 배움이 있었던 의미 있는 경험이었다.

 

728x90
반응형