Skip to content

[BE] 차트 서비스 로직 결합도 #113

@bongj9

Description

@bongj9

📄 설명

public class RealTimeTradeService {
//실시간 거래 데이터 보안성에 적합한 ConcurrentHashMap 사용
//전에 데이터를 캐싱처리해서 변동률 계산
private final Map<String, TradeEventDto> previousTradeMap = new ConcurrentHashMap<>();

//이벤트 Dto 받아서 체결내역에 필요한 데이터들을 보내주는것
public RealTimeDataDto generateRealTimeData(TradeEventDto tradeEventDto) {

    // 현재 가격 및 시간 정보 추출
    String ticker = tradeEventDto.getTicker();
    double currentPrice = tradeEventDto.getPrice();
    double currentSize = tradeEventDto.getSize();
    LocalDateTime currentTime = tradeEventDto.getTimestamp();

    // 변동률 계산
    double changeRate = 0.0;
    TradeEventDto previousTrade = previousTradeMap.get(ticker);
    //참조 오류로 동일한 객체를 보고있어서 변동률 계산에 오류가 발생
    log.debug("타임스탬프 비교 - 현재: {}, 이전: {}, 동일객체: {}",
            tradeEventDto.getTimestamp(),
            previousTrade != null ? previousTrade.getTimestamp() : "없음",
            previousTrade == tradeEventDto);

    // 이전 거래가 있고, 새로운 거래 데이터인 경우에만 변동률 계산
    if (previousTrade != null && previousTrade.getPrice() > 0 && previousTrade != tradeEventDto) {
        // 타임스탬프 비교로 새로운 거래인지 확인
        if (previousTrade.getTimestamp() == null || tradeEventDto.getTimestamp() == null ||
                !previousTrade.getTimestamp().equals(tradeEventDto.getTimestamp())) {

            double previousPrice = previousTrade.getPrice();
            //SRP를 위한 메서드 분리
            changeRate = getChangeRate(currentPrice, previousPrice);
            log.debug("변동률 계산: 현재가={}, 이전가={}, 변동률={}%",
                    currentPrice, previousPrice, changeRate);

            // 새로운 거래 데이터 저장
            previousTradeMap.put(ticker, new TradeEventDto(
                    tradeEventDto.getTicker(),
                    tradeEventDto.getSize(),
                    tradeEventDto.getPrice(),
                    tradeEventDto.getTimestamp()
            ));
        } else {
            log.debug("동일한 타임스탬프의 거래 데이터가 다시 수신됨: {}", tradeEventDto.getTimestamp());
        }
    } else {
        if (previousTrade == null) {
            log.debug("이전 거래 정보가 없어 변동률을 0으로 설정: {}", ticker);
            // 첫 거래 데이터 저장 (복사본 저장)
            previousTradeMap.put(ticker, new TradeEventDto(
                    tradeEventDto.getTicker(),
                    tradeEventDto.getSize(),
                    tradeEventDto.getPrice(),
                    tradeEventDto.getTimestamp()
            ));
        } else if (previousTrade == tradeEventDto) {
            log.debug("동일한 거래 객체가 다시 수신됨 (참조 동일): {}", ticker);
        }
    }
    // RealTimeDataDto 객체 생성 및 반환
    return new RealTimeDataDto(
            ticker,
            currentSize,
            currentPrice,
            changeRate,
            currentTime,
            UUID.randomUUID().toString()
    );
}


//SRP
public double getChangeRate(double currentPrice, double previousPrice) {
    double changeRate;
    changeRate = ((currentPrice - previousPrice) / previousPrice) * 100;
    return changeRate;
}

}`
보시다시피 하나의 메서드에 생성,반환,계산 등 다양한 기능(책임)들이 실행되고 있어서 테스트하기에 너무 까다로웠습니다.

✅ 작업할 내용

SRP원칙,OCP원칙에 따라 하나의 메서드에 단일책임을 지도록 변경할 생각입니다.

🙋🏻 참고 자료

https://kimkani.tistory.com/61
SOLID를 잘 정리한 블로그를 참고하여서 진행하였습니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions