Skip to content

Commit

Permalink
test: trade time test
Browse files Browse the repository at this point in the history
커넥션 풀 10개, 트랜잭션 작업 범위 축소 후 시간 테스트를 위한 커밋
  • Loading branch information
SeungGwan123 committed Jan 22, 2025
1 parent 3c4037f commit afefd94
Show file tree
Hide file tree
Showing 8 changed files with 257 additions and 93 deletions.
47 changes: 46 additions & 1 deletion packages/server/src/account/account.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,36 @@ export class AccountRepository extends Repository<Account> {
throw error;
}
}

async updateAccountCurrencyWithBid(
typeGiven: string,
change: number,
availableBalance: number,
accountId: number,
){
this.logger.log(
`계정 통화 업데이트 시작: accountId=${accountId}, type=${typeGiven}`,
);
try {
await this
.createQueryBuilder()
.update(Account)
.set({
// 직접 연산 처리: ()로 감싸 동적 SQL 계산
[typeGiven]: () => `${typeGiven} + ${change}`,
availableKRW: () => `availableKRW + ${availableBalance}`,
})
.where('id = :id', { id: accountId })
.execute();
this.logger.log(`계정 통화 업데이트 완료: accountId=${accountId}`);
} catch (error) {
this.logger.error(
`계정 통화 업데이트 실패: ${error.message}`,
error.stack,
);
throw error;
}
}
async updateAccountAvailableCurrency(
change: number,
accountId: number,
Expand Down Expand Up @@ -173,7 +203,7 @@ export class AccountRepository extends Repository<Account> {
}
}

async getAccount(id: number, queryRunner: QueryRunner): Promise<Account> {
async getAccountWithQueryRunner(id: number, queryRunner: QueryRunner): Promise<Account> {
this.logger.log(`계정 조회 시작: userId=${id}`);
try {
const account = await queryRunner.manager.findOne(Account, {
Expand All @@ -187,4 +217,19 @@ export class AccountRepository extends Repository<Account> {
throw error;
}
}

async getAccount(id: number): Promise<Account> {
this.logger.log(`계정 조회 시작: userId=${id}`);
try {
const account = await this.findOne({
where: { user: { id } },
});

this.logger.log(`계정 조회 완료: userId=${id}`);
return account;
} catch (error) {
this.logger.error(`계정 조회 실패: ${error.message}`, error.stack);
throw error;
}
}
}
64 changes: 61 additions & 3 deletions packages/server/src/asset/asset.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Account } from '@src/account/account.entity';
import { Asset } from './asset.entity';
import { Coin } from './dtos/asset.interface';
import { ensureMax8Decimals } from './utils/util';
import { query } from 'express';

@Injectable()
export class AssetRepository extends Repository<Asset> {
Expand All @@ -29,7 +30,6 @@ export class AssetRepository extends Repository<Asset> {
account: Account,
price: number,
quantity: number,
queryRunner: QueryRunner,
): Promise<Asset> {
this.logger.log(`자산 생성 시작: type=${typeReceived}, accountId=${account.id}`);
try {
Expand All @@ -44,7 +44,7 @@ export class AssetRepository extends Repository<Asset> {
asset.availableQuantity = quantity;
asset.account = account;

const savedAsset = await queryRunner.manager.save(Asset, asset);
const savedAsset = await this.save(asset);
this.logger.log(`자산 생성 완료: assetId=${savedAsset.assetId}`);

return savedAsset;
Expand All @@ -62,6 +62,39 @@ export class AssetRepository extends Repository<Asset> {
*/
async updateAssetQuantityPrice(
asset: Asset,
): Promise<void> {
this.logger.log(`자산 수량/가격 업데이트 시작: assetId=${asset.assetId}`);
try {
// --- [추가] 8자리 검사 ---
ensureMax8Decimals(asset.price, 'price');
ensureMax8Decimals(asset.quantity, 'quantity');
ensureMax8Decimals(asset.availableQuantity, 'availableQuantity');

await this
.createQueryBuilder()
.update(Asset)
.set({
quantity: asset.quantity,
price: asset.price,
availableQuantity: asset.availableQuantity,
})
.where('assetId = :assetId', { assetId: asset.assetId })
.execute();

this.logger.log(`자산 수량/가격 업데이트 완료: assetId=${asset.assetId}`);
} catch (error) {
this.logger.error(
`자산 수량/가격 업데이트 실패: ${error.message}`,
error.stack,
);
throw new InternalServerErrorException(
'자산 업데이트 중 오류가 발생했습니다.',
);
}
}

async updateAssetQuantityPriceWithQR(
asset: Asset,
queryRunner: QueryRunner,
): Promise<void> {
this.logger.log(`자산 수량/가격 업데이트 시작: assetId=${asset.assetId}`);
Expand Down Expand Up @@ -191,7 +224,7 @@ export class AssetRepository extends Repository<Asset> {
}
}

async getAsset(
async getAssetWithQR(
id: number,
assetName: string,
queryRunner: QueryRunner,
Expand All @@ -217,6 +250,31 @@ export class AssetRepository extends Repository<Asset> {
}
}

async getAsset(
id: number,
assetName: string,
): Promise<Asset> {
this.logger.log(`자산 조회 시작: accountId=${id}, assetName=${assetName}`);
try {
const asset = await this.findOne({
where: {
account: { id },
assetName,
},
});

this.logger.log(
`자산 조회 완료: ${asset ? `assetId=${asset.assetId}` : '자산 없음'}`,
);
return asset;
} catch (error) {
this.logger.error(`자산 조회 실패: ${error.message}`, error.stack);
throw new InternalServerErrorException(
'자산 조회 중 오류가 발생했습니다.',
);
}
}

async getAssets(accountId: number): Promise<Coin[]> {
try {
const assets = await this.find({
Expand Down
25 changes: 24 additions & 1 deletion packages/server/src/trade-history/trade-history.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export class TradeHistoryRepository extends Repository<TradeHistory> {
super(TradeHistory, dataSource.createEntityManager());
}

async createTradeHistory(
async createTradeHistoryWithQR(
user: User,
tradeData: CreateTradeHistoryDto,
queryRunner: QueryRunner,
Expand All @@ -33,4 +33,27 @@ export class TradeHistoryRepository extends Repository<TradeHistory> {
throw error;
}
}

async createTradeHistory(
user: User,
tradeData: CreateTradeHistoryDto,
tradeTime: Date,
): Promise<void> {
this.logger.log(`거래 내역 생성 시작: userId=${user.id}`);

try {
const tradeHistory = new TradeHistory();
Object.assign(tradeHistory, {
...tradeData,
tradeDate: tradeTime,
user,
});

await this.save(tradeHistory);
this.logger.log(`거래 내역 생성 완료: userId=${user.id}`);
} catch (error) {
this.logger.error(`거래 내역 생성 실패: ${error.message}`, error.stack);
throw error;
}
}
}
10 changes: 5 additions & 5 deletions packages/server/src/trade/trade-ask-bid.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { TRADE_TYPES } from './constants/trade.constants';

@Injectable()
export class TradeAskBidService {
private readonly logger = new Logger(TradeAskBidService.name);
protected readonly logger = new Logger(TradeAskBidService.name);
constructor(
protected readonly dataSource: DataSource,
protected readonly accountRepository: AccountRepository,
Expand All @@ -31,14 +31,14 @@ export class TradeAskBidService {
try {
const coinLatestInfo = this.coinDataUpdaterService.getCoinLatestInfo();
if (coinLatestInfo.size === 0) return;

const coinPrices = this.buildCoinPrices(coinLatestInfo);

const availableTrades = await this.redisRepository.findMatchingTrades(
tradeType,
coinPrices,
);

// 병렬 처리로 모든 거래를 처리
await Promise.all(
availableTrades.map(async (trade) => {
Expand All @@ -65,7 +65,7 @@ export class TradeAskBidService {
this.logger.log(`${tradeType} 미체결 거래 처리 완료`);
}
}

private buildCoinPrices(coinLatestInfo: Map<string, any>): CoinPriceDto[] {
const prices: CoinPriceDto[] = [];
coinLatestInfo.forEach((value, key) => {
Expand Down
8 changes: 4 additions & 4 deletions packages/server/src/trade/trade-ask.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ export class AskService extends TradeAskBidService implements OnModuleInit {
account: any,
queryRunner: QueryRunner,
) {
const userAsset = await this.assetRepository.getAsset(
const userAsset = await this.assetRepository.getAssetWithQR(
account.id,
askDto.typeGiven,
queryRunner,
Expand Down Expand Up @@ -204,12 +204,12 @@ export class AskService extends TradeAskBidService implements OnModuleInit {
return 0;
}

const account = await this.accountRepository.getAccount(
const account = await this.accountRepository.getAccountWithQueryRunner(
askDto.userId,
queryRunner,
);

const userAsset = await this.assetRepository.getAsset(
const userAsset = await this.assetRepository.getAssetWithQR(
account.id,
askDto.typeGiven,
queryRunner,
Expand Down Expand Up @@ -240,7 +240,7 @@ export class AskService extends TradeAskBidService implements OnModuleInit {
buyData.assetName = buyData.tradeCurrency;
buyData.tradeCurrency = assetName;

await this.tradeHistoryRepository.createTradeHistory(
await this.tradeHistoryRepository.createTradeHistoryWithQR(
user,
buyData,
queryRunner,
Expand Down
Loading

0 comments on commit afefd94

Please sign in to comment.