Hi, I'm
백엔드·웹·모바일·배포까지 제품 전체를 혼자 설계·구현하는 풀스택 개발자입니다. 인증·결제·데이터처럼 무겁고 까다로운 부분을 끝까지 파고들어 실제로 안정적으로 동작하게 만듭니다.
한 명이 백엔드·웹·모바일을 모두 만든 아트소품 이커머스. 토스페이먼츠 결제부터 주문 완료까지 실제 구매 흐름 구현.
자세히 보기 →기획·백엔드·웹 프론트·모바일·배포까지 전 과정을 혼자 맡아 만든 아트소품 이커머스입니다. 실제로 운영 중인 서비스로, 결제까지 완주하는 실 구매 흐름을 갖췄습니다.
상품 등록·조회, 장바구니, 주문서 작성, 토스페이먼츠 결제 승인, 주문 완료 처리까지 커머스의 핵심 경로 전체를 구현했습니다. 회원 인증은 JWT 기반으로 처리했습니다.
결제는 실패·중복 승인·금액 위변조 같은 예외가 실제 돈과 직결되는 영역이라, 승인 전 서버에서 주문 금액을 재검증하는 구조로 설계했습니다.
사이트 방문 →한국투자증권 API와 LLM을 붙여 매수·매도를 스스로 판단하는 자동매매 에이전트. 모의투자로 검증한 뒤 실계좌로 운용 중입니다.
자세히 보기 →한국투자증권(KIS) Open API와 LLM을 결합해, 장중(09:00–15:20)에 보유 종목과 시장 데이터를 주기적으로 확인하고 매수·매도를 스스로 판단해 주문까지 내는 자동매매 에이전트입니다. 모의투자로 충분히 검증한 뒤 실계좌 운용 단계로 넘어갔습니다.
이동평균·RSI·MACD 등 기술적 지표를 계산해 LLM에 전달하고, 모델이 낸 매매 판단을 그대로 실행하지 않고 리스크 규칙으로 한 번 더 검증한 뒤 시장가 주문을 냅니다. 모델은 OpenAI API와 로컬 구동(Ollama · Nous Hermes) 양쪽을 지원합니다.
LLM 판단은 확률적이고 실패가 곧 금전 손실이라, 신뢰도 임계값 미만이면 주문을 내지 않고, 종목당 포지션 크기와 일일 손실 한도를 넘기면 매매를 중단하도록 설계했습니다. 모의투자(paper) / 실계좌(live) 모드를 분리해 검증 없이 실거래로 넘어갈 수 없게 했습니다.
Oracle Cloud 서버에 systemd 서비스로 올려 장 시간에 맞춰 자동 실행되며, 모든 매매는 텔레그램으로 실시간 알림이 옵니다. 수익 곡선·대시보드·주간 요약과 엑셀 리포트를 자동 생성해 성과를 추적합니다.
GitHub에서 보기 →증상 기반 한의원 예약·검색 서비스. 노인/일반 두 접근성 모드, 검진결과 암호화 설계.
자세히 보기 →증상을 입력하면 관련 한의원을 찾아 예약까지 이어지는 모바일 서비스입니다.
주 사용자층에 고령층이 포함될 것을 고려해, 글자 크기·터치 영역·정보 밀도를 다르게 한 노인 모드와 일반 모드를 나눠 설계했습니다.
검진결과는 의료 관련 개인정보라 저장 단계에서 암호화하도록 설계했습니다.
사이트 방문 →GitHub 저장소 →반려동물 용품 모바일 이커머스. 상품 상세·장바구니·마이페이지를 일관된 톤으로 설계.
자세히 보기 →반려동물 용품을 파는 모바일 이커머스입니다.
서비스 화면과 관리자 페이지를 모두 배포해 운영 중입니다. 백엔드가 무료 호스팅이라 첫 요청 시 서버가 깨어나는 데 30초 정도 걸릴 수 있습니다.
상품 상세, 장바구니, 마이페이지 등 구매 여정의 주요 화면을 일관된 톤앤매너로 설계하고 구현했습니다.
사이트 방문 →관리자 페이지 →GitHub 저장소 →고객 요청 하나를 요구사항 정의부터 코드 산출물까지 만들어내는 멀티에이전트 AI 시스템.
자세히 보기 →고객의 요청 한 줄을 받아 요구사항 정의를 거쳐 실제 코드 산출물까지 만들어내는 멀티에이전트 시스템입니다.
PM 에이전트가 고객 요청을 상세 요구사항으로 변환하고, 개발자 에이전트가 그 명세를 바탕으로 코드를 생성합니다. 오케스트레이터가 이 흐름 전체를 조율합니다.
단일 프롬프트로 한 번에 만드는 대신, 역할을 나눠 단계별로 검증하며 진행하는 구조를 실험하고 있습니다.
GitHub에서 보기 →3D 지구본으로 여행 기록을 남기는 앱. 지구본↔평면지도 전환을 셰이더로 구현 중입니다.
자세히 보기 →3D 지구본 위에 다녀온 나라를 기록하는 여행 기록 앱입니다. 모바일 앱으로 만들기 전에 웹에서 인터랙션을 검증하는 프로토타입 단계입니다.
지구본을 돌려 국가를 선택하고 상세 지도를 보거나, 국가명을 한글·영문·코드로 검색할 수 있습니다. 방문한 나라를 표시해 한눈에 볼 수 있습니다.
지구본과 평면 지도 사이를 자연스럽게 전환하는 모핑 셰이더를 구현하고 있습니다. 국가 경계는 Natural Earth 공개 데이터를 사용합니다.
GitHub에서 보기 →직접 기획하고 개발 중인 게임 프로젝트. 세계관 설계부터 시스템 구현까지 진행하고 있습니다.
자세히 보기 →직접 기획하고 개발 중인 게임 프로젝트입니다. 세계관 설계부터 시스템 구현까지 전 과정을 진행하고 있습니다.
현재 개발 진행 중이며, 정리되는 대로 상세 내용을 공개할 예정입니다.
GitHub에서 보기 →보디빌딩 미디어 브랜드 공식 사이트. 촬영 예약 동시성과 한·일 이중언어를 실제 운영 기준으로 설계했습니다.
자세히 보기 →보디빌딩 선수와 센터를 위한 영상·사진 미디어 브랜드의 공식 웹사이트입니다. 촬영 예약을 온라인으로 받고, 시합 일정과 크루 성장기를 발신하며, 일본 고객을 위한 통역 신청 창구를 운영합니다. 습작이 아니라 실제 운영을 목적으로 만들고 있습니다.
같은 시간대에 두 건이 잡히면 안 되는데, 시간대 겹침은 UNIQUE 제약으로 표현할 수 없습니다. 그래서 세 층으로 막았습니다. ①날짜 단위 락 행에 SELECT … FOR UPDATE로 검사~INSERT 구간을 직렬화, ②start < :end AND end > :start 겹침 쿼리, ③UNIQUE(slot_key) 최후 방어선.
갭 락 데드락 — 존재하지 않는 행에 FOR UPDATE를 걸면 InnoDB가 갭 락을 잡아, 동시 요청 5건 중 4건이 데드락으로 죽었습니다. 락 행을 별도 트랜잭션에서 먼저 커밋한 뒤 잠그도록 순서를 뒤집어 해결했습니다.
REPEATABLE READ 스냅샷 — 락으로 순서를 세워도 일반 SELECT는 트랜잭션 시작 시점을 보기 때문에, 락을 잡고도 방금 커밋된 예약이 보이지 않았습니다. READ_COMMITTED로 해결했습니다. 둘 다 테스트가 없었다면 운영에서 중복 예약으로 발견됐을 문제입니다.
한국어와 일본어를 두 층위로 분리했습니다. UI 문자열은 react-i18next + Spring MessageSource, 콘텐츠는 post / post_translation 번역 테이블로 나눴습니다. 한국 크루 성장기와 일본 크루 성장기는 서로의 번역이 아니라 별개의 글일 수 있어야 하기 때문입니다. 번역이 없는 글은 그 언어 목록에서 제외하지만, 상품·가격은 한국어로 폴백합니다 — 번역이 없다고 예약을 막으면 매출이 사라지니까요.
게시 동의 기본값을 false로 두고 공개 목록 쿼리에 consent = true를 박아 서비스 계층에서 빠뜨릴 수 없게 했습니다. 보유기간(촬영 후 1년 / 문의 처리 후 6개월)은 설정 한 곳에서 관리하고 배치가 실제로 지웁니다. 업로드 파일은 확장자·MIME을 믿지 않고 실제 디코딩으로 판별해 전부 JPEG로 재인코딩합니다 — 폴리글롯 파일이 무력화되고 EXIF의 GPS 좌표도 함께 제거됩니다.
리프레시 토큰을 JWT가 아니라 불투명 랜덤 문자열 + DB 해시 저장으로 만들었습니다. JWT는 서명만 맞으면 유효해서 로그아웃이나 탈취 세션 강제 종료를 구현할 수 없기 때문입니다. 액세스 토큰은 헤더, 리프레시는 httpOnly 쿠키에 두고, 토큰 회전 + 재사용 탐지로 폐기된 토큰이 다시 들어오면 그 계정의 모든 세션을 끊습니다.
백엔드 162개 파일 · API 엔드포인트 57개, 프론트엔드 43개 파일 · 한/일 이중언어 라우팅, 테스트 29개 통과(예약 동시성 4 · 관리자 인증 8 · JWT 5 · 문의 5 · 업로드 7). 인프라는 Docker Compose · S3/CloudFront.
GitHub에서 보기 →제스처 인식으로 제어하는 AI 비서 — 손동작 인터페이스 실험.
자세히 보기 →손동작으로 제어하는 AI 비서를 만들어 본 실험 프로젝트입니다.
MediaPipe로 손 제스처를 인식하고, 그 입력을 FastAPI 백엔드로 넘겨 동작을 수행하는 구조를 만들었습니다. 키보드·마우스가 아닌 인터페이스가 실제로 쓸 만한지 확인해 보는 게 목적이었습니다.
GitHub에서 보기 →제조 대기업의 그룹 웹사이트(국문·영문) 구축과, 이를 운영하는 관리자 CMS 연동을 담당했습니다. 제품 사이트와 분리된 그룹사이트를 신규 구축하고, 하나의 CMS에서 국문·영문 / 제품·그룹 콘텐츠를 구분 관리할 수 있도록 데이터 분류 체계를 정리했습니다.
/{lang} 경로 분기 구조로 통일해 국문·영문을 동일 컨트롤러에서 처리, 중복 코드 제거lang_code·site_type 기준 필터링으로 영문 사이트에 국문·제품 콘텐츠 노출 차단ROW_NUMBER() OVER (PARTITION BY ...)문의하기에서 딜러를 선택하면 시/도·시/군/구가 자동 입력되어야 하는데 영문에서만 동작하지 않았습니다. 공통 스크립트가 <html lang="en">일 때 지역 목록을 로마자(Seoul)로 렌더링하는 반면, DB의 딜러 지역값은 한글(서울특별시)이라 텍스트 매칭이 항상 실패하는 구조였습니다.
더 큰 문제는 매칭에 실패해도 별도 처리가 없어, 선택되지 않은 상태의 플레이스홀더 값이 그대로 전송될 수 있는 구조였다는 점입니다. 화면 증상에서 멈추지 않고 저장 결과까지 역추적해 원인을 확정했습니다.
선택 직후 상태를 시계열로 계측해 원인을 특정했습니다. 자동 입력된 지역 변경을 감시 루프가 사용자 조작으로 오인해 딜러 목록을 재생성하면서 선택이 유실되는 구조였습니다.
영문 퀵메뉴가 전혀 동작하지 않았습니다. 원인은 공통 JS가 버튼을 한글 텍스트(빠른 메뉴)로 탐색해 영문 버튼을 찾지 못하는 것이었으나, 해당 파일은 퍼블리셔 관리 영역이라 수정할 수 없었습니다.
innerHTML로 주입해 <script>가 실행되지 않는 점까지 고려“ 추측으로 수정하지 않고, 원인을 실측으로 확인한 뒤 고친다. ”
나바 노비스 · 맨즈피지크
몬스터짐 × 프리덤 맨즈피지크
더블유엔지피 · 맨즈피지크
몬스터짐 · 맨즈피지크
문제·사용자·요구사항을 끝까지 파악하고 범위를 정한다.
데이터·API·인증 구조를 먼저 설계한다.
백엔드부터 화면까지 직접 구현한다.
결제·토큰·보안 등 까다로운 부분을 안정화한다.
배포·운영하며 인프라 이슈까지 대응한다.
개발 공모전 수상 + 맨즈피지크 무대 기록 → 수상 내역 보기
새로운 문제, 무거운 백엔드, 재밌는 실험 — 언제든 환영입니다.
Let's build something solid →