FINTECH EDU

교실 속
작은 경제

LuFin

LuFin Dashboard
신용도 기반 금융 시뮬레이션 플랫폼 🏆SSAFY 우수상 수상
2025.02.24 ~ 04.11 (7주)
6명 (프론트엔드 3, 백엔드 3)
백엔드, UI/UX디자인, 인프라
Java, React, MySQL, TypeScript, Spring Boot, JPA

경험으로 배우는 금융

초등학교 교실 속에서 어려운 금융 지식을 게임처럼 경험하며,
자산 관리 능력을 키우는 교육 플랫폼입니다.

경제활동을 통해 소득을 얻고 다양한 투자(주식)와 소비를 경험하며, 신용 등급 관리와 대출 등 현실적인 금융 시스템을 통해 올바른 경제 관념을 형성하도록 돕습니다.

01. MISSION & VISION

금융은 주입식 교육이 아니라,
스스로 깨우치는 경험이어야 합니다

LuFin Credit System
Problem

체감하기 힘든 추상적인 경제 개념

금융문맹 증가 이론 위주 교육
Solution

게임을 통한 실생활 기반
금융 시뮬레이션

신용 등급제 경제 생태계
02. SITE STRUCTURE

서비스 구성도 및
담당 개발 파트

LuFin
로그인
메인화면
클래스
클래스 생성
클래스 참여
클래스 수정
클래스 삭제
대시보드
[학생]대시보드
[교사]대시보드
미션
[교사]미션 생성/수정/삭제
[교사]미션 승인
[학생]미션 참여
투자
주식 매수/매도
주가 변동 상세
포트폴리오 조회
투자뉴스 조회
대출
대출상품 조회
[학생]대출 신청
[교사]대출 승인
대출진행
회생 신청
상점
[교사]아이템 생성/삭제
[교사]사용 승인
[학생]인벤토리
[학생]아이템 구매/사용
03. CORE FUNCTION

게임처럼 보이지만,
금융의 본질을 담아냈습니다

Loan

신용 등급별 대출 시스템

신용 점수에 따라 이자율과 한도가 변동되는 현실적인 대출 로직 및 신용 회복 시스템 구현

Store

아이템 상점

선착순 구매부터 사용, 환불까지 이어지는 아이템 생명주기 로직 구축

Stock

모의 주식 투자

주식 관련 뉴스를 확인하고 가격 변동을 예측하여 투자하는 경험을 설계

04. KEY CONTRIBUTIONS

기여의 핵심,
주요 기술적 기여

01

JPA 비관적 락(Pessimistic Lock) 적용 동시성 제어

선착순 아이템 구매 시 발생할 수 있는 Race Condition을 해결하기 위해 비관적 락을 적용하여, 트랜잭션 충돌 없이 재고 데이터의 정합성을 보장했습니다.

JPA Locking Transaction ACID
02

Spring AOP 기반 교사 및 학생 전용 기능 권한 제어

커스텀 어노테이션(@TeacherOnly)과 Aspect를 활용하여 컨트롤러마다 반복되는 권한 검증 로직을 깔끔하게 분리하고 모듈화했습니다.

Aspect Oriented Programming Custom Annotation
03

GitLab + Jenkins 기반 CI/CD 자동화 환경 구축

코드 푸시부터 빌드, 테스트, Docker 배포까지 이어지는 무중단 자동화 파이프라인을 구축하여 개발 생산성을 극대화했습니다.

DevOps Jenkins DockerHub
04

문서화 및 협업 프로세스 표준화

요구사항 명세서, API 문서, 에러 코드 정의 등 개발 전 과정의 산출물을 표준화하여 기획-개발 간 커뮤니케이션 비용을 최소화했습니다.

Documentation Collaboration
04. TRANSACTION

데이터는 정직해야 하니까,
정합성을 설계했습니다

ItemRepository.java
@Lock(LockModeType.PESSIMISTIC_WRITE)
@QueryHints({
    @QueryHint(name = "jakarta.persistence.lock.timeout", value = "1000")
})
@Query("SELECT i FROM Item i WHERE i.id = :itemId")
Optional<Item> findByIdWithPessimisticLock(@Param("itemId") Integer itemId);
💵
100명이 동시에 구매한다면?

금융 시뮬레이션의 핵심인 '신뢰'를 지키기 위해, 수많은 트래픽이 몰리는 순간에도 데이터 오차 0%를 보장하는 것을 최우선 설계 원칙으로 삼았습니다.

🛡️
왜 비관적 락(Pessimistic)인가?

충돌이 잦은 선착순 이벤트에서 낙관적 락은 불필요한 재시도(Retry)를 반복하며 자원을 낭비합니다. DB에서 즉시 순서를 보장하는 비관적 락으로 시스템 부하를 줄였습니다.

⏱️
Timeout으로 데드락 방지

강력한 락은 시스템 마비(Deadlock)를 유발할 수 있어 1초의 타임아웃을 설정하여, 정합성과 가용성을 모두 챙겼습니다.

05. INFRA & AOP

자동화로 효율을 높이고,
설계로 품질을 완성하다

- CI/CD & Infrastructure

반복되는 수동 배포 대신 자동화 시스템을 구축했습니다. 코드를 올릴 때마다 테스트가 자동으로 진행되어, 실수 걱정 없이 오직 개발에만 몰입할 수 있습니다.

📩
Merge Request
코드 리뷰 및 병합
🤖
Auto Verify
Jenkins 빌드 & 테스트
📦
Docker Build
이미지 패키징
🚀
Safe Deploy
무중단 실배포

- AOP (aspect oriented programming)

컨트롤러마다 반복되는 권한 검증 코드를 커스텀 어노테이션으로 대체했습니다. 핵심 비즈니스 로직과 부가적인 보안 로직을 분리하여 코드의 가독성을 높이고 휴먼 에러를 방지했습니다.

RoleCheckAspect.java
@Aspect @Component
public class RoleCheckAspect {
    @Before("@annotation(TeacherOnly)")
    public void checkTeacherRole() {
        Member member = getCurrentUser();
        if (member.getMemberRole() != MemberRole.TEACHER) {
            throw new BusinessException(ErrorCode.REQUEST_DENIED);
        }
    }
}
  • 핵심 로직에만 집중 코드에 반복되던 보안 로직을 분리해, 기능 구현 자체에만 더 신경 쓸 수 있습니다.
  • 빈틈 없는 보안 관리 권한 체크 방식을 하나로 통일해서, 실수로 보안이 누락되는 일을 확실히 막았습니다.
  • 편리한 유지보수 정책이 바뀌어도 여기저기 수정할 필요 없이, 파일 하나로 모든 규칙을 관리합니다.
06. COLLABORATION

복잡한 도메인은 단순하게,
협업의 기준은 명확하게

Event Storming

초반부터 이벤트 스토밍을 통해 도메인 흐름을 명확히 정의하고, 복잡한 금융 로직을 도메인별로 분리하여 설계의 기반을 다졌습니다.

Event Storming Detail 1 Event Storming Detail 2 Event Storming Overview
협업의 기준을 세우는 문서화

요구사항 명세서, API 문서, 에러 코드 정의, ERD 등 개발 전 과정의 산출물을 표준화하여 커뮤니케이션 비용을 최소화하고, 기획과 개발 간의 간극을 줄였습니다.

SSAFY 우수상 🏆

교실 속 작은 경제,
LuFin