spring: application: name: goldenchart-backend servlet: multipart: max-file-size: 6MB max-request-size: 30MB profiles: active: ${SPRING_PROFILES_ACTIVE:local} datasource: url: ${DB_URL:jdbc:mysql://localhost:3306/stockAnalyzer?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8&allowPublicKeyRetrieval=true} username: ${DB_USERNAME:stock} password: ${DB_PASSWORD:analyzer} driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 jpa: hibernate: ddl-auto: validate show-sql: false properties: hibernate: dialect: org.hibernate.dialect.MySQLDialect format_sql: true default_batch_fetch_size: 100 open-in-view: false flyway: enabled: true locations: classpath:db/migration baseline-on-migrate: true baseline-version: 0 jackson: serialization: write-dates-as-timestamps: false deserialization: fail-on-unknown-properties: false default-property-inclusion: non_null time-zone: Asia/Seoul server: port: 8080 servlet: context-path: /api compression: enabled: true mime-types: application/json,application/javascript,text/css # Upbit API upbit: api: base-url: https://api.upbit.com candle-limit: 1000 request-delay-ms: 200 # [항목4] warm-up 목표 봉 수 — 지표 계산 미스매치 방지 # 전략에서 사용하는 최대 Period(기간)의 최소 2~3배 이상으로 설정해야 한다. # 예) 신고가(120봉), HMA(200), EMA(200) 사용 시 → 200×3 = 600봉 이상 필요 # EMA(200) 완전 수렴: ~1150봉 필요. 여유분 포함 1500봉으로 설정. # Ta4jStorage.MAX_BAR_COUNT(1800) 이하여야 하며, # 1500봉 = 200봉×8페이지 / 110ms 지연 = 구독당 약 880ms 추가 소요 warmup-count: 1500 websocket: url: wss://api.upbit.com/websocket/v1 # Logging logging: level: com.goldenchart: INFO org.springframework.security: WARN org.hibernate.SQL: WARN pattern: console: "%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" # GoldenChart settings goldenchart: secrets: # 업비트 API 키 DB 암호화 (운영: GC_SECRETS_ENCRYPTION_KEY 환경변수 필수, 32자 이상 권장) encryption-key: ${GC_SECRETS_ENCRYPTION_KEY:} indicator: warmup-bars: 200 # EMA/RMA 수렴을 위한 워밍업 기간 max-bars: 2000 # 최대 로드 캔들 수 trading: pipeline: enabled: true queue-capacity: 65536 worker-threads: 6 order-rate-per-second: 5.0 max-bars-per-series: 500 stale-tick-seconds: 120 gap-backfill-cron: "0 */5 * * * *" gap-backfill-candle-count: 20 trend-search: scheduler: enabled: true tick-ms: 1000 queue-capacity: 16 verification: upload-dir: ${GC_VERIFICATION_UPLOAD_DIR:data/verification-images} max-image-size-mb: 5 max-images-per-issue: 30 mobile-app: release-dir: ${GC_MOBILE_APP_RELEASE_DIR:data/mobile-releases} version: ${GC_MOBILE_APP_VERSION:} # QR·APK 다운로드 절대 URL (로컬 개발 시에도 exdev 서버 APK 사용) public-base-url: ${GC_MOBILE_APP_PUBLIC_BASE_URL:http://exdev.co.kr} desktop-app: release-dir: ${GC_DESKTOP_APP_RELEASE_DIR:data/desktop-releases} version: ${GC_DESKTOP_APP_VERSION:} public-base-url: ${GC_DESKTOP_APP_PUBLIC_BASE_URL:http://exdev.co.kr} cors: allowed-origins: - http://localhost:5173 - http://localhost:5174 - http://localhost:3000 - http://localhost:80 - http://localhost - capacitor://localhost - https://localhost # Firebase FCM (서비스 계정 JSON: classpath:firebase-service-account.json) firebase: enabled: ${FIREBASE_ENABLED:false} service-account-file: ${FIREBASE_SERVICE_ACCOUNT:firebase-service-account.json}