Skip to content

Latest commit

 

History

History
889 lines (795 loc) · 34.1 KB

README.md

File metadata and controls

889 lines (795 loc) · 34.1 KB

OMG (Over the Money and Gold)

OMG-INTRO-GIF

Samsung Software Academy For Youth 11th - 특화 프로젝트

2024.08.19 ~ 2024.10.16


서비스 소개 영상 :

OMG_UCC.mp4

  1. 웹 서비스 소개
  2. 기술 스택
  3. 주요 기능
  4. 시스템 아키텍쳐
  5. 프로젝트 파일구조
  6. 서비스 화면
  7. 개발 팀 소개
  8. 산출물

✨ 웹 서비스 소개


✨ OMG: 크리스마스 마을에서 열리는 투자 전략 게임

경제와 금융 개념을 배우고 싶지만 어렵고 지루하게 느껴진 적이 없으신가요?

기존의 금융 교육용 게임들이 딱딱한 UI와 구식 디자인으로 흥미를 끌지 못했던 경험이 있으신가요?

OMG와 함께 재미있고 직관적으로 경제 개념을 학습해보세요!

🌟 OMG만의 특별함

⩥ 현대적이고 친근한 UI: 기존 금융 게임과 달리 세련되고 매력적인 디자인
⩥ 게임을 통한 학습: 경제 개념을 쉽고 재미있게 체험하며 이해
⩥ 타겟 맞춤형 콘텐츠: 초등학생부터 중학생까지 연령대별 최적화된 학습 경험

💡 이런 분들에게 완벽해요

⩥ 경제 개념을 재미있게 배우고 싶은 학생들
⩥ 자녀에게 금융 교육을 시키고 싶은 부모님
⩥ 게임을 통해 실용적인 지식을 얻고 싶은 모든 분
OMG와 함께라면, 경제 공부가 더 이상 어렵지 않습니다. 지금 바로 게임을 통해 미래의 경제 전문가로 성장해보세요!

🔨 기술 스택


Back-end


Front-end

Infra
Tools

💡 주요 기능


기능 내용
실시간 멀티플레이 경제 게임 웹소켓을 통한 실시간 통신으로 친구들과 함께 즐기는 경제 시뮬레이션 게임입니다. 직관적인 UI로 누구나 쉽게 접근하고 조작할 수 있습니다.
현실 경제 시스템 반영 실제 경제 이벤트와 시장 로직을 게임에 적극 반영하여 현실감 있는 거래와 투자 경험을 제공합니다. 실제 경제 활동을 하는 것과 같은 생동감을 느낄 수 있습니다.
AI 챗봇 경제 튜터 생성형 AI 챗봇 기능을 통해 게임 내 경제 개념이나 전략에 대해 실시간으로 질문하고 답변을 받을 수 있습니다. 어려운 경제 개념도 대화를 통해 쉽게 이해할 수 있습니다.
게이미피케이션 기반 경제 교육 게이미피케이션 원리를 적용하여 경제 학습을 게임 메커니즘과 유기적으로 결합했습니다. 실시간 경쟁 시스템, 개인 미션 달성, 실시간 리더보드 등을 통해 학습 동기를 유발하고, 복잡한 경제 원리를 직관적으로 체득할 수 있는 상호작용적 학습 경험을 제공합니다.
크리스마스 테마의 3D 게임 세계 아름답고 몰입감 있는 크리스마스 마을을 3D로 구현했습니다. 귀여운 캐릭터와 아이템들, 눈 내리는 거리, 반짝이는 장식들이 경제 게임에 따뜻하고 즐거운 분위기를 더합니다. Three.js를 활용한 고품질 3D 그래픽으로 시각적 매력을 극대화했습니다.


📊 시스템 아키텍쳐


System Architecture


📁 프로젝트 파일 구조


Backend

│  .gitignore
│  build.gradle
│  Dockerfile
│  gradlew
│  gradlew.bat
│  settings.gradle
│
├─docker-elk-stack
│  │  .env
│  │  docker-compose.yml
│  │
│  ├─elasticsearch
│  │  │  Dockerfile
│  │  │
│  │  └─config
│  │          elasticsearch.yml
│  │
│  ├─filebeat
│  │  └─config
│  │          filebeat.yml
│  │
│  ├─kibana
│  │  │  Dockerfile
│  │  │
│  │  └─config
│  │          kibana.yml
│  │
│  └─logstash
│      │  Dockerfile
│      │
│      ├─config
│      │      logstash.yml
│      │      pipelines.yml
│      │
│      └─pipeline
│              logstash.conf
│
├─gradle
│  └─wrapper
│          gradle-wrapper.jar
│          gradle-wrapper.properties
│
└─src
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─ssafy
    │  │          └─omg
    │  │              │  OmgBackApplication.java
    │  │              │
    │  │              ├─config
    │  │              │  │  BaseTimeEntity.java
    │  │              │  │  LoggingController.java
    │  │              │  │  MessageController.java
    │  │              │  │  RedisConfig.java
    │  │              │  │  WebConfig.java
    │  │              │  │  WebSocketConfig.java
    │  │              │  │  WebSocketEventListener.java
    │  │              │  │
    │  │              │  └─baseresponse
    │  │              │          BaseException.java
    │  │              │          BaseResponse.java
    │  │              │          BaseResponseStatus.java
    │  │              │          GlobalExceptionHandler.java
    │  │              │          MessageException.java
    │  │              │          MessageResponseStatus.java
    │  │              │
    │  │              ├─domain
    │  │              │  ├─arena
    │  │              │  │  └─entity
    │  │              │  │          Arena.java
    │  │              │  │
    │  │              │  ├─chat
    │  │              │  │  ├─controller
    │  │              │  │  │      ChatbotController.java
    │  │              │  │  │      ChatController.java
    │  │              │  │  │
    │  │              │  │  ├─dto
    │  │              │  │  │      ChatMessage.java
    │  │              │  │  │
    │  │              │  │  ├─handler
    │  │              │  │  │      ChatHandler.java
    │  │              │  │  │
    │  │              │  │  └─service
    │  │              │  │          ChatbotService.java
    │  │              │  │          ChatbotServiceImpl.java
    │  │              │  │
    │  │              │  ├─game
    │  │              │  │  │  GameRepository.java
    │  │              │  │  │
    │  │              │  │  ├─controller
    │  │              │  │  │      CommonMessageController.java
    │  │              │  │  │      GameController.java
    │  │              │  │  │      IndividualMessageController.java
    │  │              │  │  │
    │  │              │  │  ├─dto
    │  │              │  │  │      BattleClickDto.java
    │  │              │  │  │      BattleRequestDto.java
    │  │              │  │  │      BattleResultDto.java
    │  │              │  │  │      ClickStatusDto.java
    │  │              │  │  │      GameEventDto.java
    │  │              │  │  │      GameNotificationDto.java
    │  │              │  │  │      GameResultResponse.java
    │  │              │  │  │      GameStatusDto.java
    │  │              │  │  │      GoldMarketInfoResponse.java
    │  │              │  │  │      IndividualMessageDto.java
    │  │              │  │  │      MainMessageDto.java
    │  │              │  │  │      MoneyCollectionRequest.java
    │  │              │  │  │      MoneyCollectionResponse.java
    │  │              │  │  │      PlayerDistanceDto.java
    │  │              │  │  │      PlayerMinimapDto.java
    │  │              │  │  │      PlayerMoveRequest.java
    │  │              │  │  │      PlayerRankingResponse.java
    │  │              │  │  │      PlayerResponse.java
    │  │              │  │  │      PlayerStateDto.java
    │  │              │  │  │      RoundStartNotificationDto.java
    │  │              │  │  │      StockFluctuationResponse.java
    │  │              │  │  │      StockMarketResponse.java
    │  │              │  │  │      StockRequest.java
    │  │              │  │  │      TimeNotificationDto.java
    │  │              │  │  │      UserActionDTO.java
    │  │              │  │  │
    │  │              │  │  ├─entity
    │  │              │  │  │      Game.java
    │  │              │  │  │      GameEvent.java
    │  │              │  │  │      GameStatus.java
    │  │              │  │  │      LoanProduct.java
    │  │              │  │  │      MoneyPoint.java
    │  │              │  │  │      MoneyState.java
    │  │              │  │  │      RoundStatus.java
    │  │              │  │  │      StockInfo.java
    │  │              │  │  │      StockState.java
    │  │              │  │  │
    │  │              │  │  ├─repository
    │  │              │  │  │      GameEventRepository.java
    │  │              │  │  │
    │  │              │  │  └─service
    │  │              │  │      │  GameBroadcastService.java
    │  │              │  │      │  GameEventListener.java
    │  │              │  │      │  GameScheduler.java
    │  │              │  │      │  GameService.java
    │  │              │  │      │  GameServiceImpl.java
    │  │              │  │      │
    │  │              │  │      └─battle
    │  │              │  │              BattleState.java
    │  │              │  │              GameBattleService.java
    │  │              │  │
    │  │              │  ├─player
    │  │              │  │  ├─dto
    │  │              │  │  │      PlayerAnimation.java
    │  │              │  │  │      PlayerInfo.java
    │  │              │  │  │      PlayerResult.java
    │  │              │  │  │
    │  │              │  │  └─entity
    │  │              │  │          Player.java
    │  │              │  │          PlayerAction.java
    │  │              │  │          PlayerStatus.java
    │  │              │  │
    │  │              │  ├─room
    │  │              │  │  ├─controller
    │  │              │  │  │      RoomController.java
    │  │              │  │  │      RoomMessageController.java
    │  │              │  │  │
    │  │              │  │  ├─dto
    │  │              │  │  │      CommonRoomRequest.java
    │  │              │  │  │      CommonRoomResponse.java
    │  │              │  │  │
    │  │              │  │  ├─entity
    │  │              │  │  │      InRoomPlayer.java
    │  │              │  │  │      Room.java
    │  │              │  │  │
    │  │              │  │  └─service
    │  │              │  │          RoomService.java
    │  │              │  │          RoomServiceImpl.java
    │  │              │  │
    │  │              │  ├─socket
    │  │              │  │  └─dto
    │  │              │  │          StompExceptionPayload.java
    │  │              │  │          StompPayload.java
    │  │              │  │          StompResponsePayload.java
    │  │              │  │
    │  │              │  └─user
    │  │              │      ├─controller
    │  │              │      │      UserController.java
    │  │              │      │
    │  │              │      ├─entity
    │  │              │      │      User.java
    │  │              │      │
    │  │              │      ├─repository
    │  │              │      │      UserRepository.java
    │  │              │      │
    │  │              │      └─service
    │  │              │              UserService.java
    │  │              │              UserServiceImpl.java
    │  │              │
    │  │              └─util
    │  │                      RedisUtil.java
    │  │
    │  └─resources
    │      │  application-prod.yml
    │      │  application.yml
    │      │  banner.txt
    │      │
    │      └─static
    │              index.html
    │              websocket-test.html
    │
    └─test
        └─java
            ├─com
            │  └─ssafy
            │      └─omg
            │          └─domain
            │              └─game
            │                  ├─controller
            │                  │      GameMessageControllerTest.java
            │                  │
            │                  └─service
            │                          GameBroadcastServiceTest.java
            │
            └─omg
                └─ssafy
                        OmgBackApplicationTests.java

Frontend

│  .env.sample
│  .gitignore
│  .prettierignore
│  .prettierrc
│  Dockerfile
│  dump.rdb
│  eslint.config.js
│  index.html
│  nginx.conf
│  package-lock.json
│  package.json
│  postcss.config.js
│  README.md
│  svg.d.ts
│  tailwind.config.js
│  tsconfig.app.json
│  tsconfig.json
│  tsconfig.node.json
│  tsconfig.tsbuildinfo
│  vite.config.d.ts
│  vite.config.js
│  vite.config.ts
│
├─public
│  │  android-chrome-192x192.png
│  │  android-chrome-512x512.png
│  │  apple-touch-icon.png
│  │  favicon-16x16.png
│  │  favicon-32x32.png
│  │  favicon.ico
│  │  site.webmanifest
│  │
│  ├─assets
│  │      alert.jpeg
│  │      candy.png
│  │      chat.png
│  │      cupcake.png
│  │      elf.png
│  │      event-card1.jpg
│  │      event-card2.jpg
│  │      event-card3.jpg
│  │      game-access-level.png
│  │      game-bg.png
│  │      gift.png
│  │      gingerbread.png
│  │      gold.png
│  │      goldbell.png
│  │      hat.png
│  │      loan-card.jpg
│  │      loan-sheet.jpg
│  │      logo.png
│  │      matrix.gif
│  │      matrix2.gif
│  │      mini-map.png
│  │      money.png
│  │      morning-sky.jpg
│  │      myroom.jpg
│  │      night-sky.jpg
│  │      rudolph.png
│  │      santa.png
│  │      shopping-basket.png
│  │      slough.png
│  │      snow.png
│  │      snowman.png
│  │      socks.png
│  │      stock-fluctuation.png
│  │      trade-button.png
│  │      white-chat.png
│  │
│  ├─models
│  │  ├─candy
│  │  │      Atlas_Xmas_Items_01.png
│  │  │      candy.bin
│  │  │      candy.gltf
│  │  │
│  │  ├─cupcake
│  │  │      cupcake.bin
│  │  │      cupcake.gltf
│  │  │      Material_001_Base_Color.png
│  │  │
│  │  ├─elf
│  │  │      elf.bin
│  │  │      elf.gltf
│  │  │      material_0_baseColor.png
│  │  │
│  │  ├─gift
│  │  │      gift.bin
│  │  │      gift.gltf
│  │  │      gift_DefaultMaterial_BaseColor.png
│  │  │      gift_DefaultMaterial_Metallic-gift_DefaultMaterial_Roughness.png
│  │  │      gift_DefaultMaterial_Normal.png
│  │  │
│  │  ├─gingerbread
│  │  │      elf-rudoft-ginger-gift.png
│  │  │      gingerbread.bin
│  │  │      gingerbread.gltf
│  │  │
│  │  ├─gold
│  │  │      gold.bin
│  │  │      gold.gltf
│  │  │
│  │  ├─goldbell
│  │  │      goldbell.bin
│  │  │      goldbell.gltf
│  │  │
│  │  ├─hat
│  │  │      0_ChristmasHat4_white_hat_BaseColor.jpg
│  │  │      hat.bin
│  │  │      hat.gltf
│  │  │
│  │  ├─map
│  │  │  │  license.txt
│  │  │  │  scene.bin
│  │  │  │  scene.gltf
│  │  │  │
│  │  │  └─textures
│  │  │          06_-_Defagggult_baseColor.png
│  │  │          13_-_Defaultdsf_baseColor.png
│  │  │          15_-_Default3_baseColor.png
│  │  │          19_-_Defauladads_baseColor.png
│  │  │          19_-_Default_baseColor.png
│  │  │          20_-_Defaufsddfdflt_baseColor.png
│  │  │          20_-_Defaulth_baseColor.png
│  │  │          20_-_Default_baseColor.png
│  │  │          Material_135_baseColor.png
│  │  │          Material_139_baseColor.png
│  │  │          Material_140_baseColor.png
│  │  │          Material_261_baseColor.png
│  │  │          Material_262_baseColor.png
│  │  │          Material_263_baseColor.png
│  │  │          Material_26_baseColor.png
│  │  │          Material_427_baseColor.png
│  │  │          Material_427_metallicRoughness.png
│  │  │          Material_428_baseColor.png
│  │  │          Material_429_baseColor.png
│  │  │          Material_431_baseColor.png
│  │  │          Material_432_baseColor.png
│  │  │          Material_434_baseColor.png
│  │  │          Material_438_baseColor.png
│  │  │          Material_439_baseColor.png
│  │  │          Material_440_baseColor.png
│  │  │          Material_45_baseColor.png
│  │  │          Material_46_baseColor.png
│  │  │          Material_47_baseColor.png
│  │  │
│  │  ├─pouch
│  │  │      pouch.bin
│  │  │      pouch.gltf
│  │  │
│  │  ├─santa
│  │  │      material_0_baseColor.png
│  │  │      santa.bin
│  │  │      santa.gltf
│  │  │
│  │  ├─silver
│  │  │      silver.bin
│  │  │      silver.gltf
│  │  │
│  │  ├─snowman
│  │  │      snowman.bin
│  │  │      snowman.gltf
│  │  │      Snowman_baseColor.png
│  │  │
│  │  ├─socks
│  │  │      elf-rudoft-ginger-gift.png
│  │  │      socks.bin
│  │  │      socks.gltf
│  │  │
│  │  └─stocktree
│  │          Atlas_Xmas_Items_02.png
│  │          stocktree.bin
│  │          stocktree.gltf
│  │
│  ├─music
│  │      background.mp3
│  │      bell-alert.mp3
│  │      change-price-alert.mp3
│  │      chat-alert.mp3
│  │      click-chat-alert.mp3
│  │      finish-game-alert.mp3
│  │      get-coin-alert.mp3
│  │      get-item-alert.mp3
│  │      gold-alert.mp3
│  │      left-time-alert.mp3
│  │      loan-alert.mp3
│  │      round-end-alert.mp3
│  │      stock-alert.mp3
│  │      typing-sound.mp3
│  │
│  └─system
│          cursor.cur
│
└─src
    │  App.tsx
    │  index.css
    │  main.tsx
    │  vite-env.d.ts
    │
    ├─apis
    │  │  apiConstants.ts
    │  │  axiosInstance.ts
    │  │  errorHandler.ts
    │  │
    │  └─room
    │          roomAPI.ts
    │
    ├─assets
    │  ├─data
    │  │      characterInfo.ts
    │  │      coinLocation.ts
    │  │      goldMarketData.ts
    │  │      introduction.ts
    │  │      loanLimitLogic.ts
    │  │      locationInfo.ts
    │  │      nicknameData.ts
    │  │      stockMarketData.ts
    │  │
    │  └─img
    │          bg-personal1.svg
    │          bg-personal2.svg
    │          mini-elf.svg
    │          mini-gingerbread.svg
    │          mini-santa.svg
    │          mini-snowman.svg
    │          rank1.svg
    │          rank2.svg
    │          rank3.svg
    │
    ├─components
    │  ├─camera
    │  │      IntroCamera.tsx
    │  │
    │  ├─character
    │  │      Character.tsx
    │  │      Item.tsx
    │  │
    │  ├─chat
    │  │      ChatBotInteraction.tsx
    │  │      ChatInputForm.tsx
    │  │      ChatMessage.tsx
    │  │      Chatting.tsx
    │  │
    │  ├─common
    │  │      BackButton.tsx
    │  │      Button.tsx
    │  │      ChatButton.tsx
    │  │      CommonLoader.tsx
    │  │      ExitButton.tsx
    │  │      Gauge.tsx
    │  │      index.ts
    │  │      Notification.tsx
    │  │      Round.tsx
    │  │      Snowing.tsx
    │  │      SpeechBubble.tsx
    │  │      Timer.tsx
    │  │
    │  ├─game
    │  │      CanvasLoader.tsx
    │  │      EventCard.tsx
    │  │      EventEffect.tsx
    │  │      GameLoader.tsx
    │  │      GamePersonalResult.tsx
    │  │      GameResult.tsx
    │  │      GameTotalResult.tsx
    │  │      index.ts
    │  │
    │  ├─gold-market
    │  │      GoldBuy.tsx
    │  │      GoldMarket.tsx
    │  │      GoldModel.tsx
    │  │      LineChart.tsx
    │  │      PossessionChart.tsx
    │  │
    │  ├─loan-market
    │  │      LoanInfo.tsx
    │  │      LoanLogicModal.tsx
    │  │      LoanMarket.tsx
    │  │      LoanReport.tsx
    │  │      LoanSheet.tsx
    │  │
    │  ├─main-map
    │  │      MainMap.tsx
    │  │      Map.tsx
    │  │      MarketStatusBoard.tsx
    │  │      Tutorial.tsx
    │  │
    │  ├─mini-game
    │  │  ├─battle
    │  │  │      Counter.tsx
    │  │  │
    │  │  └─money
    │  │          MoneyCanvas.tsx
    │  │
    │  ├─mini-map
    │  │      MiniMap.tsx
    │  │
    │  ├─my-room
    │  │      MyRoom.tsx
    │  │
    │  ├─notification
    │  │      DefaultAlert.tsx
    │  │      getAlertComponent.tsx
    │  │      index.ts
    │  │      LeftTimeAlert.tsx
    │  │      RoundEndAlert.tsx
    │  │      StockChangeAlert.tsx
    │  │
    │  ├─personal-board
    │  │      PersonalBoard.tsx
    │  │
    │  └─stock-market
    │          index.ts
    │          Item.tsx
    │          LineChart.tsx
    │          MarketState.tsx
    │          PossessionChart.tsx
    │          StockBuy.tsx
    │          StockInfoButton.tsx
    │          StockMain.tsx
    │          StockMarket.tsx
    │          StockSell.tsx
    │          Tree.tsx
    │
    ├─hooks
    │      index.ts
    │      useCharacter.ts
    │      useCountUp.ts
    │      useFloatingObject.ts
    │      useGold.ts
    │      useGoldSwing.ts
    │      useSocket.ts
    │      useStock.ts
    │      useWaitingRoom.ts
    │
    ├─pages
    │      404.tsx
    │      Game.tsx
    │      Lobby.tsx
    │      Login.tsx
    │      Waiting.tsx
    │
    ├─stores
    │      index.ts
    │      useAlertStore.ts
    │      useGameResultStore.ts
    │      useGameStore.ts
    │      useGoldStore.ts
    │      useIntroStore.ts
    │      useLoanStore.ts
    │      useMainBoardStore.ts
    │      useMiniMapStore.ts
    │      useMiniMoneyStore.ts
    │      useModalStore.ts
    │      useMyRoomStore.ts
    │      useOtherUserStore.ts
    │      usePersonalBoardStore.ts
    │      useSocketMessage.ts
    │      useSoundStore.ts
    │      useStockStore.ts
    │      useUser.ts
    │
    ├─types
    │      index.ts
    │
    └─utils
            ConfirmAlert.ts
            formatNumberWithCommas.ts
            formatTime.ts
            index.ts
            SocketContext.tsx
            ToastAlert.ts

💻 서비스 화면


방 생성 및 게임 시작

  • 방장이 방을 생성하고 네 명의 플레이어가 모이면 게임 시작 버튼이 활성화됩니다.

alt text

튜토리얼

  • 기본적인 키 조작 방법 및 게임 룰에 대한 안내를 제공합니다.

alt text

플레이어 간 상호작용

  • 미니맵을 통해 다른 플레이어들의 위치를 확인할 수 있습니다.
  • 실시간 거래상황을 확인할 수 있습니다.
  • 다른 플레이어와 가까워지면 상대방의 실시간 순위를 확인할 수 있습니다.

alt text

대출 및 상환

alt text

주식 매수

  • 5가지 주식의 남은 수량과 시가를 확인할 수 있습니다.
  • 물가 수준에 기반한 최대 거래 수량 만큼 거래 가능합니다.
  • 주식 매수 시, 실시간으로 주가 차트 및 지분 차트가 업데이트 됩니다.
  • 주식을 사면, 머리 위 선물 주머니에 담아 가지고 이동할 수 있습니다.

alt text

주식 매도

  • 집에서 가져온 주식을 확인할 수 있습니다.
  • 물가 수준에 기반한 최대 거래 수량 만큼 거래 가능합니다.
  • 주식 매도 시, 실시간으로 주가 차트 및 지분 차트가 업데이트 됩니다.

alt text

금 매입

alt text

미니맵

alt text

주가변동 발생

  • 주식 매도 행위가 일어나면, 주가 변동을 위한 게이지가 20%씩 상승합니다.
  • 주식 매수 또는 금 매입 행위가 일어나면, 내부 로직에 따라 주가 변동이 가능합니다.

alt text

돈 줍기 행동

  • 스페이스 바를 통해 행운의 코인을 획득할 수 있습니다.

alt text

개인 집 방문

  • 게임이 시작된 후 초기 위치는 자신의 집입니다.
  • 주식을 매수하면, 한 라운드가 끝나기 전에 자신의 집에 가지고 와야 합니다. (penalty: 현금 감소)
  • 주식을 매도하려면, 집에서 주식을 챙겨가야 합니다.
  • 주식을 챙기면, 머리 위 선물 주머니에 담아 가지고 이동할 수 있습니다.

alt text

챗봇

  • 우측 하단의 챗봇 아이콘을 토글하여 AI 챗봇에게 투자 조언을 구할 수 있습니다.

alt text

라운드 종료 및 대출 이자 변동

  • 한 라운드가 끝나면, 해당 라운드에서 대출한 금액 및 금리를 고려해 이자가 부여됩니다.

라운드 종료 및 대출 이자 변동


👨🏻‍💻 개발 팀 소개


강다현
@hyun3745

FRONTEND
강한나
@hannabananah

LEADER
MAIN FRONTEND
김현재
@Kguswo

MAIN BACKEND
AI
박희연
@hi-react

FRONTEND
AI
이가은
@Celinemad

BACKEND
전정민
@imjm

BACKEND
INFRA

📝 산출물


4. ERD