diff --git a/BE/src/auth/auth.controller.ts b/BE/src/auth/auth.controller.ts index 88c7ad5..fbb629e 100644 --- a/BE/src/auth/auth.controller.ts +++ b/BE/src/auth/auth.controller.ts @@ -15,6 +15,7 @@ import { Request, Response } from 'express'; import { ConfigService } from '@nestjs/config'; import { AuthService } from './auth.service'; import { AuthCredentialsDto } from './dto/auth-credentials.dto'; +import { OptionalAuthGuard } from './optional-auth-guard'; @Controller('/api/auth') export class AuthController { @@ -83,13 +84,14 @@ export class AuthController { @ApiOperation({ summary: '로그인 상태 확인 API' }) @Get('/check') - @UseGuards(AuthGuard('jwt')) + @UseGuards(OptionalAuthGuard) @ApiResponse({ status: 200, description: '로그인 상태 조회 성공', example: { isLogin: true }, }) - check() { + check(@Req() req: Request) { + if (!req.user) return { isLogin: false }; return { isLogin: true }; } diff --git a/BE/src/common/websocket/base-socket.domain-service.ts b/BE/src/common/websocket/base-socket.domain-service.ts index 13f000f..f215824 100644 --- a/BE/src/common/websocket/base-socket.domain-service.ts +++ b/BE/src/common/websocket/base-socket.domain-service.ts @@ -47,11 +47,12 @@ export class BaseSocketDomainService implements OnModuleInit { if (data.length < 2) { const json = JSON.parse(data[0]); - if (json.body) + if (json.body) { this.logger.log( `한국투자증권 웹소켓 연결: ${json.body.msg1}`, json.header.tr_id, ); + } if (json.header.tr_id === 'PINGPONG') this.socket.pong(JSON.stringify(json)); return; diff --git a/BE/src/stock/trade/history/stock-trade-history.service.ts b/BE/src/stock/trade/history/stock-trade-history.service.ts index 34d077b..198e9ab 100644 --- a/BE/src/stock/trade/history/stock-trade-history.service.ts +++ b/BE/src/stock/trade/history/stock-trade-history.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, InternalServerErrorException } from '@nestjs/common'; import { KoreaInvestmentDomainService } from '../../../common/koreaInvestment/korea-investment.domain-service'; import { InquireCCNLApiResponse } from './interface/Inquire-ccnl.interface'; import { TodayStockTradeHistoryOutputDto } from './dto/today-stock-trade-history-output.dto'; @@ -35,7 +35,12 @@ export class StockTradeHistoryService { queryParams, ); - await this.stockPriceSocketService.subscribeByCode(stockCode); + try { + await this.stockPriceSocketService.subscribeByCode(stockCode); + } catch (e) { + throw new InternalServerErrorException(e); + } + return this.formatTodayStockTradeHistoryData(response.output); } diff --git a/README.md b/README.md index b55a23c..969d460 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@
-

실시간 주식 데이터를 활용해 모의 투자를 경험하고, 친구들과 함께 성장할 수 있는 게임 서비스

+

실시간 주식 데이터를 활용한 모의투자 경험을 통해 주식 투자에 대해 배울 수 있는 서비스

--- @@ -15,13 +15,10 @@ - 처음이라 시작하기가 두려워요. - 자금이 부족해 다양한 시도를 못 해봤어요. - 주식의 전반적인 시스템을 공부하고 싶어요. -- 친구와 함께 투자를 시작하고 싶어요. ### 🎯 Juga를 통해 이런 걸 경험하세요! - 실제 주식 투자 전에 게임으로 먼저 경험해보세요. - 리스크 없이 투자 감각을 키워보세요. -- 친구들과 함께 성장하는 재미를 느껴보세요. -- 경쟁하고 정보도 나누며 더 즐겁게 배워보세요. ### [🚀 시작하기](https://juga.kro.kr/) @@ -35,36 +32,40 @@ ### 주의사항 -- 카카오 로그인 기능은 현재 심사 중으로 사용이 불가능합니다. - 실제 금전적 거래는 이루어지지 않는 모의투자 서비스입니다. ## ⭐️ 프로젝트 기능 소개 -### 주식 차트 -![화면 기록 2024-11-28 오후 6 40 30](https://github.com/user-attachments/assets/6d36b0d9-2db2-4018-a7f3-2c12fb586fd0) -- 일, 별, 월, 년 단위로 주식 차트를 확인할 수 있습니다. -- 이동평균선 정보를 활용해 해당 주식의 추이를 더 자세히 확인할 수 있습니다. -- 라이브러리를 사용하지 않고 canvas를 활용해 직접 구현했습니다. -### 로그인 -![image (14)](https://github.com/user-attachments/assets/9968ef08-cbf8-41fd-bfdc-8ca25dd8d80c) +### 메인 페이지 + -- 로그인 모달창에서 로그인을 할 수 있습니다. -- 카카오 oAuth 로그인으로 간편하게 로그인할 수 있습니다. +- 메인 페이지에서 코스피, 코스닥 등 실시간 주가 지수를 확인할 수 있습니다. +- 상승률/하락률 TOP5 종목을 주가지수 별로 확인할 수 있습니다. +- 오늘 실시간 주요 뉴스를 확인할 수 있습니다. +### 주식 상세 페이지 + -### 랭킹 -![image (15)](https://github.com/user-attachments/assets/251821a9-63d9-4f23-9178-2f8f3d8c608d) +- 해당 주식에 대한 정보를 차트로 확인할 수 있습니다. +- 일별, 실시간 시세를 확인할 수 있습니다. +- 매수, 매도 요청을 할 수 있습니다. -- 하루 단위로 랭킹이 갱신됩니다. -- 수익률순, 자산순을 기준으로 랭킹을 확인할 수 있습니다. -- 자신의 오늘 랭킹을 확인할 수 있습니다. +### 주식 차트 + +- 일, 주, 월, 년 단위로 주식 차트를 확인할 수 있습니다. +- 이동평균선 정보를 활용해 해당 주식의 추이를 더 자세히 확인할 수 있습니다. +- 라이브러리를 사용하지 않고 canvas를 활용해 직접 구현했습니다. +- [라이브러리 없이 구현한 이유](https://github.com/boostcampwm-2024/web16-JuGa/wiki/라이브러리-없이-차트를-직접-구현한-이유) ## 🏛️ 소프트웨어 아키텍처 소프트웨어 아키텍처 3 0 +- 한국투자증권 웹소켓은 한 계좌 당 41개의 종목에 대한 구독만을 유지할 수 있기 때문에, 최대한 많은 구독을 가능하게 하기 위한 방법으로 `Load Balancing`을 선택했습니다. +- 서버의 각 컨테이너는 모두 다른 계좌로 연결되어 총 `41*3`개의 구독을 유지할 수 있습니다. +- 추가로, redis의 pub/sub을 활용하여 서로 다른 서버로 요청이 들어오더라도 같은 종목에 대한 구독은 하나의 서버에서만 관리하도록 구현해 구독 자원을 최대한 절약하도록 했습니다. ## 🧑🏻 팀원 소개 | 🖥️ Web FE | ⚙️ Web BE | ⚙️ Web BE | 🖥️ Web FE | ⚙️ Web BE |