처음에는 자산, 청약, 주문, 체결, 정산처럼 필요한 기능을 나열하면 전체 구조가 자연스럽게 잡힐 것이라고 생각했다. 하지만 실제로 설계를 시작해보니, 기능 목록만으로는 시스템의 경계를 분명하게 설명하기 어려웠다. 오히려 더 중요한 것은 각 도메인이 어떤 상태를 가지고, 어떤 이벤트를 통해 다음 상태로 이동하는지를 먼저 정의하는 일이었다. 금융 시스템은 특히 이 부분이 중요하다. 같은 데이터라도 현재 어떤 상태에 있느냐에 따라 허용되는 행위가 달라지기 때문이다. 아직 심사 중인 자산은 발행될 수 없고, 청약이 열리지 않은 상품에는 신청할 수 없으며, 검증되지 않은 주문은 체결 대상이 될 수 없다. 체결된 거래 역시 바로 끝나는 것이 아니라 정산 상태를 거쳐야 실제 보유수량과 현금 잔액에 반영된다. 결국 ..
분류 전체보기
조각투자증권 시스템을 설계하려고 마음먹었을 때, 가장 먼저 정리해야 했던 것은 화면이나 API 목록이 아니었다. 이 시스템이 어떤 흐름으로 시작되고, 어떤 상태를 거쳐, 최종적으로 무엇을 남기는지를 이해하는 것이 우선이었다. 조각투자 서비스는 단순히 상품을 등록하고 사고파는 플랫폼처럼 보일 수 있지만, 실제로는 자산이 등록되는 순간부터 투자자에게 수익이 분배되기까지 긴 LifeCycle가진다. 그리고 이 LifeCycle를 제대로 이해해야만 이후의 서브시스템 분리, 상태 전이, 원장 구조, 정산 방식까지 자연스럽게 설계할 수 있다. 이번 글에서는 조각투자증권 시스템을 하나의 흐름으로 바라보며, 전체 LifeCycle를 단계별로 정리해보려고 한다. 이 글의 목적은 세부 구현을 설명하는 것이 아니라, 앞으..
최근 금융 시스템과 거래 처리 구조에 대한 관심이 커지면서, 단순한 CRUD 서비스가 아니라 실제 금융 서비스에 가까운 시스템을 직접 설계해보고 싶다는 생각이 들었다. 그 과정에서 눈에 들어온 주제가 바로 조각투자증권 시스템이었다. 조각투자는 하나의 자산을 여러 투자자가 나누어 보유할 수 있도록 만든 구조라는 점에서 흥미롭지만, 시스템 관점에서 보면 더 매력적인 요소가 많다. 단순히 상품을 등록하고 매수·매도하는 수준이 아니라, 자산 등록과 심사, 증권 발행, 청약, 주문, 체결, 정산, 보유 원장 관리, 수익 분배, 공시, 감사 추적까지 이어지는 긴 흐름을 가진다. 즉, 하나의 서비스 안에 금융 시스템에서 중요하게 다루는 핵심 요소들이 모두 녹아 있다. 나는 이 프로젝트를 통해 “조각투자 앱”을 ..
1. 목적레포지토리의 개발 활동(PR, Push, Issue 등)을 실시간으로 Discord 채널에 전달해 팀 협업 효율을 높이기 위함이다.이전에는 Slack을 사용했지만, 메세지가 사라지는 문제가 있어서 디스코드로 사용하려고 한다.노션과 피그마도 알림 시스템 자동화를 구축하려 했지만, 유료버젼만 가능했다. 우회하는 방법이 있을지 모르겠지만, 우리 팀에게 꼭 필요하진 않아서 보류했다. 이후 서버로그 중 위험한 시그널을 디스코드로 전송하도록 추후 구축할 예정이다.스타트업은.. 비용을 아껴야해..스타트업은.. 비용을 아껴야해..2. 구현 방식A. Cloudflare Worker를 Webhook 중계 서버로 사용서버 없이 운영 가능한 Worker 환경을 사용해 GitHub Webhook 이벤트를 수신이벤트 내..
vue(404)... 무슨 에러지?Vue 기반의 자바스크립트 프로젝트를 진행하던 중, 팀원이 프로젝트를 Github에서 clone 받고 .vue 파일을 열자마자이해할 수 없는 에러를 마주했습니다. vue(404): Write global types file failed. Please ensure that "node_modules" exists and "vue" is a direct dependency, or set "vueCompilerOptions.globalTypesPath" in "tsconfig.json" manually. Write global types file failed. Please ensure that "node_modules" exists and "vue" is a direct d..
길었지만, 첫 프로젝트가 끝이 났다. 이것저것 경험해 보겠다고 학교 졸업 후에 정말 많은 일들을 했었던 것 같다. 사소한 아르바이트로 IT 회사에서 마케팅 일도 해보고, 코인 거래소, 금융권 등 다양한 곳에서 일하다 보니 결국 학교에서 들었던 C 프로그래밍의 짜릿함? 내가 만든 무언가가 잘 작동하는 그 느낌이 그리웠나 보다. 결국 개발을 다시 해보겠다고 돌아왔고, 24년 12월 웹 개발을 처음 시작했다. 우선 뭐든 만들어보자는 마인드로 인프런에서 팀원들을 찾았다. 그냥 맨땅에 헤딩해보겠다는 생각으로 무작정 백엔드로 시작했는데, 처음에는 정말 너무 힘들었던 것 같다. 무슨 소리인지도 모르겠고, 그냥 하루 종일 지피티랑 구글이랑 지냈다. 처음 맡았던 기능이 로그인, 인증/인가였으니... 지금 생각해 보면..
메인 페이지가 늦게 뜨는 문제 해결기 메인 페이지 진입 시 25초 이상 걸리는 이상 현상을 해결했던 과정을 공유합니다.SVG, 압축, lazy loading 등 단순한 이슈였지만, 초기 렌더링 시간보다 94% 단축하여 체감 성능을 10배이상 개선했습니다. 현상 요약메인 페이지 첫 진입 시 25초 이상 지연서버는 빠르게 응답했지만, 브라우저 렌더링이 한참 뒤에 완료됨DevTools -> Network 탭에서 보면, 몇몇 리소스가 수십 MB 수준의 SVG이미지 수십 개가 동시에 요청되며 렌더링 병목 발생함SVG 파일 용량이 비정상적으로 큼.svg 하나당 12~16MB벡터 그래픽이라 용량이 낮을 것으로 생각했는데, 내부에 base64 인코딩 이미지가 포함되어 있었음.실제로는 텍스트가 아닌 이미지 덩어리라 용량..
/** * 게시글의 모든 댓글(대댓글 포함) 조회 * - 최상위 댓글만 조회 → 각 댓글의 자식 목록(childComments)을 재귀적으로 DTO 변환 */ public List getAllCommentsByPostId(Long postId) { // 1) 최상위 댓글들 (parentComment = null) List topComments = commentRepository.findByPost_PostIdAndParentCommentIsNull(postId); // 2) 재귀적으로 childComments까지 DTO로 변환 List result = new ArrayList(); for (Comment commen..
>- 문제 상황 • EC2 서버에 배포 후 http://{ip}:8080/ 에 접속했을 때 403 Forbidden 에러 발생 • EC2 인바운드 규칙 등 네트워크 설정은 정상이나, 스프링 시큐리티 때문에 권한 문제가 의심됨 - 원인 • 프로젝트 내에 SecurityFilterChain이 여러 개 존재 • Spring Security는 여러 개의 SecurityFilterChain 중 가장 먼저 매칭되는 체인의 설정을 우선 적용 • 특정 경로만 인증을 요구하게 하고 싶었으나, 두 번째 체인에서도 / 경로를 인증 필요로 설정해버려서 충돌 발생 • @Order 애노테이션을 지정하지 않으면, 빈(Bean)의 생성 순서로 필터 체인 우선순위가 결정되어 예측 불가한 문제 야기 - 해결 방법 1) 필터 체인별로 @..
1. [error] ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain 이 과정에서 CI/CD 파이프라인이 실패했다. secrets 환경변수 값에는 문제가 없었다.aws ec2는 위에서 확인할 수 있듯 ubuntu 환경이고, ~/.ssh/authorized_key 에 명시된 key는 SHA-1 로 서명된 ssh-rsa 키였다.따라서 리눅스 SSH 설정 파일인 /etc/ssh/sshd_config 파일을 열어서 ssh-rsa를 지원할 수 있도록 추가적으로 입력했다. 1) ec2에 접속(SSH 사용)2) sshd_config 파일을 수정한다.$ cd ..
