Backend Engineer

김효현

여러 관점에서 문제를 바라보고 해결 방향을 고민하며, 서비스 기획부터 백엔드 아키텍처 설계, 인프라 구축, 성능 최적화까지 end-to-end로 수행해온 백엔드 개발자입니다.

실시간 시스템, 알림 시스템, 자체 인프라 구축 경험을 보유하고 있으며, 부하 테스트와 측정 기반 병목 분석을 통해 실제 서비스 구조를 개선해왔습니다.

또한 AI를 단순 생성 도구가 아닌 문제 분석과 개발 생산성을 높이는 협업 도구로 활용하며, 반복 작업 자동화와 개발 흐름 최적화에 지속적으로 적용하고 있습니다.

01 / In Progress

Movra.

매일 무너지는 계획의 원인을 신경과학적 메커니즘으로 분석하고, 그에 대응하는 행동 루프를 설계하여 학생이 정한 계획을 끝까지 실행하도록 유도하는 학습 행동 지속 서비스

Period 2026.03.30 ~ 알파 테스트 단계
Role Backend & Frontend & Infra
Repository GITHUB ↗
Tech Stack Spring Boot · WebSocket · MySQL · Redis · React 18.3 · TypeScript 5.6 · Vite · TanStack Query · Docker · Cloudflare Tunnel + 미니 PC
Movra 대시보드
01

문제 재정의

Movra 프로젝트는 단순히 일정 관리 서비스가 아닌, "계획은 세우지만 반복적으로 실행에 실패하는 문제"를 뇌 과학 기반으로 접근하여 해결한 프로젝트입니다.

제 자신의 모습과 주변 친구들을 보며, 계획은 세우지만 반복적으로 실행에 실패하는 모습을 자주 관찰하였습니다. 기존 생산성 서비스들을 조사한 결과, 대부분 일정 관리 기능에 집중되어 있었지만 실제 사용자들은 계획을 세운 이후 실행을 시작하고 지속하는 과정에서 더 큰 어려움을 겪고 있었습니다. 저는 이를 단순한 일정 관리의 문제가 아니라, 행동을 지속하지 못하는 구조적 문제라고 판단하였습니다.

저는 이러한 관점에서 "목표를 행동으로 이어가는 과정"의 문제라고 판단하였고, 이를 해결하기 위해 "목표 인식 → 행동 시작 → 회고 → 복귀" 흐름 중심의 뇌 과학 기반 행동 전환 구조로 서비스를 설계하였습니다.

02

뇌 과학 기반 행동 설계

기능 설명
MindSweep
+
TopPick

문제 — 해야 할 일이 많아질수록 행동 시작 자체를 어려워함

해결 — MindSweep으로 생각을 빠르게 인출하고, TopPick으로 오늘 반드시 할 행동 하나를 선택

의도 — 결정 피로를 줄이고 계획 관리보다 "행동 시작 기준점" 설계에 집중

Recovery Card

문제 — 계획 실패 이후 복귀하지 못하는 패턴 반복

해결 — 실패를 자연스러운 과정으로 바라보는 복귀 중심 UX 설계. 죄책감 유발보다 작은 행동 재시작에 집중

Future Vision

문제 — 사용자가 목표를 세우더라도 일상 속에서 목표를 자주 잊고 현재 자극에 쉽게 휩쓸림

해결 — 목표를 반복적으로 시각화하는 Future Vision 기능 설계

의도 — 뇌의 RAS 기반 주의 필터 메커니즘을 참고해 설계. 목표를 반복적으로 노출함으로써 일상 속 행동 선택 과정에서도 목표 관련 자극을 더 자주 떠올릴 수 있도록 유도

감시자 시스템

문제 — 혼자 공부할 경우 쉽게 미루거나 집중 흐름이 끊기는 문제 발생

해결 — 상호 동의 기반 감시자 시스템 설계. 서로의 집중 상태와 행동 흐름을 확인할 수 있는 구조 구성

의도 — 단순 소셜 기능이 아닌, "누군가 보고 있다"는 인식만으로 행동과 집중도가 증가하는 호손 효과를 기반으로 설계

03

주요 기여

Harness Engineering

  • AI 기반 개발 생산성을 높이면서도, 무분별한 코드 생성과 컨텍스트 오염 문제를 방지하기 위해 Harness Engineering 구조 설계
  • Layer Harness 아키텍처
    • Layer 1: 규칙 문서(AGENT.md) — 자연어 기반 규칙 문서를 통해 AI 작업 범위와 구현 우선순위를 명시
    • Layer 2: 작업 프로토콜(docs/workflow.md) — 구현 이전에 범위 분석, 성공 조건, 검증 계획을 먼저 정의하도록 작업 흐름 표준화
    • Layer 3: 자동 검증(scripts/agent-verify.ps1) — lint/type-check/test · 위험 코드 스캔까지 코드 레벨 검증 자동화
    • Layer 4: Git Hook / 커밋 규칙 — 검증되지 않은 코드와 잘못된 커밋 메시지가 저장소에 반영되지 않도록 Git 단계에서 강제

Cloudflare Tunnel + 미니 PC 구축

  • Infra 구조와 서비스 운영 과정을 직접 학습하기 위해, 미니 PC 기반 자체 인프라 환경을 구축
  • Docker 기반으로 백엔드 및 부가 서비스를 운영하고, Cloudflare Tunnel을 활용해 공인 IP 없이 외부 HTTPS 접근 환경 구성

FCM 기반 알림 게이트웨이 구현

  • 여러 도메인에 흩어질 수 있는 알림 발송 로직을 NotificationGateway로 통합해, 비즈니스 서비스는 알림 채널 세부 구현에 의존하지 않고 공통 Payload만 전달하도록 설계
  • 사용자 알림 설정, 학교 시간/수면 시간 차단, 일일 발송 제한, 알림 타입별 발송 제한 등 공통 정책을 Gateway 레벨에서 일관되게 처리
  • Firebase Admin SDK 기반 FCM 발송 모듈을 구현하고, 사용자별 다중 디바이스 토큰에 대해 순차 발송을 지원
  • FCM 응답 중 만료되거나 해지된 토큰을 감지해 DB에서 자동 삭제하도록 구현해 토큰 생명주기 관리 안정화
  • 알림 발송 실패가 핵심 비즈니스 로직 실패로 전파되지 않도록 sendSafely()와 발송 결과 enum을 도입해 운영 안정성 확보

DDD 기반 행동 지속 도메인 설계

  • "계획 → 실행 → 회고 → 복귀" 핵심 행동 흐름을 기준으로 도메인 책임을 분리하고, 핵심 과제·시간 배치·집중 기록·회고 데이터를 독립적으로 관리
  • 계획 변경과 실행 시간표 간 불일치를 줄이기 위해 Domain Event 기반 동기화 구조를 적용하고 Aggregate 간 직접 참조 최소화
  • 일별 행동 요약과 이벤트 로그를 분리해 회고, 복귀 제안, 추천, 통계 기능으로 확장 가능한 행동 데이터 기반 구축

집중 세션 통계 & 추천 파이프라인

  • 집중 세션 데이터를 단순 기록으로 저장하는 데 그치지 않고, 일일 요약/기간별 통계/추천 기능으로 확장할 수 있는 데이터 파이프라인 설계
  • FocusSession 원천 데이터를 DailyFocusSummary 스냅샷으로 집계하고, 이를 기반으로 주간/월간 통계와 집중 시간대 추천 계산 구조 구현
  • 날짜가 넘어가는 세션, 중복 집계 가능성 등 실제 사용 상황에서 발생할 수 있는 예외를 고려해 일일 통계의 정합성 유지
  • 축적된 행동 데이터를 회고, 추천, 개인화 기능으로 연결할 수 있는 백엔드 기반 마련
04

성능 최적화

Home 조회 기능 성능 최적화
Cache Validation & Profiling & Transaction Optimization / Redis Removal / Gatling
학년 평균 인원을 기준으로 DAU 150명, Peak TPS 10 수준의 조회 중심 서비스 환경을 가정.
배경
홈 조회 API는 여러 Bounded Context를 집계하며 8회 이상의 순차 DB 조회가 발생하고 있었고, 반복 조회 API 특성상 Redis Cache를 통해 DB 부하를 줄일 수 있을 것으로 예상하여 도입 검토.
접근
Redis Cache ON/OFF 환경을 동일한 Gatling 시뮬레이션으로 A/B 테스트하며 현재 규모에서의 실제 캐시 효과를 검증. Hibernate Session Metrics 기반으로 비용을 프로파일링하며 실제 병목 구간을 분석한 결과, 캐시보다 트랜잭션 분산 및 조회 구조가 주요 병목임을 확인.
해결
QueryHomeTodayService 단일 @Transactional 적용으로 조회 흐름을 하나의 JDBC Connection으로 통합. readOnly 트랜잭션 및 Provisioner 구조로 조회/생성 흐름 분리. fetch join 기반 조회 구조 검증을 통해 N+1 및 불필요한 추가 쿼리를 제거. A/B 테스트 결과를 바탕으로 홈 조회 Redis Cache 도입이 불필요하다 판단하여 Cache 관련 구조 제거.
p95 응답시간
105 → 66ms
37% ↓
캐시 ON p95
60ms
비교군
Peak TPS 10
0%
실패율
결론
캐시 효과 < 유지 비용
Redis 캐시 제거
05

회고

Retrospective — Movra

문제를 바라보는 관점의 변화

Movra 프로젝트는 단순 기능 구현이 아니라, 문제를 새로운 관점에서 정의하고 해결해보는 경험이었습니다. 위 프로젝트는 저와 주변 사람들이 계획을 세워도 반복적으로 실패하는 모습을 보며 시작되었습니다. 저는 이를 단순 의지 부족의 문제가 아니라, 소프트웨어적으로 해결할 수 있는 문제라고 생각했습니다.

뇌 과학 기반 행동 지속 관점으로의 접근

이 문제를 해결하기 위해 자료를 조사하면서 기존 일정 관리 서비스와 같은 방식으로는 결국 같은 실패가 반복될 것이라 판단했고, 문제를 행동 흐름과 행동 지속 관점에서 다시 바라보고자 했습니다. 그 과정에서 "사람의 행동은 자신의 뇌의 영향을 받는 것이 아닐까?"라는 생각을 하게 되었습니다. AI Searching을 활용해 관련 논문과 자료를 조사하며 서비스 구조를 설계했고, 행동 지속 방식과 개인별 동기 요인 등을 분석하며 기능 방향성을 구체화할 수 있었습니다.

개발자로서의 관점 변화

이번 프로젝트를 통해 개발자의 역할에 대해서도 다시 고민하게 되었습니다. 단순히 요구사항을 구현하는 것이 아니라, 문제의 본질을 이해하고 해결 방향까지 설계하는 과정 역시 개발자의 중요한 역할이라는 점을 느끼게 되었습니다.

AI 활용 방식에 대한 고민

구현 과정에서는 문서와 실제 코드 간 차이, 높은 구현 난이도 등 여러 어려움도 있었습니다. 이를 해결하기 위해 AI Agent를 단순 자동화 도구가 아니라, 문제를 함께 분석하고 검증하는 협업 도구로 활용했습니다. 특히 AI 결과를 그대로 사용하는 것이 아니라, 동작 원리와 구조를 직접 이해하고 개선하며 개발을 진행하고자 노력했습니다.

프로젝트를 통해 얻은 점

이번 프로젝트는 기술적 성장뿐 아니라, 문제를 바라보는 시각과 AI를 활용하는 태도까지 다시 고민해볼 수 있었던 경험이었습니다. 현재 Movra는 알파 테스트를 진행 중이며, 고등학생 대상 정식 출시를 목표로 서비스를 준비하고 있습니다.

02 / Selected Work

Meezy.

온라인 회의를 진행하며, AI 기반 자동 요약과 피드백을 제공하고 발화·채팅·참여 시간을 분석해 참여도를 수치화하는 서비스

Period 2026.01.05 — 04.05
Role 백엔드 & PM
Repository GITHUB ↗
Tech Stack Java · Spring Boot · Spring AI · WebSocket · RabbitMQ · Redis · MySQL · Docker
Meezy 대시보드 화면
Meezy 회의 피드백 화면
01

프로젝트 개선 과정

AI EXPO에 BLIP이라는 이름으로 출품했지만, 일정 관리와 팀 운영, 커뮤니케이션 구조의 한계로 인해 서비스 완성 단계까지 도달하지 못하고 기능 중심의 발표에 그쳤습니다.

하지만 이 과정에서 여러 기업 관계자들로부터 피드백을 받으며, 프로젝트의 실질적 가치와 시장성을 검증할 수 있었습니다. 이를 통해 프로젝트를 단순히 마무리하기보다, 구조적으로 다시 개선해보고 싶다는 생각을 갖게 되었습니다.

이를 계기로 프로젝트를 재정비하며 협업 구조를 우선적으로 설계했습니다. 역할 분담을 명확히 정의하고, 정기 공유 프로세스와 이슈 트래킹 체계를 구축한 뒤 Meezy.로 리브랜딩하여 프로젝트를 재개했습니다.

새로운 운영 구조를 기반으로 프로젝트를 재개하며, 기술 구현뿐 아니라 협업 프로세스 개선까지 포함한 개발 경험을 체계적으로 확장했습니다. 이후 프로젝트에서 커뮤니케이션 체계와 협업 구조를 먼저 설계하는 방식으로 개발 프로세스를 개선하고 있습니다.

02

아키텍처

Layered Architecture 다이어그램
  • Layered Architecture 기반, 변경 가능성이 높은 외부 인프라 영역에만 Out Port/Adapter 패턴을 선택적으로 적용
  • 도메인 영역은 매퍼 계층의 반복적인 변환 비용을 제거하고 비즈니스 로직에 집중하기 위해 JPA 종속 설계를 수용
DDD 도메인 설계 원칙 다이어그램
  • Bounded Context 및 Aggregate Root를 기준으로 패키지 구조를 설계하여 도메인 단위의 변경 범위를 명확히 분리
  • 도메인 객체가 유스케이스와 규칙을 직접 표현하도록 구성하여 코드만으로 시스템의 흐름과 설계 의도를 파악 가능한 구조 설계
  • 비즈니스 규칙을 엔티티 내부에 캡슐화하는 Rich Domain Model을 적용하여 서비스 레이어에 로직이 분산되는 문제를 방지
03

주요 기여

화상 시스템 전환 (Jitsi API → WebRTC)

  • Jitsi API의 커스터마이징 한계로 WebRTC 기반 P2P 구조로 전환
  • 참여도 측정·음성 데이터 수집 등 서비스 고유 기능과의 연동이 전환 이유
  • 전용 Signaling 서버를 구현하고 coturn 기반 STUN/TURN 서버를 구축하여 안정적인 P2P 연결을 확보

회의 요약 전환 (Python AI → Spring AI)

  • 팀 7명 → 2명 축소에 따라 별도 Python 서버의 운영 부담 증가
  • 참여도 측정·음성 데이터 수집 등 서비스 고유 기능과의 연동이 전환 이유
  • Spring AI 기반 단일 파이프라인으로 통합해 배포 포인트 제거 및 운영 비용 절감

ArchUnit 아키텍처 테스트

  • 아키텍처 설계 원칙이 문서에만 머무르지 않도록 계층 간 의존성과 패키지 규칙을 테스트 코드로 구체화
  • 개발 과정에서 발생할 수 있는 설계 위반을 빌드 단계에서 조기에 탐지하도록 하여 설계와 구현 간 불일치를 사전에 방지

참여도 산출 모델 설계

  • 단순 접속 시간이 아닌 실제 기여도를 반영하기 위해 채팅(0.01)·발화(0.5)·참여시간(0.49) 가중치 기반의 참여율 산출 모델 설계
  • Redis 기반 이벤트 저장 구조를 도입하여 장애 상황에서도 데이터 유실 방지

채팅 시스템

  • WebSocket을 통해 실시간 메시지 송수신을 처리하고, RabbitMQ를 활용해 메시지 전달과 처리를 비동기적으로 분리
  • 메시지 수신(WebSocket)과 저장/처리(RabbitMQ)를 분리하여 서버 장애 상황에서도 메시지 유실을 최소화

협업 프로세스 구축

  • 정기 공유 프로세스와 이슈 트래킹 체계를 도입하여, 팀원 간 정보 전달 누락과 작업 중복 문제를 개선

문서 관리 체계

  • Overview(목표·일정) / Team Docs(운영 규칙) / Tech Docs(아키텍처·API) 3단 구조로 중앙화하여 온보딩 비용 최소화
04

트러블슈팅

비동기 환경에서 파일 데이터 유실 발생
Async / MultipartFile Lifecycle Issue
문제
비동기 처리 구조에서 MultipartFile을 전달하는 과정에서 FileNotFoundException 발생
원인 분석
MultipartFile은 서블릿 컨테이너가 관리하는 임시 파일 참조로, HTTP 요청 종료 시 자동 삭제 → @Async 스레드와의 생명주기 불일치가 원인
해결 방법
요청 생명주기에 종속되지 않도록 파일 데이터를 메모리 기반 byte[]로 복사하는 방식으로 구조를 변경
05

성능 최적화

회의 입장(Meeting Join) 성능 최적화
Async Event Processing & Connection Pool Tuning / Gatling
재학생 평균 인원을 기준으로 DAU 100명, Peak 동시 입장 30명 수준의 회의 중심 서비스 환경을 가정.
배경
사용자 입장 시 Join API, WebSocket 연결, 팀원 참가 처리 등이 동시에 수행되며 입장 지연이 발생할 가능성이 있어, 실제 사용자 체감에 가까운 Peak 상황 기준으로 성능 테스트를 진행.
접근
Gatling 기반 Peak Burst 시뮬레이션을 구성하여 동일 meetingId에 대해 N명의 사용자가 동시에 입장하는 상황을 재현. Join 흐름 내부의 DB Query 구조와 Transaction 흐름을 분석하며 실제 병목 후보를 분리. AFTER_COMMIT 기반 broadcast 동기 처리와 Hikari Connection Pool 부족 가능성을 각각 병목 가설로 설정 후 A/B 측정 기반으로 검증.
해결
MeetingEventTransactionalListener에 @Async를 적용하여 AFTER_COMMIT broadcast를 별도 TaskExecutor 스레드에서 처리하도록 변경. Hikari maximum-pool-size를 20 → 40으로 확장하여 Peak 동시 요청 환경에서 JDBC Connection Queue 대기를 감소. fetch join 기반 조회 구조 검증을 통해 N+1 및 불필요한 추가 쿼리를 제거.
p95 응답시간
756 → 590ms
22% ↓
9명 동시 p95
424 → 248ms
42% ↓
실패율
0%
전 시나리오
결과
DB Connection Pool
Queueing 병목 확인
06

회고

Retrospective — Meezy.

프로젝트 재설계 경험

Meezy. 프로젝트는 기존 BLIP 프로젝트를 기반으로, 현재 서비스 상황과 요구사항에 맞춰 재설계한 프로젝트입니다. 기존 Jitsi API 기반 구조를 WebRTC 기반으로 전환하며 실시간 통신 구조를 깊이 있게 학습할 수 있었고, Python AI Server를 Spring AI Server로 이전하며 운영 효율성과 유지보수성을 고려한 구조 개선을 경험할 수 있었습니다.

프로젝트를 바라보는 관점 변화

이번 프로젝트를 통해 "잘 작동하는 서비스"에 대한 관점도 크게 바뀌게 되었습니다. 이전에는 기능이 정상적으로 동작하는 것이 좋은 프로젝트라고 생각했지만, 이제는 사용자뿐 아니라 개발자 입장에서도 잘 동작하는 구조가 중요하다고 느끼게 되었습니다. 사용자는 안정적으로 서비스를 이용할 수 있어야 하고, 개발자는 지속 가능한 코드와 구조 위에서 원활하게 협업할 수 있어야 한다고 생각하게 되었습니다.

협업 구조의 중요성

특히 이번 프로젝트를 통해 협업 구조의 중요성을 크게 느끼게 되었습니다. 기존 BLIP 프로젝트에서는 문제가 발생했을 때 프론트엔드와 백엔드 간 충분한 소통 없이 각자 해결하려는 방식이 반복되었고, 그 과정에서 일정 지연과 의사결정 문제가 발생했습니다. 결국 AI EXPO에서는 완성된 서비스를 선보이지 못했지만, 동시에 여러 기업 관계자들로부터 시장성과 가능성에 대한 긍정적인 피드백을 받으며 프로젝트를 다시 제대로 완성해보고 싶다는 동기부여를 얻을 수 있었습니다.

프로젝트를 통해 얻은 점

BLIP 프로젝트의 실패를 경험하며, 역할 분담, 정기 공유, 이슈 트래킹 체계 설계 등 협업 구조의 중요성을 깊이 배우게 되었습니다. 또한 좋은 개발자는 단순히 코드를 잘 작성하는 사람이 아니라, 함께 일하는 개발자들까지 편안하게 만들 수 있는 사람이라는 점을 느끼게 되었습니다.