-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DEV-18] Completed Credit #247
Changes from 34 commits
f840bf0
7587022
4b384ba
5764f45
4d4e2b4
4743ab7
fff2144
4c4fc66
b467e20
a02d3c6
88a4df1
3b63e7d
bde3cc9
4e2bcf4
b987a8d
ddbb9c8
caa99f7
e185d3a
7488916
368446f
eeb2861
6759d61
8318277
3d825db
cf49e79
a55741d
6aad94e
b8183ae
dadbcfd
6ff3660
82d7a00
f3b6a6f
9a0e40d
37a8bfe
a2f9a86
2749bd1
a866f9a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.api; | ||
|
||
import java.util.List; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.api.dto.CompletedCreditResponse; | ||
import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser; | ||
|
||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.Parameter; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
|
||
@Tag(name = "CompletdCredit") | ||
public interface FindCompletedCreditApiPresentation { | ||
|
||
@Operation(summary = "기이수 학점 조회", description = "유저의 기이수 학점 조회 API") | ||
@Parameter(name = "userId", description = "로그인한 유저의 PK값 - 자동 적용") | ||
List<CompletedCreditResponse> getCompletedCredits(@LoginUser Long userId); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.api; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
import org.springframework.web.bind.annotation.GetMapping; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.api.dto.CompletedCreditResponse; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.FindCompletedCreditUseCase; | ||
import com.plzgraduate.myongjigraduatebe.core.meta.LoginUser; | ||
import com.plzgraduate.myongjigraduatebe.core.meta.WebAdapter; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@WebAdapter | ||
@RequestMapping(value = "/api/v1/graduations/credits") | ||
@RequiredArgsConstructor | ||
public class FindCompletedCreditsController implements FindCompletedCreditApiPresentation{ | ||
|
||
private final FindCompletedCreditUseCase findCompletedCreditUseCase; | ||
|
||
@GetMapping() | ||
public List<CompletedCreditResponse> getCompletedCredits(@LoginUser Long userId) { | ||
return findCompletedCreditUseCase.findCompletedCredits(userId).stream() | ||
.map(CompletedCreditResponse::from) | ||
.collect(Collectors.toList()); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.api.dto; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
|
||
import lombok.Builder; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Getter | ||
@NoArgsConstructor | ||
public class CompletedCreditResponse { | ||
|
||
private String category; | ||
private int totalCredit; | ||
private double takenCredit; | ||
private boolean completed; | ||
|
||
@Builder | ||
private CompletedCreditResponse(String category, int totalCredit, double takenCredit, boolean completed) { | ||
this.category = category; | ||
this.totalCredit = totalCredit; | ||
this.takenCredit = takenCredit; | ||
this.completed = completed; | ||
} | ||
|
||
public static CompletedCreditResponse from(CompletedCredit completedCredit) { | ||
return CompletedCreditResponse.builder() | ||
.category(completedCredit.getGraduationCategory().name()) | ||
.totalCredit(completedCredit.getTotalCredit()) | ||
.takenCredit(completedCredit.getTakenCredit()) | ||
.completed(completedCredit.getTakenCredit() >= completedCredit.getTotalCredit()) | ||
.build(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.application.port; | ||
|
||
import java.util.List; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
import com.plzgraduate.myongjigraduatebe.user.domain.model.User; | ||
|
||
public interface FindCompletedCreditPort { | ||
|
||
List<CompletedCredit> findCompletedCredit(User user); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.application.port; | ||
|
||
import java.util.List; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
import com.plzgraduate.myongjigraduatebe.user.domain.model.User; | ||
|
||
public interface GenerateOrModifyCompletedCreditPort { | ||
|
||
void generateOrModifyCompletedCredits(User user, List<CompletedCredit> completedCredits); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.application.service; | ||
|
||
import java.util.List; | ||
|
||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.FindCompletedCreditUseCase; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; | ||
import com.plzgraduate.myongjigraduatebe.user.application.usecase.find.FindUserUseCase; | ||
import com.plzgraduate.myongjigraduatebe.user.domain.model.User; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@UseCase | ||
@RequiredArgsConstructor | ||
@Transactional(readOnly = true) | ||
class FindCompletedCreditService implements FindCompletedCreditUseCase { | ||
|
||
private final FindUserUseCase findUserUseCase; | ||
private final FindCompletedCreditPort findCompletedCreditPort; | ||
|
||
@Override | ||
public List<CompletedCredit> findCompletedCredits(Long userId) { | ||
User user = findUserUseCase.findUserById(userId); | ||
return findCompletedCreditPort.findCompletedCredit(user); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.application.service; | ||
|
||
import static com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory.*; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Optional; | ||
import java.util.function.Function; | ||
import java.util.stream.Collectors; | ||
|
||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.GenerateOrModifyCompletedCreditPort; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase.GenerateOrModifyCompletedCreditUseCase; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
import com.plzgraduate.myongjigraduatebe.core.meta.UseCase; | ||
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.ChapelResult; | ||
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.DetailGraduationResult; | ||
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationResult; | ||
import com.plzgraduate.myongjigraduatebe.user.domain.model.User; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@UseCase | ||
@Transactional | ||
@RequiredArgsConstructor | ||
class GenerateOrModifyCompletedCreditService implements GenerateOrModifyCompletedCreditUseCase { | ||
|
||
private final FindCompletedCreditPort findCompletedCreditPort; | ||
private final GenerateOrModifyCompletedCreditPort generateOrModifyCompletedCreditPort; | ||
|
||
@Override | ||
public void generateOrModifyCompletedCredit(User user, GraduationResult graduationResult) { | ||
List<CompletedCredit> completedCredits = findCompletedCreditPort.findCompletedCredit(user); | ||
List<DetailGraduationResult> detailGraduationResults = graduationResult.getDetailGraduationResults(); | ||
|
||
Map<DetailGraduationResult, Optional<CompletedCredit>> resultMap = detailGraduationResults.stream() | ||
.collect(Collectors.toMap( | ||
Function.identity(), | ||
detailGraduationResult -> completedCredits.stream() | ||
.filter(completedCredit -> completedCredit.getGraduationCategory().equals(detailGraduationResult.getGraduationCategory())) | ||
.findFirst() | ||
)); | ||
|
||
List<CompletedCredit> completedCreditModels = resultMap.keySet().stream() | ||
.map(completedCredit -> createCompletedCreditModel(completedCredit, resultMap.get(completedCredit))) | ||
.collect(Collectors.toList()); | ||
|
||
CompletedCredit chapelCompletedCreditModel = createChapelCompletedCreditModel(completedCredits, | ||
graduationResult); | ||
CompletedCredit normalCultureCompletedCreditModel = createNormalCultureCompletedCreditModel(completedCredits, | ||
graduationResult); | ||
CompletedCredit freeElectiveCompletedCreditModel = createFreeElectiveCompletedCreditModel(completedCredits, | ||
graduationResult); | ||
|
||
ArrayList<CompletedCredit> allCompletedCreditModels = new ArrayList<>(completedCreditModels); | ||
allCompletedCreditModels.addAll( | ||
List.of(chapelCompletedCreditModel, normalCultureCompletedCreditModel, freeElectiveCompletedCreditModel)); | ||
generateOrModifyCompletedCreditPort.generateOrModifyCompletedCredits(user, allCompletedCreditModels); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. detailGraduationResult에서 GraduationCategory별로 Mapping을 해놓고 시작하면 더 좋을것 같다는 생각! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 저도 고민을 좀 해봤었는데 Map<GraduationCategory, DetailGraduationResult> 로 매핑이 힘든게 일반교양, 자유선택, 채플 졸업 결과는 타입이 각각 다 달라서 맵으로 매핑을 해놓을 수가 없었습니다.. 현재로서는 전체적인 ClaculateGraduationUseCase의 수정 없인 위 형태로 사전에 매핑해두는게 어려울거 같습니다. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 일반, 자유, 채플의 졸업결과도 결국 DetailGraduationResult에서 찾는거 아니야? DetailGraduationResult에 gradautionGategroy가 있는거고? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 일반교양, 자유선택, 채플은 DetailGraduationResult가 아니라 NormalCultureGraduationResult, FreeElectiveGraduationResult, ChapelResult가 따로 있어요 |
||
|
||
private CompletedCredit createCompletedCreditModel(DetailGraduationResult detailGraduationResult, | ||
Optional<CompletedCredit> completedCredit) { | ||
return CompletedCredit.builder() | ||
.id(completedCredit.map(CompletedCredit::getId).orElse(null)) | ||
.totalCredit(detailGraduationResult.getTotalCredit()) | ||
.takenCredit(detailGraduationResult.getTakenCredit()) | ||
.graduationCategory(detailGraduationResult.getGraduationCategory()) | ||
.build(); | ||
} | ||
|
||
private CompletedCredit createChapelCompletedCreditModel(List<CompletedCredit> completedCredits, | ||
GraduationResult graduationResult) { | ||
return completedCredits.stream() | ||
.filter(completedCredit -> completedCredit.getGraduationCategory() == CHAPEL) | ||
.map(completedCredit -> CompletedCredit.builder() | ||
.id(completedCredit.getId()) | ||
.totalCredit(ChapelResult.GRADUATION_COUNT) | ||
.takenCredit(graduationResult.getChapelResult().getTakenCount()) | ||
.graduationCategory(CHAPEL).build()) | ||
Check warning on line 82 in src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java Codecov / codecov/patchsrc/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java#L79-L82
|
||
.findFirst() | ||
.orElse(CompletedCredit.builder() | ||
.totalCredit(ChapelResult.GRADUATION_COUNT) | ||
.takenCredit(graduationResult.getChapelResult().getTakenChapelCredit()) | ||
.graduationCategory(CHAPEL).build()); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. createCompletedCreditModel 메서드 류는 CompletedCreaditGenerator혹은 Creator로 해서 분리하는게 어때? 그리고 CompletedCredit을 생성하는 책임을 CompletedCredit에 넘겨주어도 좋을 것 같고. 만약에 CompeltedCredit 필드면 하나 수정되는 순간 바로 이 클래스까지 수정 범위가 커지기도 하니까! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 음 저도 생각해봤던건데 저 3가지 케이스를 switch문으로 분기처리하여 생성해주는게 과연 가독성이 더 좋을지는 잘 모르겠습니다. 다만 말씀대로 CompletedCredit 객체를 생성해주는 책임은 CompletedCredit에 두는게 훨씬 좋을거 같네요! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 저도 이 코드에 중복이 많아서 분기하는게 좋을지 따로 빼는게 좋을지 고민했는데, 개인적으로는 각각에 필요한게 조금씩 다르다보니 코드가 흐름의 중복은 조금 해결될지라도 전반적인 가독성이 해소가 될거 같지는 않다는 생각이 들었어요! 그리고 저도 생성은 CompletedCredit에게 넘기는게 좋아보입니다!! |
||
|
||
private CompletedCredit createNormalCultureCompletedCreditModel(List<CompletedCredit> completedCredits, | ||
GraduationResult graduationResult) { | ||
return completedCredits.stream() | ||
.filter(completedCredit -> completedCredit.getGraduationCategory() == NORMAL_CULTURE) | ||
.map(completedCredit -> CompletedCredit.builder() | ||
.id(completedCredit.getId()) | ||
.totalCredit(graduationResult.getNormalCultureGraduationResult().getTotalCredit()) | ||
.takenCredit(graduationResult.getNormalCultureGraduationResult().getTakenCredit()) | ||
.graduationCategory(NORMAL_CULTURE).build()) | ||
Check warning on line 98 in src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java Codecov / codecov/patchsrc/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java#L95-L98
|
||
.findFirst() | ||
.orElse(CompletedCredit.builder() | ||
.totalCredit(graduationResult.getNormalCultureGraduationResult().getTotalCredit()) | ||
.takenCredit(graduationResult.getNormalCultureGraduationResult().getTakenCredit()) | ||
.graduationCategory(NORMAL_CULTURE).build()); | ||
} | ||
|
||
private CompletedCredit createFreeElectiveCompletedCreditModel(List<CompletedCredit> completedCredits, | ||
GraduationResult graduationResult) { | ||
return completedCredits.stream() | ||
.filter(completedCredit -> completedCredit.getGraduationCategory() == FREE_ELECTIVE) | ||
.map(completedCredit -> CompletedCredit.builder() | ||
.id(completedCredit.getId()) | ||
.totalCredit(graduationResult.getFreeElectiveGraduationResult().getTotalCredit()) | ||
.takenCredit(graduationResult.getFreeElectiveGraduationResult().getTakenCredit()) | ||
.graduationCategory(FREE_ELECTIVE).build()) | ||
Check warning on line 114 in src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java Codecov / codecov/patchsrc/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/application/service/GenerateOrModifyCompletedCreditService.java#L111-L114
|
||
.findFirst() | ||
.orElse(CompletedCredit.builder() | ||
.totalCredit(graduationResult.getFreeElectiveGraduationResult().getTotalCredit()) | ||
.takenCredit(graduationResult.getFreeElectiveGraduationResult().getTakenCredit()) | ||
.graduationCategory(FREE_ELECTIVE).build()); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase; | ||
|
||
import java.util.List; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
|
||
public interface FindCompletedCreditUseCase { | ||
|
||
List<CompletedCredit> findCompletedCredits(Long userId); | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.application.usecase; | ||
|
||
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationResult; | ||
import com.plzgraduate.myongjigraduatebe.user.domain.model.User; | ||
|
||
public interface GenerateOrModifyCompletedCreditUseCase { | ||
|
||
void generateOrModifyCompletedCredit(User user, GraduationResult graduationResult); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.domain.model; | ||
|
||
import com.plzgraduate.myongjigraduatebe.graduation.domain.model.GraduationCategory; | ||
|
||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
public class CompletedCredit { | ||
|
||
private final Long id; | ||
private final GraduationCategory graduationCategory; | ||
private final int totalCredit; | ||
private final double takenCredit; | ||
|
||
@Builder | ||
private CompletedCredit(Long id, GraduationCategory graduationCategory, int totalCredit, | ||
double takenCredit) { | ||
this.id = id; | ||
this.graduationCategory = graduationCategory; | ||
this.totalCredit = totalCredit; | ||
this.takenCredit = takenCredit; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.FindCompletedCreditPort; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.mapper.CompletedCreditPersistenceMapper; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.repository.CompletedCreditRepository; | ||
import com.plzgraduate.myongjigraduatebe.core.meta.PersistenceAdapter; | ||
import com.plzgraduate.myongjigraduatebe.user.domain.model.User; | ||
import com.plzgraduate.myongjigraduatebe.user.infrastructure.adapter.persistence.mapper.UserMapper; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@PersistenceAdapter | ||
@RequiredArgsConstructor | ||
public class FindCompletedCreditAdapter implements FindCompletedCreditPort { | ||
|
||
private final UserMapper userMapper; | ||
private final CompletedCreditPersistenceMapper completedCreditPersistenceMapper; | ||
private final CompletedCreditRepository completedCreditRepository; | ||
@Override | ||
public List<CompletedCredit> findCompletedCredit(User user) { | ||
return completedCreditRepository.findAllByUserJpaEntity(userMapper.mapToJpaEntity(user)).stream() | ||
.map(completedCreditPersistenceMapper::mapToDomainModel) | ||
.collect(Collectors.toList()); | ||
Check warning on line 27 in src/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/FindCompletedCreditAdapter.java Codecov / codecov/patchsrc/main/java/com/plzgraduate/myongjigraduatebe/completedcredit/infrastructure/persistence/FindCompletedCreditAdapter.java#L25-L27
|
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
import com.plzgraduate.myongjigraduatebe.completedcredit.application.port.GenerateOrModifyCompletedCreditPort; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.domain.model.CompletedCredit; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.entity.CompletedCreditJpaEntity; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.mapper.CompletedCreditPersistenceMapper; | ||
import com.plzgraduate.myongjigraduatebe.completedcredit.infrastructure.persistence.repository.CompletedCreditRepository; | ||
import com.plzgraduate.myongjigraduatebe.core.meta.PersistenceAdapter; | ||
import com.plzgraduate.myongjigraduatebe.user.domain.model.User; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@PersistenceAdapter | ||
@RequiredArgsConstructor | ||
public class GenerateOrModifyCompletedCreditsAdapter implements GenerateOrModifyCompletedCreditPort { | ||
|
||
private final CompletedCreditPersistenceMapper completedCreditPersistenceMapper; | ||
private final CompletedCreditRepository completedCreditRepository; | ||
|
||
@Override | ||
public void generateOrModifyCompletedCredits(User user, List<CompletedCredit> completedCredits) { | ||
List<CompletedCreditJpaEntity> completedCreditJpaEntities = completedCredits.stream() | ||
.map(completedCredit -> completedCreditPersistenceMapper.mapToJpaEntity(user, completedCredit)) | ||
.collect(Collectors.toList()); | ||
|
||
completedCreditRepository.saveAll(completedCreditJpaEntities); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분만 분리되면 될거 같습니다! 수고하셨어요!