이중원2_수정.jpg

Jungwon Lee

About me

<aside> 👋

안녕하세요, 백엔드 개발자 이중원입니다.

흔들림이 없는 편안한 서비스 개발을 지향합니다.

안정적인 서비스를 위해 부하테스트와 모니터링을 통해 서버 리소스(메모리) 사용량을 30% 감축하였고, 빈번히 호출되는 API의 평균 소요 시간을 95% 감축시켰습니다.

또한 테스트를 중요시 여겨 테스트 커버리지를 90% 이상 달성한 경험이 있으며 사용자 요청 중 동시성 문제가 있는 로직을 찾아 해결하였습니다.

</aside>

Work Experiences


Projects

빵그리의 오븐

프로젝트 설명

<aside> 💡 저당, 글루텐 프리 등 건강한 베이커리를 찾는 사람들을 위해 판매처를 모아주고 추천해 주는 플랫폼

</aside>

참여 인원(명): Back-end(5), Front-end(4), PM(2), Design(2), Marketing(3) 총 17명

담당 파트: Back-end 파트

사용 기술: Java, Spring, Querydsl, Spring Security, OAuth2, MariaDB, Redis, Github Actions, Docker Compose, NCP

역할

성과

사용자 이벤트 기반 게시글 랭킹 시스템 개발 및 성능 개선(기여도 100%)

사용자 위시리스트 기능 개발 및 성능 개선(기여도 100%)

게시글 랭킹 조작 방지 시스템 개발(기여도 100%)

개발 서버 자동 배포 파이프라인 개발(기여도 100%)

스크린샷 2024-12-03 오후 5.17.13.png

스크린샷 2024-12-03 오후 5.20.06.png

트러블 슈팅

문제 상황 1

<aside> 💡

DEV 환경에서 테스트를 하던 도중 서버의 메모리 자원을 초과 사용하여 서버가 다운되는 현상이 발생

</aside>

문제 진단 과정

메모리 초과 문제 원인을 서버에서 사용하는 데이터가 제대로 정리되지 않거나 특정 요청이 너무 많은 데이터를 생성한다고 판단

Jmeter 기반의 API 부하테스트를 가하는 동시에 모니터링 도구(VisualVM) 를 사용해 서버의 메모리 상태를 확인하는 작업 실시

→ 특정 API를 호출하는 과정에서 사용된 객체가 삭제되지 않고 메모리 자원을 계속 차지하는 것을 확인

해결 방법

해당 객체가 LinkedHashMap 타입의 객체인 것을 확인, LinkedHashMap은 강한 참조 관계로 삭제가 잘 안되는 데이터 타입인 것을 확인하고 사용이 완료된 LinkedHashMap을 삭제해주는 기능을 추가하여 메모리에 누적되지 않도록 조치

heap 메모리 초과로 인해 서버가 다운되는 문제 발생

heap 메모리 초과로 인해 서버가 다운되는 문제 발생

LinkedHashMap을 삭제 도입한 후 서버의 메모리 사용량 확인

LinkedHashMap을 삭제 도입한 후 서버의 메모리 사용량 확인

→ 전체 메모리 리소스 중 약 30% 사용량 감축 확인

문제 상황 2

<aside> 💡

한 사람당 한 게의 게시글만 위시리스트(게시글 찜 기능)에 담을 수 있게 정책이 수립되어 있지만 한 사람 당 두 개 이상의 게시글을 위시리스트 DB에 담겨 조회 시 오류가 발생

</aside>

문제 진단 과정

프론트엔드 팀에 확인 후 찜 누르기 버튼을 광클할 경우 위시리스트 추가 API가 연속으로 호출되는 경우가 발생, 연속 호출 시 동시성 문제가 발생했을 거라 추측하고 테스트 코드를 작성

실제로 동시에 호출될 경우 검증로직을 통과하여 한 명이 같은 게시글을 여러 개 찜할 수 있는 경우가 발생

이미 게시글에 찜한 이력 확인 후 게시글 찜 정보를 저장하는데 저장 과정에서 먼저 발생한 찜 요청이 끝나고 데이터가 저장이 되기 전에 동시에 진행한 요청이 이미 찜이 되었는지 검증하는 로직을 실행하면 찜 데이터가 없다고 판단하고 검증 로직을 통과하는 문제 확인

해결 방법

DB에 한 사람 당 한 게시글만 찜할 수 있는 제약 조건(유니크 제약 조건)을 걸고 이를 위배하고 요청할 시 서버에서 커스텀하게 만든 예외가 발생하도록 처리

검증과 데이터 저장을 하는 동안 다른 동일한 요청을 처리할 수 없도록 잠금을 걸 수도 있으나(이 경우에는 Named Lock, Distributed Lock 등)

제약 조건과 예외처리만 진행하면 검증 로직 자체가 사라져도 돼서 DB에 데이터가 있는지 확인하는 쿼리를 보내지 않아도 된다.

DB 네트워크 통신을 1회 줄이면서도 동시성 문제를 간단히 해결할 수 있어 제약 조건을 거는 방식을 선택

두 개의 동일한 찜 요청을 동시에 진행할 때 테스트 실패 확인

두 개의 동일한 찜 요청을 동시에 진행할 때 테스트 실패 확인

같은 로직을 동시에 실행 시 문제점 확인

같은 로직을 동시에 실행 시 문제점 확인

기타 개발 여정

랭킹 기반 게시글 조회 시스템 개발 및 리팩토링의 여정

스케줄링 기반 Ranking 갱신 기능

랭킹 조작 방지를 위한 접근 제한