개인 프로젝트

웹 서비스와 앱, 배치 시스템의 주요 기능과 설계·구현 내용을 정리했다.

01 웹 서비스

Portket

여러 포트폴리오의 자산을 원화로 모아 보는 서비스

포트폴리오별 보유 자산과 거래 내역을 관리한다. 서로 다른 통화의 자산에 환율을 적용해 전체 평가액과 비중을 확인할 수 있다.

Spring Boot · Spring Batch · PostgreSQL · JPA · jOOQ

Portket 서비스
설계·구현가격·환율 누락 시 전체 평가액을 미완료로 처리

불완전한 평가액의 처리

보유한 종목의 가격이나 환율이 없으면, 일부 자산만 계산한 값을 전체 합계처럼 보여주지 않도록 했다. 평가 완료 여부를 따로 반환하고 총액과 비중은 계산 미완료 상태로 구분한다.

주식 가격 수집을 일별 배치로 전환

미국 종목을 추가하면서 한 번의 가격 수집에 걸리는 시간이 기존 30분 주기를 넘겼다. 실시간 시세를 제공하지 않는 서비스에 맞춰 한국·미국 시장의 종가를 각각 일별 배치로 반영하도록 바꿨다.

자산 평가 규칙을 단순화한 설명

02 백엔드 시스템

Titan

작업의 선행 조건과 실행 시간을 관리하는 배치 스케줄러

실행 조건과 워커의 상태를 확인해 작업을 배정한다. 웹 콘솔에서 작업 흐름과 실행 이력을 조회하고, 중단하거나 다시 실행할 수 있다.

Java 21 · gRPC · PostgreSQL · React

Titan 웹 콘솔 로그인 필요
설계·구현실행 상태와 작업 배정 메시지를 함께 저장

상태 변경과 배정 기록을 함께 저장

오케스트레이터는 실행 상태와 전달할 배정 메시지를 같은 데이터베이스 트랜잭션에 기록한다. 메시지 전달은 브로커가 맡고, 워커는 실행 결과를 로컬 디스크에 남긴 뒤 서버에 직접 제출한다.

장애 복구의 조건과 한계

브로커의 메시지는 메모리에 보관한다. 장애가 나면 데이터베이스와 워커에 남은 기록을 대조해 작업을 재배정하거나, 실행 중인 프로세스에 다시 연결한다. 복구할 수 없는 작업은 격리한다. 기록 보관 정책과 실행권의 유효성에 따라 복구 범위가 달라진다.

주요 구성 요소의 역할과 결과 전달 경로

03 모바일 앱

bbbkm

읽은 시간과 페이지, 책갈피와 감상을 기록하는 앱

타이머를 켜거나 읽은 구간을 직접 입력해 독서 기록을 남긴다. 책별로 기록을 모아 보고, 현재 책갈피를 확인할 수 있다.

Flutter · Dart · Riverpod · SQLite

bbbkm 소개·사용 안내 iOS 출시 준비 중
설계·구현과거 기록이 새 책갈피를 덮어쓰지 않도록 처리

과거 기록과 현재 책갈피 구분

예전 독서 기록을 수정했다고 현재의 책갈피까지 바뀌면 읽던 위치를 잃을 수 있다. 책갈피가 어떤 기록에서 만들어졌는지 관리해, 과거 기록의 수정이 새로운 책갈피를 덮어쓰지 않도록 했다.

백업 파일은 검증한 뒤 한 번에 복원

독서 기록은 기기에 저장하고 JSON 파일로 내보내거나 가져올 수 있다. 가져올 파일을 먼저 검증하고 단일 트랜잭션으로 복원한다. 기존 기록은 유지하고 없는 기록만 추가한다. 중간에 실패하면 가져오기 전체를 되돌린다.

bbbkm 홈 화면. 읽는 책, 책갈피, 다음 독서 메모를 보여준다.
실제 앱 화면 · 예시 독서 기록 · 화면 크게 보기

04 데스크톱 앱

zzikk

바탕화면과 열린 창 위를 돌아다니는 데스크톱 펫

작은 생쥐를 쓰다듬고 먹이를 주며 돌보는 앱이다. 돌봄 진행 상황과 꾸미기 아이템을 저장하고, 다음 실행에서 이어간다.

Python · PySide6 · Windows · macOS

zzikk 소개·다운로드 Windows 배포 후보
설계·구현운영체제별로 창 탐색·포커스 처리를 분리

운영체제별 창 처리

캐릭터가 열린 창 위에 머물도록 창의 위치를 읽는다. 창 탐색과 포커스 처리는 Windows와 macOS에 맞춰 나누고, 장갑과 말풍선은 클릭을 가로채지 않는 별도 창으로 표시한다.

손상된 저장 파일에 대응

저장할 때는 임시 파일을 기록한 뒤 기존 파일과 교체하고, 이전 정상 기록을 백업한다. 손상된 파일은 별도로 보관하며, 복원할 정상 백업이 없으면 사용자가 다음 조치를 선택하도록 했다.

실제 앱 애니메이션의 한 프레임