개발 공부/프로젝트

[사이드 프로젝트] '가상 주식 거래소' 만들기 (1) - 프로젝트 선정 이유와 환경 설정

baby-t 2025. 11. 20. 10:49

1. 프로젝트 시작 계기: 왜 '주식 거래소'인가?

현재 프로젝트는 백엔드 시스템 아키텍처를 깊이 있게 이해하기 위해 시작한 프로젝트입니다. 초기에는 Unity를 활용한 게임 프로젝트를 고려했으나, 게임 클라이언트(C#) 중심의 로직 구현이나 물리 엔진 동기화(실시간 상태 동기화) 등은 제가 목표로 하는 백엔드 직무의 핵심 역량과는 거리가 있다고 판단했습니다.

저는 백엔드 개발자로서 '데이터 무결성', '동시성 제어', '대용량 트래픽 처리' 역량을 보여주고 싶었고, 이를 위해 게임보다는 금융 도메인이 훨씬 적합하다고 결론 내렸습니다.

따라서 이번 프로젝트의 목표는 **"실시간 시세 연동 및 자체 체결 엔진을 탑재한 가상 주식 거래소"**를 구축하는 것입니다. 단순한 CRUD 게시판 구현을 넘어, 실제 자산이 오가는 트랜잭션을 얼마나 안정적으로 처리하는지에 집중해 볼 계획입니다. 이 프로젝트는 제미나이를 통해 진행합니다.

2-1. 기술 스택 (Tech Stack)

  • Language: Java 17
  • Framework: Spring Boot 3.5.7
  • Database: MySQL 8.0 (Docker Container)
  • IDE: IntelliJ IDEA Ultimate (학생 라이선스 활용)
  • Build Tool: Gradle

[선택 이유]

  • Docker: 로컬 컴퓨터에 DB를 직접 설치하면 개발 환경이 지저분해지고 버전 관리가 까다로울 수 있습니다. 추후 CI/CD 구축까지 고려하여, 처음부터 Docker 컨테이너로 DB를 관리하기로 결정했습니다.
  • IntelliJ Ultimate: Spring Boot 전용 기능과 Database 툴이 내장되어 있어 개발 생산성을 높이기 위해 선택했습니다. (대학생이라면 1년 무료 라이선스를 받을 수 있어 활용했습니다.)

2-2. 시스템 아키텍처 (System Architecture)

이번 프로젝트는 확장성과 유지보수성을 고려하여 Spring Boot의 표준인 **계층형 아키텍처(Layered Architecture)**를 채택했습니다.

  • Controller: 외부 요청을 받아 검증하고 Service에 전달
  • Service: 핵심 비즈니스 로직 수행 (트랜잭션 관리)
  • Repository: DB에 접근하여 데이터 처리

초기 단계이므로 모놀리식을 선택했습니다. 혼자 진행하는 프로젝트에서 처음부터 MSA를 도입하는 것은 **오버 엔지니어링(과도한 설계)**이기 때문입니다. 대신, 코드는 도메인별로 깔끔하게 분리(Layered Architecture)하여, 나중에 트래픽이 늘어나면 언제든 MSA로 쪼갤 수 있도록 설계했습니다. .

💡 기술 용어: 모놀리식(Monolithic) vs MSA

프로젝트 설계를 시작하며 가장 먼저 고민한 것은 **"서버를 어떻게 구성할 것인가?"**였습니다.

  • 모놀리식 아키텍처 (Monolithic Architecture):
    • 개념: 모든 기능(회원, 주문, 결제 등)을 하나의 프로젝트, 하나의 서버 안에 때려 넣는 방식입니다.
    • 장점: 개발 초기 설정이 쉽고, 배포가 간편하며, 기능 간 호출이 빠릅니다.
    • 단점: 덩치가 커지면 빌드 시간이 오래 걸리고, '주문' 기능 하나만 고장 나도 서버 전체가 죽을 수 있습니다.
  • MSA (Microservices Architecture):
    • 개념: 기능을 아주 작게 쪼개서 **여러 개의 서버(회원 서버, 주문 서버)**로 나누는 방식입니다.
    • 장점: '주문' 서버가 죽어도 '회원' 서버는 살아있습니다. 확장이 유연합니다.
    • 단점: 관리가 엄청나게 복잡하고(DevOps 필수), 서버 간 통신이 어렵습니다.

3. 개발 환경 설정 (Configuration) - application.properties vs application.yml

Spring Initializr로 프로젝트를 생성하면 기본적으로 .properties 파일이 생성됩니다. 하지만 설정 내용이 늘어날수록 가독성이 떨어지는 단점이 있어, 계층 구조로 한눈에 파악하기 쉬운 YAML(.yml) 형식으로 변경하여 설정을 진행했습니다.

# src/main/resources/application.yml

spring:
  application:
    name: virtual-exchange
  
  datasource:
    # Docker로 실행한 MySQL에 접속
    url: jdbc:mysql://localhost:3306/stock_db?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: (비밀번호) 

  jpa:
    hibernate:
      ddl-auto: update # 개발 초기 단계이므로 update 사용
    show-sql: true     # 쿼리 로그 확인

 

4. DB 연결 성공 및 마무리

모든 설정을 마치고 Spring Boot 애플리케이션을 실행했습니다.

INFO ... com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
INFO ... : Started StockApplication in 1.829 seconds

 

 

콘솔에 정상 실행 로그가 출력되며 Docker 내의 MySQL과 Spring Boot가 성공적으로 연결되었습니다. 다음 포스팅에서는 실제 주식 거래소의 핵심인 **User(회원)**와 Account(계좌) 도메인을 설계하고 테이블을 생성해 보겠습니다.