-
[기술 딥다이브]성능 최적화의 핵심 개념 정리면접 준비/포트폴리오 2026. 2. 22. 13:45
이번 프로젝트를 진행하며 단순히 라이브러리를 가져다 쓰는 것을 넘어, 내부적으로 어떤 원리로 동작하는지 깊이 있게 파고들었던 내용들을 정리합니다.
1. I/O와 스레드 점유 (Thread Occupancy)
"스레드가 일을 안 하고 기다리는 시간을 최소화하라"
- Blocking I/O: 요청을 보낸 뒤 응답이 올 때까지 스레드가 아무것도 못 하고 대기하는 상태입니다. 이때 스레드는 메모리를 차지하고 있지만 실제 연산은 하지 않는 '스레드 점유' 상태가 되어 자원 낭비가 발생합니다.
- Non-blocking I/O: 요청을 보낸 즉시 제어권을 반환받아 다른 일을 처리합니다. 응답이 준비되면 그때 알림(이벤트)을 받아 처리하므로, 적은 수의 스레드로도 훨씬 많은 요청을 처리할 수 있습니다.
2. Spring WebFlux & WebClient
"리액티브 프로그래밍의 시작"
리액티브 프로그래밍이란?
외부에서 데이터가 들어오기를 기다리는 것이 아니라, 데이터가 발생할 때마다 이벤트로서 처리하는 선언형 프로그래밍 패러다임입니다.
특히 Spring WebFlux는 리액티브 스트림(Reactive Streams) 표준을 준수하여, 대규모 동시성 요청을 효율적으로 처리하고 시스템 자원(스레드, 메모리)을 극도로 아낄 수 있게 해줍니다.
- Spring WebFlux: 기존의 Spring MVC가 '1 요청당 1 스레드(Thread-per-request)' 방식이었다면, WebFlux는 이벤트 루프(Event Loop) 방식을 사용합니다. 아주 적은 수의 고정된 스레드만 사용하여 대규모 트래픽을 효율적으로 처리합니다.
- WebClient: RestTemplate의 뒤를 이어 등장한 현대적인 HTTP 클라이언트입니다. 기본적으로 비동기/논블로킹으로 동작하며, 주식 데이터처럼 외부 호출이 잦은 서비스에서 서버의 자원을 효율적으로 관리하기 위해 필수적인 선택이었습니다.
3. 병렬 처리 (Parallel Processing)와 Mono.zip
"따로따로가 아닌 동시에 실행하기"
주식 서비스 특성상 하나의 화면을 그리기 위해 주가, 뉴스, 보조지표 등 여러 데이터가 필요합니다.
- 순차 처리: 주가 조회(1초) → 뉴스 조회(1초) → 지표 계산(1초) = 총 3초 소요.
- 병렬 처리: 주가, 뉴스, 지표를 동시에 호출 = 가장 늦게 오는 데이터 시간(약 1초)에 전체 응답 완료.
- Mono.zip은 이렇게 서로 다른 비동기 작업들을 하나로 묶어 병렬로 실행하고, 모든 결과가 도착했을 때 합쳐서 반환해 주는 마법 같은 도구입니다.
4. 동시성 제어 (Concurrency Control)
"데이터의 정합성을 지키는 안전장치"
사용자가 '관심 종목 추가' 버튼을 광클(Double Click)하거나, 여러 기기에서 동시에 같은 종목을 추가할 때 Race Condition(경쟁 상태)이 발생합니다.
- Race Condition: 두 개 이상의 스레드가 하나의 데이터를 동시에 수정하려고 할 때 발생하는 충돌 현상입니다.
- 해결 전략: 이번 프로젝트에서는 DB 레벨의 Unique Constraint(유니크 제약 조건)를 활용했습니다. 중복 저장이 시도될 때 발생하는 DataIntegrityViolationException을 백엔드에서 캐치하여 사용자에게는 "이미 추가된 종목입니다"라고 친절하게 안내함으로써 데이터 정합성을 유지했습니다.
💡 면접 대비용 한 줄 요약 "비동기 논블로킹 방식을 통해 스레드 점유를 줄여 서버 리소스를 아꼈고, Mono.zip으로 병렬 처리를 구현해 응답 속도를 높였으며, DB 예외 핸들링으로 동시성 제어를 수행해 데이터의 신뢰성을 확보했습니다."
'면접 준비 > 포트폴리오' 카테고리의 다른 글
[Deep Dive] Spring WebFlux와 Optimistic UI: 기술적 한계를 넘어선 성능 최적화 (0) 2026.02.26 [Project Review] 성능 최적화를 위한 백엔드 분투기 (0) 2026.02.22 [Project Review]성능과 UX의 '혁명'을 위한 기술적 선택 (7) 2026.02.20