본문으로 건너뛰기

> ls ./work5 services live

포트폴리오

GravEx는 웹 소프트웨어 엔지니어 한 사람이 운영하는 작은 스튜디오입니다. AI로 무엇이든 "딸깍" 만들어지는 시대라지만, 그렇게 나온 결과물은 대개 어디서 본 듯한 slop에 머뭅니다. 비슷한 것이 쏟아질수록 "뭔가 어색하다", "이쪽이 더 예쁘다"를 가려내는 사람의 감각이 더 중요해진다고 믿습니다. 아래 서비스들은 모두 직접 기획하고 만들고 운영하며, 이용자와 수시로 이야기 나누면서 끝없이 다듬고 있습니다.

모두 실제로 공개되어 돌아가는 서비스입니다. 데이터를 모으는 배치와 워커, 검색, 로그인, 알림, 자동 배포와 장애 대응까지 한 사람이 맡고 있습니다. 서비스마다 무엇을 하고, 어떻게 만들어 운영하는지 적었습니다.

01 real.gravex.app 운영 중

여기얼마

주소로 확인하는 매매·전월세 실거래가 지도

여기얼마는 국토교통부 실거래가 공개 자료를 모아 지도 위에 펼친 서비스입니다. 아파트, 오피스텔, 연립·다세대의 매매와 전월세 거래를 주소나 건물 이름으로 찾아볼 수 있습니다.

지도에서는 시·도부터 시·군·구, 단지까지 줌에 따라 평균가와 거래량이 묶여 보이고, 건물을 누르면 면적별 거래 이력과 차트가 나옵니다. 역대 최고가를 다시 쓴 거래는 매시간 모아 피드로 보여줍니다.

주요 기능

  • 줌 단계별 클러스터와 건물 마커 지도, 주소·건물 검색
  • 건물 상세: 면적별 거래 이력과 차트
  • 랭킹, 주·월·연 단위 동향, 신고가·이슈 피드
  • 정권별 주요 부동산 대책 전후를 비교하는 정책 타임라인
  • 관심 건물, 달러·비트코인·금 환산 가격

// 기술적 특기사항 3 notes

  1. 01

    실거래 3,150만 건을 매일 다시 맞춰 적재

    2006년부터의 매매·전월세 거래를 원본과 다시 맞춥니다. 정정되거나 취소된 계약까지 반영하고, 몇 번을 돌려도 같은 결과가 나옵니다.

  2. 02

    지도는 미리 집계해서 바로

    시·도, 시·군·구, 읍·면·동 단위 집계를 배치에서 미리 만들어 두고, 요청이 오면 큰 계산 없이 결과만 읽어 보여 줍니다.

  3. 03

    건물 검색과 검색 엔진용 페이지

    건물과 지역을 Typesense로 검색합니다. 건물 상세는 서버에서 렌더링하고, 거래가 충분한 건물만 사이트맵에 올려 얇은 페이지를 거릅니다.

어떻게 만들고 운영하나

API는 Go와 PostgreSQL로 만들고, 건물 검색은 Typesense로 합니다. 매일 배치가 국토교통부 OpenAPI에서 새 거래를 받아 정리하고, 지역 코드 변경이나 재건축 같은 예외는 관리자 콘솔에서 검토합니다.

화면은 SvelteKit으로 만들었고 건물 상세는 서버에서 그려 검색 엔진이 읽을 수 있게 했습니다. 지도는 네이버 지도를 씁니다.

  • Go
  • SvelteKit
  • PostgreSQL
  • Typesense
  • Naver Maps

사례 글 읽기 → real.gravex.app ↗

여기얼마 — 지도 이동·확대 → 단지 상세·차트 → 단지 검색
admin-real.gravex.app
운영 어드민 —접속 현황 → 크론 호출·수동 배치 → 파티션 스윕 → 거래 테이블(필터·정렬) → 하락거래 → AI 사용량

02 coinsect.io 운영 중

코인충

시세와 방송인 포지션을 한 화면에서 보는 트레이더 커뮤니티

코인충은 암호화폐와 주식을 매매하는 사람들을 위한 커뮤니티입니다. 국내외 거래소의 코인 시세와 김치 프리미엄(김프)·역프리미엄, 주식과 주요 지수를 한 화면에 모아 보여줍니다.

가장 큰 특징은 방송인 실시간 포지션입니다. 선물 매매를 방송하는 스트리머의 화면에서 지금 어떤 포지션(롱·숏, 진입가, 레버리지)을 잡고 있는지 자동으로 읽어 24시간 기록하고, 방송 중인 방송인과 최근 매매를 바로 보여줍니다. 시세 화면 옆에 사람들의 실제 포지션이 함께 있는 셈입니다.

비트코인 계산기와 비트코인 블로그는 btc.coinsect.io에서 따로 운영합니다.

주요 기능

  • 거래소별 코인·주식·지수 시세와 김프·역프 표
  • 방송인 실시간 선물 포지션 자동 수집, 방송인별 페이지와 방송 중 배너
  • 매매 스레드(글 + 투표), 청산가 추정
  • 이미지·영상·음성을 올리는 커뮤니티와 실시간 웹채팅
  • 이메일 코드·카카오 로그인, 웹 푸시 알림, 홈 화면에 설치하는 앱(PWA)

// 기술적 특기사항 4 notes

  1. 01

    방송 화면에서 포지션을 24시간 판독

    방송 화면을 주기적으로 캡처해 AI가 포지션을 읽고, 읽은 원문과 정리된 기록을 나눠 저장합니다. 판독이 틀릴 수 있다는 전제로, 끝난 매매는 AI가 한 번 더 검토해 바로잡습니다.

  2. 02

    포지션 변화를 카드 이미지로 자동 게시

    진입·청산 같은 사건이 생기면 서버가 카드 이미지를 직접 그려 Threads에 올립니다. 게시 빈도는 상한을 두어 사람 손 없이 돕니다.

  3. 03

    실시간 시세

    거래소와 이어진 연결을 하나로 모아 여러 브라우저에 나눠 줍니다. 외부 시세가 끊기면 마지막 정상값으로 버티면서 다시 시도합니다.

  4. 04

    채팅 엔진을 직접 만들어 세 서비스에서 공유

    순서가 맞는 멀티테넌트 채팅 엔진과 SDK를 직접 만들어 코인충, 에브리메이플, 여기얼마가 함께 씁니다. 같은 엔진을 이제 누구나 무료로 쓸 수 있게 열었습니다.

    채팅 API 항목 보기 →

어떻게 만들고 운영하나

API 서버는 Go로, 화면은 Nuxt로 만들었습니다. PostgreSQL에 기록하고 Redis로 시세처럼 자주 바뀌는 값을 빠르게 나눠 줍니다.

회원 등급에 따라 포지션 갱신 주기와 푸시 알림을 다르게 주고, 서버는 AWS(EC2, S3, CloudFront, SES) 위에서 운영합니다.

  • Go
  • Nuxt
  • PostgreSQL
  • Redis
  • AWS

사례 글 읽기 → coinsect.io ↗btc.coinsect.io ↗

코인충 — 시세·김프 → 실시간 포지션 → 방송인 통계
admin.coinsect.io
운영 어드민 —대시보드 → 방송인 → 매매 스레드 → 감사 기록 → 크론잡 → 홍보 통계

03 scheduly.gravex.app 운영 중

Scheduly

일정과 노트가 하나로 연결되는 워크스페이스

Scheduly는 캘린더와 마크다운 노트, AI 비서를 한곳에 묶은 개인 워크스페이스입니다. 흩어진 일정과 생각을 한 작업 공간에서 다룹니다.

AI 비서는 내 노트와 일정을 찾아보고 출처를 달아 답합니다. "다음 주 일정 정리해 줘", "회의 노트에서 결정된 것만 모아 줘" 같은 부탁을 하면 근거가 된 노트와 일정 링크를 함께 보여주고, 일정이나 노트를 만들어 주기도 합니다.

주요 기능

  • 여러 캘린더, 반복 일정과 회차별 예외, .ics 가져오기·내보내기, 음력·공휴일
  • 폴더 트리 마크다운 노트, 공유 권한(소유자·편집자·읽기), ZIP 백업
  • 내 기록을 출처와 함께 찾아 답하는 AI 비서, 음성 입력
  • 브라우저에서 암호화하는 노트 잠금
  • 웹 푸시 리마인더, 외부 AI 에이전트 연결(MCP)

// 기술적 특기사항 4 notes

  1. 01

    내 기록 위에서 답하는 비서

    노트와 일정을 키워드와 의미, 두 방식으로 함께 검색해 근거를 찾고, 답변에는 출처를 붙입니다. 근거가 약하면 쓰지 않아 엉뚱한 답을 줄입니다.

  2. 02

    무거운 일은 별도 작업자가

    검색 색인과 알림은 별도의 작업 프로세스가 맡아, 화면 요청이 느려지지 않습니다.

  3. 03

    Claude 앱에서 쓰는 커스텀 커넥터(MCP)

    Claude 앱의 커스텀 커넥터에 주소만 넣고 로그인하면, Claude가 일정과 노트를 읽고 쓸 수 있습니다. 지우는 일은 미리보기를 보여 준 뒤 확인해야 실행됩니다.

  4. 04

    확인하고 실행하는 AI 비서, 서버도 못 읽는 잠금 노트

    비서가 일정·노트 변경을 제안하면 사용자가 확인한 뒤 실행합니다. 잠근 노트는 브라우저에서 암호화해 서버도 내용을 알 수 없습니다.

어떻게 만들고 운영하나

SvelteKit과 PostgreSQL(pgvector)로 만들었습니다. 노트와 일정은 키워드 검색과 벡터 검색을 함께 써서 찾고, 알림과 검색 색인은 별도의 워커가 처리합니다.

잠근 노트는 브라우저에서 암호화해 저장하므로 서버는 내용을 알 수 없고, AI 검색에서도 빠집니다. 파일은 S3와 CloudFront로, 메일은 SES로 보냅니다.

  • SvelteKit
  • PostgreSQL
  • pgvector
  • AWS

사례 글 읽기 → scheduly.gravex.app ↗

Scheduly — AI 비서에 말로 일정을 만들고, 내 일정과 노트를 근거(출처 표시)로 답을 받고, 공개 예약 링크로 같이 쓰는 모습 (데모 계정)

04 everymaple.com 운영 중

에브리메이플

메이플스토리 캐릭터 조회, 경험치 효율, 강화 시뮬레이터

에브리메이플은 메이플스토리 플레이어를 위한 정보 사이트입니다. 캐릭터 이름을 넣으면 장비, 스탯, 유니온, 스킬을 넥슨 Open API에서 가져와 정리해 보여줍니다.

레벨별 경험치 표와 경험치 아이템별 효율, 보스 정보, 아이템 시세와 가치 평가, 캐릭터 비교를 제공합니다. 스타포스·큐브·추가옵션 같은 강화를 실제 확률로 돌려보는 시뮬레이터도 있어, 큰돈을 쓰기 전에 기대 비용을 가늠해 볼 수 있습니다.

주요 기능

  • 캐릭터 조회: 장비, 스탯, 유니온, 스킬 탭
  • 경험치 효율 표와 아이템별 경험치 페이지
  • 스타포스·큐브·추가옵션 강화 시뮬레이터
  • 보스 정보, 아이템 시세·가치 평가, 캐릭터 비교
  • 사이트 전체에서 쓰는 실시간 채팅

// 기술적 특기사항 4 notes

  1. 01

    장비 가치 평가 모델

    장비 한 벌의 가치를 경매장 시세와 강화 항목의 합으로 추정합니다. 공개된 평가 모델의 계산을 옮겨 와 정답값과 맞췄고, 원본이 바뀌면 자동으로 알아챕니다.

  2. 02

    스타포스 기대 비용을 정확히

    파괴되면 단계가 되돌아가는 구조라 단순한 반복으로는 풀리지 않아, 기대 비용을 수식으로 정확히 구합니다. 무거운 시뮬레이션은 화면이 멈추지 않게 따로 돌립니다.

  3. 03

    확률은 공식 자료에서, 수치는 실제 장비로 검증

    큐브 잠재 확률은 공식 확률표를 읽어 저장하고, 형식이 바뀌면 테스트가 먼저 실패합니다. 스타포스 능력치는 랭커의 실제 장비로 검증합니다.

  4. 04

    캐릭터 하나에 API 수십 번, 흔들리지 않게

    캐릭터 조회 한 번에 넥슨 API를 수십 번 부릅니다. 일부가 실패해도 같은 입력에 같은 결과가 나오게 하고, 짧은 캐시로 호출 한도를 지킵니다.

어떻게 만들고 운영하나

SvelteKit(Svelte 5)과 TypeScript, Tailwind CSS로 만들고 PostgreSQL과 Redis를 씁니다. 캐릭터 데이터는 넥슨 Open API에서 받아 캐시합니다.

강화 확률은 넥슨이 공개한 확률표를 자동으로 읽어 테스트로 검증하고, 스타포스 수치는 실제 랭커 장비와 맞춰 검증합니다. 자료가 없는 수치는 추정으로 채우지 않는 것이 원칙입니다.

게임 공지는 10분마다 확인해 정해진 형식의 변경을 사이트에 반영합니다. 코드를 올리면 테스트와 빌드를 거쳐 배포되고, 배포 직후 상태 확인에 실패하면 이전 버전으로 되돌립니다.

  • SvelteKit
  • TypeScript
  • Tailwind CSS
  • PostgreSQL
  • Redis

사례 글 읽기 → everymaple.com ↗

에브리메이플 — 캐릭터 조회 → 장비 → 유니온 → 경험치표 → 시뮬레이터

05 chat.gravex.app 운영 중

채팅 API (무료 공개)

코인충·여기얼마·에브리메이플이 쓰는 채팅 엔진을 누구나 무료로

채팅 API는 직접 만든 채팅 엔진을 그대로 공개한 서비스입니다. 코인충, 여기얼마, 에브리메이플의 채팅이 이 엔진 위에서 돌고 있고, 같은 엔진을 가입하고 키를 발급받으면 바로 무료로 쓸 수 있습니다.

서버는 Go 바이너리 하나, 클라이언트는 런타임 의존성이 없는 TypeScript SDK(@kispi/chat) 하나입니다. SDK를 설치해 소켓을 연 뒤 방을 구독하면 메시지가 순서대로 모입니다. 로그인한 사용자가 누구인지는 서비스 백엔드가 서명한 토큰으로 넘기고, 채팅 서버는 그 서명만 검증합니다.

주요 기능

  • 공개·비공개·채널·DM 방, 스레드·답장·첨부·리액션·읽음 표시
  • 입력 중 표시와 방별 접속자 목록(presence)
  • 로그인하지 않은 방문자도 말할 수 있는 게스트(서명된 자격증명으로 신원 유지)
  • 이벤트를 받는 웹훅, 메시지가 저장되기 전에 검사하는 before_publish 훅
  • 콘솔에서 앱·키·웹훅·사용 한도 관리, 사용자 밴·메시지 삭제

// 기술적 특기사항 4 notes

  1. 01

    방마다 빈틈없는 순번, 재연결하면 놓친 메시지까지

    방마다 메시지에 순번을 붙여, 연결이 끊겼다 붙어도 빠진 메시지를 알아채 채웁니다. 삭제도 순번이 비지 않게 표시만 남깁니다.

  2. 02

    웹훅과 발행 전 검사

    메시지가 올라오기 전에 서비스 서버가 내용을 보고 막거나 통과시킬 수 있고, 발행·수정·삭제 같은 이벤트는 웹훅으로 전달됩니다.

  3. 03

    런타임 의존성 0개 SDK

    TypeScript SDK 하나로 소켓 연결, 재접속, 중복 방지까지 처리합니다. 다른 라이브러리에 의존하지 않아 가볍게 붙일 수 있습니다.

  4. 04

    한 서버를 앱 단위로 나눠 쓰는 구조

    서비스마다 앱이 따로고, 사용 한도와 웹훅도 앱별로 정합니다. 콘솔에서 바꾸면 곧바로 반영됩니다.

어떻게 만들고 운영하나

Go 서버 하나에 PostgreSQL로 저장하고, Redis가 있으면 여러 노드로 나눠 보냅니다. 가입·키 발급·앱 설정·사용자 관리는 SvelteKit으로 만든 콘솔이 맡고, 콘솔은 엔진 DB에 붙지 않고 HTTP로만 엔진을 부릅니다.

세 서비스가 실제로 쓰는 엔진이라, 변경은 PostgreSQL·Redis를 띄운 통합 테스트와 콘솔 계약 테스트를 거쳐 배포합니다. Prometheus 지표와 알림 규칙으로 지켜봅니다.

  • Go
  • TypeScript
  • SvelteKit
  • PostgreSQL
  • Redis
  • WebSocket

사례 글 읽기 → chat.gravex.app ↗문서 ↗npm @kispi/chat ↗

chat.gravex.app
채팅 API 소개 첫 화면
채팅 API 소개 첫 화면

사례 글

서비스마다 어떤 문제였고, 어떻게 만들었고, 운영하며 무엇을 배웠는지 길게 적었습니다.

만드는 원칙

  1. 01

    본질에 집중

    복잡한 부가 기능 대신 사용자가 실제로 쓰는 가치에 집중합니다. 도구가 생각의 속도를 가로막지 않게 가볍게 만듭니다.

  2. 02

    데이터를 정확하게

    공공 원장, 게임 API, 방송 화면처럼 출처가 다른 데이터를 검증해서 씁니다. 자료가 없는 수치는 지어내지 않습니다.

  3. 03

    직접 쓰며 다듬기

    매일 직접 쓰며 마주치는 작은 불편까지 고칩니다. 배포와 장애 대응도 자동화해, 혼자서도 계속 다듬을 수 있게 합니다.

이렇게 만들고 운영하는 방식 그대로, 고객님의 서비스를 만들어 넘겨드립니다.

1~2개월 동안 실제로 운영되는 서비스를 함께 만들고, 그 뒤에는 AI로 직접 고치고 키울 수 있게 넘겨드립니다.

서비스 구축 알아보기 →