Skip to content

Commit 0b5c71e

Browse files
authored
[BE] [REFACTOR] template 패키지를 backtest 도메인 하위로 이관 (#211)
* git commit -m "[BE] [REFACTOR] template 패키지를 backtest 도메인 하위로 이관" * git commit -m "[BE] [REFACTOR] TemplateRequest, TemplateResponse Record로 수정, TemplateService의 createTemplate, updateTemplate 인자에 UUID 추가" * git commit -m "[BE] [REFACTOR] Update 로직의 ID 변조 취약점 개선 (@PathVariable 적용),Service 레이어 트랜잭션(@transactional) 적용, Record dto 형태로 TemplateService 코드 수정" * git commit -m "[BE] [Test] Template 테스트 패키지 이관 및 TemplateService 일부 메서드 파라미터 변경, @MockitoBean 도입을 통한 Mockito depricate 문제 해결"
1 parent 8d6f5d3 commit 0b5c71e

17 files changed

Lines changed: 466 additions & 511 deletions

File tree

backend/src/main/java/org/sejongisc/backend/template/controller/TemplateController.java renamed to backend/src/main/java/org/sejongisc/backend/backtest/controller/TemplateController.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package org.sejongisc.backend.template.controller;
1+
package org.sejongisc.backend.backtest.controller;
22

33
import io.swagger.v3.oas.annotations.Operation;
44
import io.swagger.v3.oas.annotations.tags.Tag;
55
import lombok.RequiredArgsConstructor;
66
import org.sejongisc.backend.common.auth.dto.CustomUserDetails;
7-
import org.sejongisc.backend.template.dto.TemplateRequest;
8-
import org.sejongisc.backend.template.dto.TemplateResponse;
9-
import org.sejongisc.backend.template.service.TemplateService;
7+
import org.sejongisc.backend.backtest.dto.TemplateRequest;
8+
import org.sejongisc.backend.backtest.dto.TemplateResponse;
9+
import org.sejongisc.backend.backtest.service.TemplateService;
1010
import org.springframework.http.ResponseEntity;
1111
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1212
import org.springframework.web.bind.annotation.*;
@@ -38,8 +38,8 @@ public ResponseEntity<TemplateResponse> getTemplateList(@AuthenticationPrincipal
3838
@GetMapping("/{templateId}")
3939
@Operation(
4040
summary = "템플릿 상세 조회",
41-
description = "지정된 템플릿 ID에 대한 상세 정보 및 템플릿에 저장된 백테스트 실행 기록들을 조회합니다."
42-
)
41+
description = "지정된 템플릿 ID에 대한 상세 정보 및 템플릿에 저장된 백테스트 실행 기록들을 조회합니다."
42+
)
4343
public ResponseEntity<TemplateResponse> getTemplateById(@PathVariable UUID templateId,
4444
@AuthenticationPrincipal CustomUserDetails customUserDetails) {
4545
return ResponseEntity.ok(templateService.findById(templateId, customUserDetails.getUserId()));
@@ -53,8 +53,7 @@ public ResponseEntity<TemplateResponse> getTemplateById(@PathVariable UUID templ
5353
)
5454
public ResponseEntity<TemplateResponse> createTemplate(@RequestBody TemplateRequest request,
5555
@AuthenticationPrincipal CustomUserDetails customUserDetail) {
56-
request.setUserId(customUserDetail.getUserId());
57-
return ResponseEntity.ok(templateService.createTemplate(request));
56+
return ResponseEntity.ok(templateService.createTemplate(request, customUserDetail.getUserId()));
5857
}
5958

6059
// 템플릿 수정
@@ -63,10 +62,9 @@ public ResponseEntity<TemplateResponse> createTemplate(@RequestBody TemplateRequ
6362
summary = "템플릿 수정",
6463
description = "기존의 백테스트 템플릿을 수정합니다."
6564
)
66-
public ResponseEntity<TemplateResponse> updateTemplate(@RequestBody TemplateRequest request,
65+
public ResponseEntity<TemplateResponse> updateTemplate(@PathVariable UUID templateId, @RequestBody TemplateRequest request,
6766
@AuthenticationPrincipal CustomUserDetails customUserDetails) {
68-
request.setUserId(customUserDetails.getUserId());
69-
return ResponseEntity.ok(templateService.updateTemplate(request));
67+
return ResponseEntity.ok(templateService.updateTemplate(templateId, customUserDetails.getUserId(), request));
7068
}
7169

7270
// 템플릿 삭제
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.sejongisc.backend.backtest.dto;
2+
3+
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
import java.util.UUID;
7+
8+
public record TemplateRequest(
9+
/**
10+
* 추후 create와 update request 달라지면 분리 필요
11+
*/
12+
13+
@Schema(description = "템플릿 제목", defaultValue = "기술주 템플릿")
14+
String title,
15+
16+
@Schema(description = "템플릿 설명", defaultValue = "기술주 템플릿입니다.")
17+
String description,
18+
19+
@Schema(description = "템플릿 공개 여부", defaultValue = "false")
20+
Boolean isPublic
21+
) {}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.sejongisc.backend.backtest.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
import org.sejongisc.backend.backtest.entity.BacktestRun;
6+
import org.sejongisc.backend.backtest.entity.Template;
7+
8+
import java.util.List;
9+
@Builder
10+
public record TemplateResponse(
11+
List<Template> templates,
12+
Template template,
13+
List<BacktestRun> backtestRuns
14+
) {}

backend/src/main/java/org/sejongisc/backend/backtest/entity/BacktestRun.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,10 @@
55
import lombok.*;
66
import org.hibernate.annotations.JdbcTypeCode;
77
import org.hibernate.type.SqlTypes;
8-
import org.sejongisc.backend.template.entity.Template;
98
import org.sejongisc.backend.user.entity.User;
109

1110
import java.time.LocalDate;
1211
import java.time.LocalDateTime;
13-
import java.time.OffsetDateTime;
1412

1513
@Entity
1614
@Getter

backend/src/main/java/org/sejongisc/backend/template/entity/Template.java renamed to backend/src/main/java/org/sejongisc/backend/backtest/entity/Template.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
package org.sejongisc.backend.template.entity;
1+
package org.sejongisc.backend.backtest.entity;
22

33

44
import com.fasterxml.jackson.annotation.JsonIgnore;
55
import jakarta.persistence.*;
66
import lombok.*;
77
import org.sejongisc.backend.common.entity.postgres.BasePostgresEntity;
8-
import org.sejongisc.backend.template.dto.TemplateRequest;
98
import org.sejongisc.backend.user.entity.User;
109

1110
import java.util.UUID;

backend/src/main/java/org/sejongisc/backend/template/entity/TemplateBookmark.java renamed to backend/src/main/java/org/sejongisc/backend/backtest/entity/TemplateBookmark.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.sejongisc.backend.template.entity;
1+
package org.sejongisc.backend.backtest.entity;
22

33
import jakarta.persistence.*;
44
import lombok.AllArgsConstructor;

backend/src/main/java/org/sejongisc/backend/template/entity/TemplateLike.java renamed to backend/src/main/java/org/sejongisc/backend/backtest/entity/TemplateLike.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.sejongisc.backend.template.entity;
1+
package org.sejongisc.backend.backtest.entity;
22

33
import jakarta.persistence.*;
44
import lombok.AllArgsConstructor;

backend/src/main/java/org/sejongisc/backend/template/repository/TemplateRepository.java renamed to backend/src/main/java/org/sejongisc/backend/backtest/repository/TemplateRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package org.sejongisc.backend.template.repository;
1+
package org.sejongisc.backend.backtest.repository;
22

3-
import org.sejongisc.backend.template.entity.Template;
3+
import org.sejongisc.backend.backtest.entity.Template;
44
import org.springframework.data.jpa.repository.JpaRepository;
55
import org.springframework.stereotype.Repository;
66

backend/src/main/java/org/sejongisc/backend/backtest/service/BacktestService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import org.sejongisc.backend.common.exception.CustomException;
1515
import org.sejongisc.backend.common.exception.ErrorCode;
1616
import org.sejongisc.backend.stock.repository.PriceDataRepository;
17-
import org.sejongisc.backend.template.entity.Template;
18-
import org.sejongisc.backend.template.repository.TemplateRepository;
17+
import org.sejongisc.backend.backtest.entity.Template;
18+
import org.sejongisc.backend.backtest.repository.TemplateRepository;
1919
import org.sejongisc.backend.user.repository.UserRepository;
2020
import org.sejongisc.backend.user.entity.User;
2121
import org.springframework.stereotype.Service;

backend/src/main/java/org/sejongisc/backend/template/service/TemplateService.java renamed to backend/src/main/java/org/sejongisc/backend/backtest/service/TemplateService.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
1-
package org.sejongisc.backend.template.service;
1+
package org.sejongisc.backend.backtest.service;
22

33

44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
66
import org.sejongisc.backend.backtest.repository.BacktestRunRepository;
77
import org.sejongisc.backend.common.exception.CustomException;
88
import org.sejongisc.backend.common.exception.ErrorCode;
9-
import org.sejongisc.backend.template.dto.TemplateRequest;
10-
import org.sejongisc.backend.template.dto.TemplateResponse;
11-
import org.sejongisc.backend.template.entity.Template;
12-
import org.sejongisc.backend.template.repository.TemplateRepository;
9+
import org.sejongisc.backend.backtest.dto.TemplateRequest;
10+
import org.sejongisc.backend.backtest.dto.TemplateResponse;
11+
import org.sejongisc.backend.backtest.entity.Template;
12+
import org.sejongisc.backend.backtest.repository.TemplateRepository;
1313
import org.sejongisc.backend.user.repository.UserRepository;
1414
import org.sejongisc.backend.user.entity.User;
1515
import org.springframework.stereotype.Service;
16+
import org.springframework.transaction.annotation.Transactional;
1617

1718
import java.util.UUID;
1819

1920
@Service
21+
@Transactional(readOnly = true)
2022
@RequiredArgsConstructor
2123
@Slf4j
2224
public class TemplateService {
@@ -43,12 +45,13 @@ public TemplateResponse findById(UUID templateId, UUID userId) {
4345
}
4446

4547
// 템플릿 생성
46-
public TemplateResponse createTemplate(TemplateRequest request) {
47-
User user = userRepository.findById(request.getUserId())
48+
@Transactional
49+
public TemplateResponse createTemplate(TemplateRequest request, UUID userId) {
50+
User user = userRepository.findById(userId)
4851
.orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND));
4952

50-
Template template = Template.of(user, request.getTitle(),
51-
request.getDescription(), request.getIsPublic());
53+
Template template = Template.of(user, request.title(),
54+
request.description(), request.isPublic());
5255

5356
templateRepository.save(template);
5457

@@ -58,9 +61,10 @@ public TemplateResponse createTemplate(TemplateRequest request) {
5861
}
5962

6063
// 템플릿 수정
61-
public TemplateResponse updateTemplate(TemplateRequest request) {
62-
Template template = authorizeTemplateOwner(request.getTemplateId(), request.getUserId());
63-
template.update(request.getTitle(), request.getDescription(), request.getIsPublic());
64+
@Transactional
65+
public TemplateResponse updateTemplate(UUID templateId, UUID userId, TemplateRequest request) {
66+
Template template = authorizeTemplateOwner(templateId, userId);
67+
template.update(request.title(), request.description(), request.isPublic());
6468
templateRepository.save(template);
6569

6670
return TemplateResponse.builder()
@@ -69,9 +73,10 @@ public TemplateResponse updateTemplate(TemplateRequest request) {
6973
}
7074

7175
// 템플릿 삭제
76+
@Transactional
7277
public void deleteTemplate(UUID templateId, UUID userId) {
7378
Template template = authorizeTemplateOwner(templateId, userId);
74-
// TODO : 좋아요 / 북마크 삭제
79+
// TODO : 좋아요 / 북마크 삭제 - cascade 옵션 또는 별도 처리 필요
7580
templateRepository.delete(template);
7681
}
7782

0 commit comments

Comments
 (0)