Skip to content

[BE] [REFACTOR] template 패키지를 backtest 도메인 하위로 이관#211

Merged
discipline24 merged 4 commits intomainfrom
20260131_#210_template_패키지_backtest_이관
Jan 31, 2026

Hidden character warning

The head ref may contain hidden characters: "20260131_#210_template_\ud328\ud0a4\uc9c0_backtest_\uc774\uad00"
Merged

[BE] [REFACTOR] template 패키지를 backtest 도메인 하위로 이관#211
discipline24 merged 4 commits intomainfrom
20260131_#210_template_패키지_backtest_이관

Conversation

@ykh4663
Copy link
Contributor

@ykh4663 ykh4663 commented Jan 31, 2026

📝 Summary

Template 도메인을 backtest 패키지로 통합하고, DTO 및 테스트 코드를 최신 구조로 리팩토링했습니다.

✨ Key Changes

  1. 패키지 구조 개편: 독립되어 있던 template 패키지를 backtest 하위로 이관
  2. 코드 리팩토링:
    • DTO(Request/Response)를 Java Record로 전환하여 불변성 확보
    • Service 트랜잭션 최적화 (readOnly = true 기본 적용)
  3. 보안 강화: 템플릿 수정(update) 시 ID 변조 방지를 위해 PathVariable ID 강제 사용
  4. 테스트 개선:
    • Spring Boot 3.4 대응 (@MockBean@MockitoBean 교체)

🔗 Related Issue

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 템플릿 API의 보안 개선: 사용자 정보가 요청 본문에서 제거되고 서버에서 관리
  • Bug Fixes

    • 템플릿 업데이트 시 소유권 검증 강화
  • Tests

    • 템플릿 컨트롤러 및 서비스에 대한 포괄적인 단위 테스트 추가

✏️ Tip: You can customize this high-level summary in your review settings.

…rd로 수정, TemplateService의 createTemplate, updateTemplate 인자에 UUID 추가"
…적용),Service 레이어 트랜잭션(@transactional) 적용, Record dto 형태로 TemplateService 코드 수정"
…서드 파라미터 변경, @MockitoBean 도입을 통한 Mockito depricate 문제 해결"
@ykh4663 ykh4663 requested a review from discipline24 as a code owner January 31, 2026 13:22
@ykh4663 ykh4663 added the BE 백엔드 이슈 label Jan 31, 2026
@coderabbitai
Copy link

coderabbitai bot commented Jan 31, 2026

Walkthrough

템플릿 기능 관련 코드를 template 패키지에서 backtest 패키지로 재구성하고, 기존 Lombok 클래스 기반 DTO를 Java Record로 변환했습니다. 사용자 인증 정보 처리 방식을 요청 객체 변경에서 명시적 파라미터 전달로 변경하고 트랜잭션 어노테이션을 추가했습니다.

Changes

Cohort / File(s) Summary
Controller 패키지 이동 및 시그니처 변경
backend/src/main/java/org/sejongisc/backend/backtest/controller/TemplateController.java
패키지를 template에서 backtest로 이동. createTemplateupdateTemplate 메서드 시그니처 변경: userId를 명시적 파라미터로 전달하고 요청 객체 변경 제거. updateTemplate에 경로 변수 templateId 추가.
DTO를 Record로 변환
backend/src/main/java/org/sejongisc/backend/backtest/dto/TemplateRequest.java, backend/src/main/java/org/sejongisc/backend/backtest/dto/TemplateResponse.java
기존 Lombok 클래스 기반 DTO를 Java Record로 변환. TemplateRequest는 title, description, isPublic 필드 포함. TemplateResponse는 templates, template, backtestRuns 필드 포함.
Entity 패키지 이동
backend/src/main/java/org/sejongisc/backend/backtest/entity/Template.java, backend/src/main/java/org/sejongisc/backend/backtest/entity/TemplateBookmark.java, backend/src/main/java/org/sejongisc/backend/backtest/entity/TemplateLike.java
패키지를 template.entity에서 backtest.entity로 이동. 구조 및 동작에 변경 없음.
Repository 및 Service 패키지 이동 및 시그니처 변경
backend/src/main/java/org/sejongisc/backend/backtest/repository/TemplateRepository.java, backend/src/main/java/org/sejongisc/backend/backtest/service/TemplateService.java
패키지를 backtest로 이동 및 임포트 업데이트. TemplateService의 createTemplate(request, userId), updateTemplate(templateId, userId, request), deleteTemplate(templateId, userId) 시그니처 변경. 클래스 레벨 @Transactional(readOnly = true) 추가.
BacktestRun Entity 임포트 정리
backend/src/main/java/org/sejongisc/backend/backtest/entity/BacktestRun.java
미사용 임포트(Template, OffsetDateTime) 제거.
Test 파일 마이그레이션
backend/src/test/java/org/sejongisc/backend/backtest/controller/TemplateControllerTest.java, backend/src/test/java/org/sejongisc/backend/backtest/service/TemplateServiceTest.java, backend/src/test/java/org/sejongisc/backend/backtest/service/BacktestServiceTest.java
테스트를 backtest 패키지로 이동 및 새로운 메서드 시그니처에 맞게 업데이트. 포괄적인 Controller 및 Service 단위 테스트 추가.
기존 template 패키지 DTO/Test 삭제
backend/src/main/java/org/sejongisc/backend/template/dto/TemplateRequest.java, backend/src/main/java/org/sejongisc/backend/template/dto/TemplateResponse.java, backend/src/test/java/org/sejongisc/backend/template/controller/TemplateControllerTest.java, backend/src/test/java/org/sejongisc/backend/template/service/TemplateServiceTest.java
기존 위치의 DTO 및 테스트 파일 완전 삭제.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers

  • discipline24
  • cksdid202

Poem

🐰 템플릿이 가방으로 쏙 들어가고~
레코드로 변신하니 참 반짝반짝!
유저아이디 명시적으로 전달하니
더 명확한 의도, 더 깔끔한 코드~
백테스트 영역에서 새로운 시작을 하네! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 변경 사항의 주요 내용을 명확하게 요약하고 있습니다. template 패키지를 backtest 도메인 하위로 이관한다는 핵심 변경 내용이 잘 표현되어 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 20260131_#210_template_패키지_backtest_이관

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
backend/src/test/java/org/sejongisc/backend/backtest/service/BacktestServiceTest.java (1)

80-86: ⚠️ Potential issue | 🔴 Critical

findByIdWithMember Mock 메서드로 변경 필요.

getBacktestStatusgetBackTestDetails 테스트에서 runRepository.findById(1L)를 mock하고 있으나, BacktestService.findBacktestRunByIdAndVerifyUserfindByIdWithMember(backtestRunId)를 호출합니다. 테스트의 mock 설정을 findByIdWithMember로 수정하세요:

given(runRepository.findByIdWithMember(1L)).willReturn(Optional.of(run));

영향 받는 테스트: getBacktestStatus_success, getBacktestStatus_notFound, getBacktestStatus_ownerMismatch, getBackTestDetails_success, getBackTestDetails_notFound.

🤖 Fix all issues with AI agents
In
`@backend/src/main/java/org/sejongisc/backend/backtest/service/TemplateService.java`:
- Around line 76-80: deleteTemplate currently leaves related entities (likes,
bookmarks) unhandled which can cause delete failures or orphaned rows; update
Template entity or delete logic so related data is cleaned up: either add proper
JPA cascade/remove mappings (e.g., `@OneToMany`(mappedBy="template", cascade =
CascadeType.REMOVE or orphanRemoval=true) on the Template entity) or explicitly
remove dependent records in deleteTemplate before calling
templateRepository.delete by invoking the corresponding repositories (e.g.,
likeRepository.deleteByTemplateId, bookmarkRepository.deleteByTemplateId) while
keeping the method `@Transactional` and using authorizeTemplateOwner to locate the
target.

In
`@backend/src/test/java/org/sejongisc/backend/backtest/controller/TemplateControllerTest.java`:
- Around line 57-60: The test registers AuditorAware<String> twice causing bean
conflicts: remove the duplicate `@MockitoBean` on AuditorAware<String> in
TemplateControllerTest (or alternatively remove/disable the auditorProvider()
`@Bean` in DisableJpaAuditingConfig) so only one AuditorAware bean exists; locate
the `@MockitoBean` declaration for AuditorAware<String> and delete or comment it
out (or keep the DisableJpaAuditingConfig.auditorProvider() bean and remove the
`@MockitoBean`) to resolve the injection collision.
🧹 Nitpick comments (3)
backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java (1)

40-72: 읽기 전용 메서드에 readOnly = true 적용 권장.

PR 목표에서 언급된 트랜잭션 최적화 관점에서, getBacktestStockInfo, getBacktestStatus, getBackTestDetails 메서드는 읽기 전용 작업만 수행하므로 @Transactional(readOnly = true) 적용을 권장합니다.

♻️ 권장 수정 사항
-  `@Transactional`
+  `@Transactional`(readOnly = true)
   public BacktestResponse getBacktestStockInfo() {
-  `@Transactional`
+  `@Transactional`(readOnly = true)
   public BacktestResponse getBacktestStatus(Long backtestRunId, UUID userId) {
-  `@Transactional`
+  `@Transactional`(readOnly = true)
   public BacktestResponse getBackTestDetails(Long backtestRunId, UUID userId) {
backend/src/main/java/org/sejongisc/backend/backtest/dto/TemplateRequest.java (1)

6-6: 사용되지 않는 import 제거 권장.

java.util.UUID import가 선언되어 있지만 이 record에서 사용되지 않습니다.

♻️ 수정 제안
-import java.util.UUID;
-
backend/src/test/java/org/sejongisc/backend/backtest/service/TemplateServiceTest.java (1)

4-10: MockitoAnnotations.openMocks 대신 MockitoExtension 사용을 권장합니다. openMocks 반환 객체를 닫지 않아 테스트 간 리소스 누수가 생길 수 있어요.

♻️ 제안 수정
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
@@
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.jupiter.MockitoExtension;
@@
-class TemplateServiceTest {
+@ExtendWith(MockitoExtension.class)
+class TemplateServiceTest {
@@
     `@BeforeEach`
     void setUp() {
-        MockitoAnnotations.openMocks(this);
-
         userId = UUID.randomUUID();
         templateId = UUID.randomUUID();

Also applies to: 29-51

Copy link
Contributor

@discipline24 discipline24 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!

@discipline24 discipline24 merged commit 0b5c71e into main Jan 31, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

BE 백엔드 이슈

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🚀[기능개선] Template 패키지를 Backtest 패키지 하위로 이관

2 participants