STO 기반 투자 및 거래 시뮬레이션 웹 서비스
Partion은 STO(Security Token Offering) 기반의 투자와 거래 흐름을 가상 환경에서 체험할 수 있는 웹 서비스입니다.
사용자는 예치금을 충전하고, 부동산·미술품·음악 저작권과 같은 실물 기반 STO 상품에 투자할 수 있습니다.
모집이 완료된 상품은 거래소에서 매수·매도할 수 있으며, 거래 체결 내역은 원장 형태로 기록되어 STO 거래 구조를 학습할 수 있습니다.
Partion은 실제 STO 시장의 구조를 학습하고 체험할 수 있도록 만든 시뮬레이션 서비스입니다.
STO는 실물 자산을 토큰화하여 소액 단위로 투자할 수 있게 하는 방식입니다.
하지만 현재는 규제와 제도적 한계로 인해 일반 사용자가 쉽게 접근하기 어렵습니다.
Partion은 이러한 진입 장벽을 낮추기 위해 다음과 같은 흐름을 제공합니다.
- 사용자는 STO 상품을 등록할 수 있습니다.
- 사용자는 모집 중인 상품에 투자할 수 있습니다.
- 모집이 완료된 상품은 거래 가능한 상태로 전환됩니다.
- 사용자는 거래소에서 상품 토큰을 매수·매도할 수 있습니다.
- 체결된 거래는 포트폴리오와 원장에 반영됩니다.
- AI 챗봇을 통해 STO와 서비스 사용 방법을 안내받을 수 있습니다.
STO는 고가의 실물 자산을 작은 단위로 나누어 투자할 수 있게 합니다.
예를 들어 부동산, 미술품, 음악 저작권과 같은 자산은 일반 사용자가 직접 투자하기 어렵지만, 토큰화하면 소액으로도 간접 투자 경험을 제공할 수 있습니다.
Partion은 실제 금융 서비스를 운영하기 위한 목적보다는, STO 기반 서비스가 어떤 흐름으로 동작하는지 학습하고 시뮬레이션하는 데 초점을 둔 프로젝트입니다.
주요 기획 의도는 다음과 같습니다.
- 실물 자산 기반 토큰 투자 구조 학습
- 모집형 투자와 거래소 기반 거래의 차이 체험
- 주문, 체결, 포트폴리오, 원장 기록 흐름 이해
- Spring Boot, Vue, Kafka, Redis, Batch, AI, AWS 기반 실전형 웹 서비스 구축
- 이메일 기반 회원가입
- 이메일 인증 링크 발송 및 검증
- 로그인 및 로그아웃
- Access Token 및 Refresh Token 기반 인증
- Refresh Token HttpOnly Cookie 저장
- Redis 기반 Refresh Token 관리 및 Access Token Blacklist 처리
- Google, Kakao, Naver OAuth 로그인
- 비밀번호 재설정
- STO 상품 등록
- S3 Presigned URL 기반 상품 이미지 업로드
- 전체 상품 목록 조회
- 상품 상세 조회
- 내가 등록한 상품 조회
- 카테고리별 상품 조회
- 모집 상태 기반 상품 조회
- Toss Payments Sandbox 기반 예치금 충전 요청
- 결제 승인 확인
- 지갑 잔액 조회
- 예치금 변동 내역 조회
- 충전 내역 조회
- 모집 중인 상품 목록 조회
- 모집 상품 상세 조회
- 상품 투자
- 투자 성공 시 보유 자산 반영
- 모집률 100% 달성 시 거래 가능 상품으로 전환
- 마감된 미달성 상품 자동 종료
- 모집 실패 상품 투자금 자동 환불
- 거래 가능 상품 목록 조회
- 매수 주문 생성
- 매도 주문 생성
- 주문 취소
- 내 주문 내역 조회
- 최근 체결 조회
- 호가창 조회
- 내 체결 내역 조회
- Kafka 기반 Matching Engine 연동
- 체결 이벤트 기반 지갑, 보유 자산, 주문, 체결 데이터 정산
- Redis 기반 현재가 및 최근 체결 캐시 저장
- 보유 자산 목록 조회
- 총 자산 요약 조회
- 보유 토큰 수량 조회
- 현재가 기반 평가액 계산
- 예상 연 배당금 계산
- 게시글 작성
- 게시글 목록 조회
- 게시글 상세 조회
- 게시글 수정
- 게시글 삭제
- 댓글 작성
- 댓글 목록 조회
- 댓글 삭제
- Spring AI 기반 서비스 안내 챗봇
- STO 개념 설명
- Partion 서비스 사용 방법 안내
- 투자와 거래 흐름 설명
- 내부 가이드 문서를 활용한 간단한 RAG 방식 적용
- 투자 및 거래 이벤트 원장 기록
- 블록 목록 조회
- 블록 상세 조회
- 이벤트 목록 조회
- 거래 이벤트 기반 해시 생성
- 이전 블록 해시를 활용한 체인 구조 검증
flowchart LR
User["사용자"] --> CF["CloudFront"]
CF --> FE["S3 정적 웹 호스팅\nVue Frontend"]
FE --> ALB["Application Load Balancer"]
ALB --> BE["ECS Spring Boot Backend"]
BE --> RDS["RDS MySQL"]
BE --> Redis["ElastiCache Redis"]
BE --> S3["S3 Assets Bucket"]
BE --> MSK["Amazon MSK Kafka"]
BE --> Toss["Toss Payments Sandbox"]
BE --> AI["GMS / OpenAI API"]
MSK --> ME["ECS C++ Matching Engine"]
ME --> MSK
BE --> BC["ECS Blockchain Server"]
BC --> RDS
Vue 기반의 사용자 화면입니다.
사용자는 프론트엔드를 통해 상품 조회, 투자, 거래, 포트폴리오 확인, 게시판 이용, AI 챗봇 사용 등을 수행합니다.
주요 역할은 다음과 같습니다.
- 사용자 화면 제공
- API 요청 처리
- Access Token 저장 및 인증 요청 처리
- Refresh Token Cookie 기반 재발급 요청
- S3 Presigned URL을 활용한 이미지 업로드
- 거래소 화면 및 포트폴리오 화면 제공
Spring Boot 기반의 메인 서버입니다.
서비스의 핵심 비즈니스 로직을 담당합니다.
주요 역할은 다음과 같습니다.
- 회원 및 인증 처리
- 상품 등록 및 조회
- 지갑 및 결제 처리
- 투자 처리
- 주문 생성 및 취소 요청 처리
- Kafka 메시지 발행 및 소비
- 체결 이벤트 정산
- 포트폴리오 계산
- 게시판 및 댓글 처리
- AI 챗봇 응답 처리
- 원장 서버 연동
- Batch 작업 수행
C++ 기반의 주문 매칭 서버입니다.
Spring Boot 서버에서 Kafka로 발행한 주문 메시지를 소비하고, 매수 주문과 매도 주문을 매칭합니다.
주요 역할은 다음과 같습니다.
- 신규 주문 수신
- 주문 취소 수신
- 상품별 매수/매도 호가 관리
- 가격 및 시간 우선순위 기반 주문 매칭
- 체결 이벤트 생성
- Kafka로 체결 이벤트 발행
원장 기록을 담당하는 서버입니다.
실제 퍼블릭 블록체인 네트워크를 사용하는 구조는 아니며, 거래 이벤트를 해시 기반 블록 구조로 저장하는 원장 시뮬레이션 역할을 합니다.
주요 역할은 다음과 같습니다.
- 원장 이벤트 저장
- 블록 생성
- 이전 블록 해시 연결
- 이벤트 해시 생성
- 블록 및 이벤트 조회
- 원장 데이터 검증
| Repository | Description |
|---|---|
PARTION-FrontEnd |
Vue 기반 프론트엔드 애플리케이션 |
PARTION-BackEnd |
Spring Boot 기반 메인 백엔드 서버 |
PARTION-MatchingEngine |
C++ 기반 주문 매칭 엔진 |
PARTION-Blockchain |
Spring Boot 기반 원장 및 블록체인 시뮬레이션 서버 |
.github |
GitHub Organization 프로필 README 관리 |
- Vue
- Vite
- Pinia
- Vue Router
- Axios
- JavaScript
- Java 21
- Spring Boot
- Spring Security
- Spring MyBatis
- Spring Batch
- Spring AI
- MySQL
- Redis
- Kafka
- JWT
- Toss Payments Sandbox
- AWS S3
- C++
- librdkafka
- nlohmann/json
- Docker
- Java
- Spring Boot
- MySQL
- Hash 기반 원장 구조
- AWS S3
- CloudFront
- Application Load Balancer
- ECS
- ECR
- RDS MySQL
- ElastiCache Redis
- Amazon MSK
- Secrets Manager
sequenceDiagram
participant User as 사용자
participant FE as Frontend
participant BE as Backend
participant DB as MySQL
User->>FE: 모집 상품 조회
FE->>BE: GET /api/investments/products
BE->>DB: FUNDING 상품 조회
DB-->>BE: 모집 상품 목록
BE-->>FE: 상품 목록 응답
User->>FE: 상품 투자 요청
FE->>BE: POST /api/investments
BE->>DB: 지갑 잔액 확인
BE->>DB: 상품 모집 상태 확인
BE->>DB: 투자 내역 저장
BE->>DB: 지갑 차감
BE->>DB: 보유 자산 반영
BE->>DB: 상품 모집 금액 증가
alt 모집률 100% 달성
BE->>DB: 상품 상태 TRADING 변경
end
BE-->>FE: 투자 성공 응답
sequenceDiagram
participant User as 사용자
participant FE as Frontend
participant BE as Backend
participant Kafka as MSK Kafka
participant ME as Matching Engine
participant DB as MySQL
participant Redis as Redis
User->>FE: 매수/매도 주문 요청
FE->>BE: POST /api/orders
BE->>DB: 주문 저장
BE->>Kafka: NEW_ORDER 메시지 발행
Kafka->>ME: 주문 메시지 전달
ME->>ME: 주문 매칭 수행
alt 체결 발생
ME->>Kafka: 체결 이벤트 발행
Kafka->>BE: 체결 이벤트 전달
BE->>DB: 체결 저장
BE->>DB: 주문 상태 갱신
BE->>DB: 지갑 정산
BE->>DB: 보유 자산 정산
BE->>Redis: 현재가 및 최근 체결 캐시 저장
end
sequenceDiagram
participant User as 사용자
participant FE as Frontend
participant BE as Backend
participant Kafka as MSK Kafka
participant ME as Matching Engine
participant DB as MySQL
User->>FE: 주문 취소 요청
FE->>BE: DELETE /api/orders/{orderId}
BE->>DB: 주문 상태 확인
BE->>DB: 주문 취소 처리
BE->>DB: 묶인 예치금 또는 토큰 해제
BE->>Kafka: CANCEL_ORDER 메시지 발행
Kafka->>ME: 주문 취소 메시지 전달
ME->>ME: 호가창 내 주문 제거
BE-->>FE: 주문 취소 성공 응답
sequenceDiagram
participant BE as Backend
participant BC as Blockchain Server
participant DB as MySQL
BE->>BC: 투자/거래 이벤트 전달
BC->>BC: 이벤트 해시 생성
BC->>BC: 이전 블록 해시 조회
BC->>BC: 신규 블록 생성
BC->>DB: 블록 및 이벤트 저장
BC-->>BE: 원장 기록 완료 응답
sequenceDiagram
participant User as 사용자
participant FE as Frontend
participant BE as Backend
participant Doc as Guide Document
participant AI as GMS / OpenAI API
User->>FE: 서비스 관련 질문 입력
FE->>BE: POST /api/ai/chat
BE->>Doc: 관련 문서 섹션 검색
Doc-->>BE: 참고 문맥 반환
BE->>AI: 질문 + 참고 문맥 전달
AI-->>BE: 답변 생성
BE-->>FE: 챗봇 답변 응답
MySQL은 서비스의 영속 데이터 저장소로 사용됩니다.
주요 저장 대상은 다음과 같습니다.
- 회원 정보
- 지갑 정보
- 예치금 변동 내역
- 충전 내역
- 상품 정보
- 투자 내역
- 보유 자산
- 주문
- 체결
- 게시글
- 댓글
- 원장 블록
- 원장 이벤트
Redis는 빠르게 조회하거나 만료 시간이 필요한 데이터를 저장하는 데 사용됩니다.
주요 저장 대상은 다음과 같습니다.
- Refresh Token
- Access Token Blacklist
- 현재가 캐시
- 최근 체결 캐시
Kafka는 백엔드 서버와 매칭 엔진 사이의 비동기 메시지 전달에 사용됩니다.
주요 메시지는 다음과 같습니다.
- 신규 주문 메시지
- 주문 취소 메시지
- 체결 이벤트 메시지
Spring Batch를 활용하여 주기적으로 처리해야 하는 작업을 수행합니다.
현재 적용된 주요 배치 작업은 다음과 같습니다.
- 마감일이 지난 모집 실패 상품 상태를
CLOSED로 변경 - 모집 실패 상품에 투자한 사용자에게 투자금 환불
- 환불 내역을 지갑 변동 내역에 기록
- 투자 상태를 환불 완료 상태로 변경
Partion은 STO 기반 투자와 거래 흐름을 체험할 수 있는 시뮬레이션 웹 서비스입니다.
단순한 CRUD 프로젝트가 아니라, 다음과 같은 구조를 함께 다루는 통합형 프로젝트입니다.
- Vue 기반 사용자 화면
- Spring Boot 기반 메인 비즈니스 서버
- C++ 기반 주문 매칭 엔진
- Kafka 기반 비동기 메시징
- Redis 기반 토큰 및 시세 캐시
- MySQL 기반 영속 데이터 저장
- Spring Batch 기반 자동 상태 처리
- Spring AI 기반 서비스 안내 챗봇
- 해시 기반 원장 시뮬레이션
- AWS 기반 배포 환경
Partion은 사용자가 STO 상품의 모집, 투자, 거래, 체결, 포트폴리오, 원장 기록 흐름을 하나의 서비스 안에서 경험할 수 있도록 설계되었습니다.