[BE] SISC1-56 [FEAT] 백테스팅 실행 api 구현#102
Hidden character warning
Conversation
customUserDetails에 user 추가 후, 반환시 해당 객체 넣음으로써 해결
userRepository 이용하여 DB 접근으로 해결
…IT/sisc-web into SISC1-56-BE-백테스팅-실행-API-구현
# Conflicts: # .gitignore # backend/src/main/java/org/sejongisc/backend/backtest/repository/BacktestRunRepository.java # backend/src/main/java/org/sejongisc/backend/template/service/TemplateService.java # backend/src/main/java/org/sejongisc/backend/user/entity/User.java
Walkthrough백테스팅 관련 DTO, 서비스, 엔진 및 보조 유틸이 리팩토링되었습니다. 요청 DTO에 필드가 추가되고 응답 구조가 단순화되었으며 거래 로그·지표 응답 타입이 추가되고, 지표 계산·리포지토리 조회·템플릿·사용자 조회 흐름이 변경되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
participant Client
participant BacktestService
participant BacktestRunRepository
participant BacktestingEngine
participant BacktestRunMetricsRepo
participant ResponseBuilder
rect rgb(235,245,235)
Note over Client,ResponseBuilder: 백테스트 실행 흐름 (요약)
Client->>BacktestService: runBacktest(request with defaultExitDays)
BacktestService->>BacktestRunRepository: save(backtestRun)
BacktestRunRepository-->>BacktestService: backtestRun (with member/template)
BacktestService->>BacktestingEngine: execute(backtestRun)
BacktestingEngine-->>BacktestService: BacktestRunMetrics + TradeLogs
BacktestService->>BacktestRunMetricsRepo: save(metrics)
BacktestService->>ResponseBuilder: build(backtestRun, metricsResponse)
ResponseBuilder-->>Client: backtestRun + backtestRunMetricsResponse
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60분
Possibly related PRs
Suggested reviewers
시
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestResponse.java (1)
8-12: 불필요한 import 때문에 빌드가 깨집니다
현재 DTO는BacktestRun과BacktestRunMetricsResponse만 사용하지만BacktestStatus,Template,LocalDateimport가 그대로 남아 있어javac가 unused import 오류를 발생시킵니다. 모두 제거해주세요.-import org.sejongisc.backend.backtest.entity.BacktestStatus; -import org.sejongisc.backend.template.entity.Template; - -import java.time.LocalDate;
🧹 Nitpick comments (3)
backend/src/main/java/org/sejongisc/backend/backtest/dto/StrategyOperand.java (2)
7-7: 사용하지 않는 import를 정리하세요.
@Setter어노테이션이 추가되었지만, 4번 라인의lombok.AllArgsConstructorimport는 더 이상 사용되지 않습니다. 코드 품질을 위해 제거해 주세요.다음과 같이 수정하세요:
-import lombok.AllArgsConstructor;Also applies to: 18-18
39-39: 주석 처리된 코드는 제거를 고려하세요.향후 적용 예정인 필드를 주석으로 남겨두는 것보다는, 실제로 필요할 때 추가하거나 별도 이슈로 관리하는 것이 코드 가독성에 더 좋습니다.
backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestRequest.java (1)
38-40: 유효성 검증 어노테이션 추가를 고려하세요.
defaultExitDays필드에 값의 범위를 제한하는 유효성 검증이 없습니다. 비즈니스 로직에 따라 음수 값이나 과도하게 큰 값을 방지하기 위한 제약 조건을 추가하는 것이 좋습니다.예를 들어, 다음과 같이 검증 어노테이션을 추가할 수 있습니다:
+ import jakarta.validation.constraints.Min; + import jakarta.validation.constraints.Max; @Schema(description = "기본 청산 기간") + @Min(value = 1, message = "기본 청산 기간은 최소 1일 이상이어야 합니다") + @Max(value = 365, message = "기본 청산 기간은 최대 365일을 초과할 수 없습니다") private Integer defaultExitDays;참고: 실제 최소/최대 값은 비즈니스 요구사항에 맞게 조정하세요.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestRequest.java(1 hunks)backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestRunMetricsResponse.java(1 hunks)backend/src/main/java/org/sejongisc/backend/backtest/dto/StrategyOperand.java(3 hunks)backend/src/main/java/org/sejongisc/backend/backtest/dto/TradeLog.java(1 hunks)backend/src/main/java/org/sejongisc/backend/backtest/repository/BacktestRunRepository.java(2 hunks)backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java(7 hunks)backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestingEngine.java(3 hunks)backend/src/main/java/org/sejongisc/backend/backtest/service/Ta4jHelperService.java(7 hunks)backend/src/main/java/org/sejongisc/backend/point/service/PointHistoryService.java(0 hunks)backend/src/main/java/org/sejongisc/backend/template/controller/TemplateController.java(1 hunks)backend/src/main/java/org/sejongisc/backend/template/dto/TemplateRequest.java(2 hunks)backend/src/main/java/org/sejongisc/backend/template/service/TemplateService.java(3 hunks)backend/src/test/java/org/sejongisc/backend/backtest/service/BacktestServiceTest.java(1 hunks)
💤 Files with no reviewable changes (1)
- backend/src/main/java/org/sejongisc/backend/point/service/PointHistoryService.java
🧰 Additional context used
🧬 Code graph analysis (3)
backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestRunMetricsResponse.java (1)
backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestResponse.java (1)
Getter(14-21)
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestingEngine.java (1)
backend/src/main/java/org/sejongisc/backend/backtest/dto/TradeLog.java (1)
TradeLog(6-19)
backend/src/main/java/org/sejongisc/backend/backtest/service/Ta4jHelperService.java (1)
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestingEngine.java (1)
Service(33-229)
🔇 Additional comments (4)
backend/src/main/java/org/sejongisc/backend/template/dto/TemplateRequest.java (1)
3-28: Swagger 문서화가 적절하게 추가되었습니다.API 문서화를 위한
@Schema어노테이션이 올바르게 적용되었습니다. 특히userId와templateId를hidden = true로 설정한 것은 이 필드들이 클라이언트 요청 본문이 아닌 컨트롤러에서 주입되는 값임을 명확히 하여 적절합니다.backend/src/main/java/org/sejongisc/backend/template/controller/TemplateController.java (1)
69-69: 인증된 사용자 ID 주입이 올바르게 추가되었습니다.
createTemplate메서드(Line 57)와 동일한 패턴으로 인증된 사용자의 ID를 요청 객체에 주입하고 있습니다. 이는 클라이언트가 요청 본문에서userId를 조작하는 것을 방지하여 보안을 강화하고 일관성을 보장합니다.backend/src/main/java/org/sejongisc/backend/template/service/TemplateService.java (1)
48-51: 검증 완료: 변경사항은 적절합니다.
Template.of()메서드 구현을 확인한 결과, 완전한 User 엔티티가 필요합니다. 메서드는 User 객체를 직접 저장하므로 (user(user)),UserRepository.findById()로 변경한 것은 올바른 결정입니다.추가로
orElseThrow()를 통한 명시적 사용자 존재 검증은:
- 잘못된 요청 처리 개선
- LazyInitializationException 방지
- 데이터 일관성 보장
이러한 이점이 DB 쿼리 추가 비용을 상쇄합니다.
backend/src/main/java/org/sejongisc/backend/backtest/service/Ta4jHelperService.java (1)
262-288: 입력 검증 강화 👍
validateOperand덕분에 DTO 필드 누락이 조기에 감지되어 런타임 예외가 줄어들었습니다. 잘 반영되었습니다.
backend/src/main/java/org/sejongisc/backend/backtest/dto/BacktestRequest.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestingEngine.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestingEngine.java
Show resolved
Hide resolved
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
backend/src/main/java/org/sejongisc/backend/backtest/entity/BacktestRunMetrics.java(1 hunks)backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java(7 hunks)
✅ Files skipped from review due to trivial changes (1)
- backend/src/main/java/org/sejongisc/backend/backtest/entity/BacktestRunMetrics.java
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java (1)
41-43: 응답 빌딩 로직의 중복을 제거하는 것을 고려해보세요.
backtestRun만 포함하는BacktestResponse빌딩 로직이 3곳에서 반복됩니다. 헬퍼 메서드로 추출하면 유지보수성이 향상됩니다.다음과 같이 헬퍼 메서드를 추가할 수 있습니다:
+ private BacktestResponse createRunOnlyResponse(BacktestRun backtestRun) { + return BacktestResponse.builder() + .backtestRun(backtestRun) + .build(); + } + public BacktestResponse getBacktestStatus(Long backtestRunId, UUID userId) { log.info("백테스팅 실행 상태 조회를 시작합니다."); BacktestRun backtestRun = findBacktestRunByIdAndVerifyUser(backtestRunId, userId); - return BacktestResponse.builder() - .backtestRun(backtestRun) - .build(); + return createRunOnlyResponse(backtestRun); }Also applies to: 50-52, 111-113
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java(7 hunks)
🔇 Additional comments (5)
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java (5)
9-9: 새로운 의존성이 올바르게 추가되었습니다.
BacktestRunMetricsResponse와UserRepository임포트 및 필드 추가가 리팩토링된 응답 구조와 리포지토리 기반 사용자 조회를 지원하기 위해 적절하게 이루어졌습니다.Also applies to: 19-19, 36-36
49-61: 이전 리뷰 이슈가 올바르게 해결되었습니다.
status != BacktestStatus.COMPLETED조건 추가로 PENDING, RUNNING 등 미완료 상태에서의 404 예외 문제가 해결되었습니다. COMPLETED 상태일 때만 metrics를 조회하고, 그 외 상태에서는backtestRun만 반환하는 로직이 정확합니다.
79-83:EntityManager에서UserRepository로의 전환이 적절합니다.사용자 조회를
EntityManager가 아닌UserRepository를 통해 수행하도록 리팩토링한 것은 좋은 개선입니다. 코드가 더 명확해지고 repository 계층의 책임이 잘 분리되었습니다.
150-158:findByIdWithMember사용으로 최적화되었습니다.
findById에서findByIdWithMember로 변경하여 user 연관관계를 함께 페치하는 것은 N+1 문제를 방지하는 좋은 최적화입니다. Line 154에서user.getUserId()를 접근하므로 fetch join이 필요한 변경입니다.
38-44: 원본 리뷰 의견의 주요 우려사항이 타당하지 않습니다.코드를 검증한 결과,
findByIdWithMember()메서드가 다음과 같이 구현되어 있습니다:@Query("SELECT br FROM BacktestRun br " + "LEFT JOIN FETCH br.template t " + "JOIN FETCH br.user u " + "WHERE br.id = :backtestRunId ")문제점 분석:
template과user모두 JOIN FETCH로 조회되어 즉시 로딩(eager loading) 됩니다- BacktestRun 엔티티가 서비스에서 반환될 때 이미 완전히 초기화된 상태입니다
- 따라서 응답 직렬화 시
LazyInitializationException발생 가능성이 없습니다@Transactional부재는 문제가 되지 않습니다남아있는 개선 제안:
- Line 39의
log.info()는 단순 상태 조회 작업에는 과도할 수 있으므로log.debug()로 변경 권장Likely an incorrect or invalid review comment.
Summary by CodeRabbit
새로운 기능
버그 수정
문서화
테스트