← 블로그

소원진

Portfolio Summary · 2026.09

소원진

Front-end Developer · 5 yrs

결제 · 인증 · 커머스 도메인 5년차. 구매자 300만 명 규모 커머스에서 결제 · 인증 프론트엔드를 담당하며 MAU 57만 마켓플레이스 이관을 주도했습니다.

Experience

  1. 2024.05 – 현재

    재직 중

    오지큐주식회사 (OGQ)· Front-end Developer

    네이버 투자사 · 디지털 콘텐츠 플랫폼

    커머스·결제·인증 프론트엔드를 설계부터 운영까지 담당. 결제 시스템·통합 인증·AI 챗봇·댓글 모듈 등 신규 프로젝트를 직접 설계·구축.

    콘텐츠
    2억 건
    다운로드
    28억 회
    구매자
    300만 명
  2. 2021.04 – 2023.12

    약 2년 8개월

    (주)엑스티 (XT)· Front-end Developer

    한화·씨젠·KB캐피탈 등 대상 풀스택 에이전시

    한화·씨젠·Gaudio Lab·KB캐피탈 등 B2B 에이전시 프로젝트를 프론트엔드 팀원으로 진행. 한화 RSU Nuxt 2→3 마이그레이션 주도, 씨젠 Featured 프로젝트 리딩·일정 산출 등 일부 프로젝트는 리딩도 담당.

    클라이언트
    한화·씨젠
    역할
    팀원 / 리딩

Selected Work

Architecture마감이 가까운 프로젝트를 처음부터 다시 만들지 않고 Nuxt 3로 옮긴 경험6
빌드 45~55 → 15~20초Webpack에서 Vite로번들 320~380 → 180~220KB전체 gzip 번들

문제

신규 구축 프로젝트를 Nuxt 2로 개발하던 중 고객 요구가 바뀌어 Nuxt 3로 올려야 했습니다. 마감은 다가오는데 이미 작성한 코드가 많아 처음부터 다시 만드는 방법은 일정상 선택하기 어려웠습니다.

판단과 트레이드오프

먼저 Nuxt 2와 3에서 실제로 달라지는 부분부터 정리했습니다. 디렉터리 규칙, 설정 파일 문법, Composition API와 TypeScript 지원 방식처럼 손대야 할 범위를 먼저 알아야 순서를 정할 수 있다고 생각했습니다.

기존 프로젝트 위에서 하나씩 고치는 대신 Nuxt 3 + TypeScript 새 프로젝트를 만들고 코드를 옮기기로 했습니다. 의존성을 그대로 복사했을 때 호환 문제로 빌드가 깨져, npm-check-updates로 호환 가능한 범위 안에서 먼저 정리했습니다.

레이아웃과 그 하위부터 옮겨 화면이 뜨는 상태를 먼저 만들었습니다. 그 다음 Vuex는 Pinia로, $axios는 useFetch로 바꾸는 작업을 스토어와 모듈 단위로 이어갔습니다.

결과

빌드는 45~55초에서 15~20초로, gzip 번들은 320~380KB에서 180~220KB로 줄었고 SSR 콜드 스타트는 800~1000ms에서 300~500ms가 됐습니다. 이때 정한 이관 순서는 이후 MAU 57만 마켓플레이스를 Nuxt 3로 옮길 때도 그대로 사용했습니다.

vuemigration원문 읽기 →
ArchitecturePG마다 다른 결제 흐름을 하나의 구조로 묶은 경험6
3패턴 → 콜백 1개GET·POST 통합 수신에러율 0.5% 이하1.0~1.5%에서 개선

문제

5개 결제 수단을 연동해야 했는데 PG사마다 결과를 돌려주는 방식이 달랐습니다. GET 리다이렉트, 암호화 파라미터를 담은 Form POST, JSON 필드 Form POST가 섞여 있었고 PG사가 요구하는 방식 자체는 프론트에서 바꿀 수 없었습니다.

판단과 트레이드오프

PG사별 연동 차이는 그대로 두고, 결제 전후 flow만 통일하기로 했습니다. 모든 수단이 같은 결제 준비 API를 호출하고 콜백은 하나의 라우트 핸들러가 GET과 POST를 모두 받은 뒤 같은 완료 URL 형식으로 넘기게 했습니다.

PG 자격증명이 클라이언트에 노출되면 안 되기 때문에 결제 준비 API에서 서버 환경 변수로 주입하도록 했습니다.

JSON 개별 필드 방식은 FormData를 여러 개 꺼내는 과정에서 간헐적으로 값이 빠져 콜백 에러율이 높았습니다. 누락될 수 있는 값을 먼저 검증하고 예외 처리를 보강해 해당 방식도 안정화했습니다.

결과

결제 준비부터 결제창이 뜰 때까지의 응답 시간과 콜백 에러율을 방식별로 따로 측정했습니다. 에러율이 가장 높던 JSON 방식은 1.0~1.5% 수준에서 0.5% 이하로 줄였습니다.

Performance백엔드를 바꾸지 않고 대용량 Excel 다운로드를 개선한 경험13
1GB → 200MB브라우저 메모리50 → 20~30초완료 시간

문제

정산 관리자에서 Excel 다운로드 기능을 개선해 달라는 요청이 왔습니다. 기존에는 브라우저가 페이지 단위 API를 반복 호출해 전체 데이터를 메모리에 모은 뒤, 그 데이터를 다시 서버로 보내 Excel을 만드는 구조였습니다. 3만 건에서는 50초 이상 걸리고 메모리가 1GB 가까이 올라 탭이 종료됐지만, 당시에는 Spring 서버를 수정할 수 없었습니다.

판단과 트레이드오프

네트워크 탭을 확인해보니 병목은 백엔드 API 하나가 아니라 데이터 수집과 Excel 생성이 브라우저에서 진행되는 구조 자체에 있었습니다. 그래서 수집과 파일 생성을 Next.js API Route로 옮겨 브라우저가 모은 데이터를 다시 서버로 보내는 과정을 없애기로 했습니다.

50초 넘게 걸리는 작업을 응답만 기다리게 두고 싶지는 않았습니다. 500건씩 청크로 처리하면서 진행률을 SSE로 내려보냈고, 청크 사이에는 setImmediate로 이벤트 루프를 양보해 진행률이 밀리지 않게 했습니다.

EventSource는 GET으로 고정돼 필터 조건과 취소 처리를 같이 넣기 어려웠습니다. 그래서 수신은 fetch와 ReadableStream으로 만들고 AbortController로 취소를 처리했으며, 완성된 파일은 마지막 이벤트에 담았습니다.

결과

완료 시간은 50초에서 20~30초로, 브라우저 메모리 피크는 1GB에서 200MB 이하로 줄었습니다. 브라우저가 멈추지 않고 진행 상황도 볼 수 있게 되어 운영팀에서도 이전보다 훨씬 낫다는 피드백을 받았습니다.

블로그 전체 글 보기 →

Tracks

ArchitectureNext 10→15 · Nuxt 2→3 마이그레이션 주도관련 글 →Performance진입 시간 95%↓ · 애니메이션 CPU 93%↓ · 다운로드 65%↓관련 글 →Ownership댓글 모듈 자체 구축 · 챗봇 운영비 98% 절감관련 글 →

Skills

Deep3년 이상 주력 · 아키텍처 의사결정 경험
TypeScriptReactNext.jsNuxt 3
Working실무 투입 경험 · 기본 러닝 커브 극복
Vue 3SCSSReact QueryPiniaVitestPlaywrightDockerGitHub Actions
Familiar도구 수준 · 필요 시 사용 가능
StorybookMUIVuetifyFigma

Contact

찾고 있는 것

제품 규모가 있는 팀의 프론트엔드 포지션. 결제·인증·커머스 또는 자체 시스템 설계가 필요한 환경을 선호합니다.

LINKEDIN
in/sowonjin
BASE
Seoul, KR

마지막 업데이트 2026.09

EmailLinkedIn