Skip to content

Commit 8921579

Browse files
authored
Dev > Main 브랜치 병합
1. Project Admin Swagger 설정을 수정하였습니다. 2. 서버 재시작시 프로젝트 전체 조회가 안되는 현상을 수정하였습니다. 통합 테스트 후 Main 브랜치로 병합합니다.
2 parents baa3d13 + 00cb8e8 commit 8921579

File tree

3 files changed

+28
-28
lines changed

3 files changed

+28
-28
lines changed

src/main/java/hs/kr/backend/devpals/domain/project/controller/ProjectAdminController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
@RestController
1414
@RequestMapping("/admin/project")
15-
@Tag(name = "Admin Project API", description = "관리자 전용 프로젝트 관련 API")
15+
@Tag(name = "Project Admin API", description = "관리자 전용 프로젝트 관련 API")
1616
@RequiredArgsConstructor
1717
public class ProjectAdminController {
1818
private final ProjectAdminService projectAdminService;

src/main/java/hs/kr/backend/devpals/domain/project/controller/ProjectFacadeController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
@AllArgsConstructor
2020
@RestController
2121
@RequestMapping
22-
@Tag(name = "MethodType API", description = "방식 종류를 가져오는 API")
22+
@Tag(name = "Project MethodType API", description = "방식 종류를 가져오는 API")
2323
public class ProjectFacadeController {
2424

2525
private final ProjectFacade projectFacade;

src/main/java/hs/kr/backend/devpals/domain/project/service/ProjectService.java

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import hs.kr.backend.devpals.global.exception.CustomException;
1919
import hs.kr.backend.devpals.global.exception.ErrorException;
2020
import hs.kr.backend.devpals.global.jwt.JwtTokenValidator;
21+
import jakarta.annotation.PostConstruct;
2122
import lombok.RequiredArgsConstructor;
2223
import org.springframework.beans.factory.annotation.Qualifier;
2324
import org.springframework.http.ResponseEntity;
@@ -46,43 +47,42 @@ public class ProjectService {
4647
@Qualifier("emailExecutor")
4748
private final Executor emailExecutor;
4849

49-
private final Map<Long, ProjectAllDto> projectAllCache = new LinkedHashMap<>();
50+
private final Map<Long, ProjectAllDto> projectAllCache = Collections.synchronizedMap(new LinkedHashMap<>());
5051

51-
// 프로젝트 목록 조회
52-
@Transactional
52+
@PostConstruct
53+
public void initializeProjectCache() {
54+
List<ProjectEntity> projects = projectRepository.findAllByOrderByCreatedAtDesc();
55+
for (ProjectEntity project : projects) {
56+
projectAllCache.put(project.getId(), convertToDto(project));
57+
}
58+
}
59+
60+
// 캐시에서 필터링만 수행 (isEmpty() 조건 제거)
61+
@Transactional(readOnly = true)
5362
public ResponseEntity<ApiResponse<ProjectListResponse>> getProjectAll(
5463
List<Long> skillTagId, Long positionTagId,
5564
Long methodTypeId, Boolean isBeginner,
5665
String keyword, int page) {
5766

58-
if (projectAllCache.isEmpty()) {
59-
List<ProjectEntity> projects = projectRepository.findAllByOrderByCreatedAtDesc();
60-
projects.forEach(project -> {
61-
if (!projectAllCache.containsKey(project.getId())) {
62-
projectAllCache.put(project.getId(), convertToDto(project));
63-
}
64-
});
67+
List<ProjectAllDto> filteredProjectsAll;
68+
synchronized (projectAllCache) {
69+
filteredProjectsAll = projectAllCache.values().stream()
70+
.filter(project -> !isBeginner || project.getIsBeginner())
71+
.filter(project -> keyword == null || keyword.isEmpty() ||
72+
project.getTitle().toLowerCase().contains(keyword.toLowerCase()) ||
73+
project.getDescription().toLowerCase().contains(keyword.toLowerCase()))
74+
.filter(project -> methodTypeId == null || methodTypeId <= 0L ||
75+
Objects.equals(project.getMethodTypeId(), methodTypeId))
76+
.filter(project -> positionTagId == null || positionTagId <= 0 ||
77+
project.getPositionTagIds().contains(positionTagId))
78+
.filter(project -> skillTagId == null || skillTagId.isEmpty() ||
79+
project.getSkillTagIds().stream().anyMatch(skillTagId::contains))
80+
.collect(Collectors.toList());
6581
}
6682

67-
// 전체 캐시에서 필터링 먼저 수행
68-
List<ProjectAllDto> filteredProjectsAll = projectAllCache.values().stream()
69-
.filter(project -> !isBeginner || project.getIsBeginner())
70-
.filter(project -> keyword == null || keyword.isEmpty() ||
71-
project.getTitle().toLowerCase().contains(keyword.toLowerCase()) ||
72-
project.getDescription().toLowerCase().contains(keyword.toLowerCase()))
73-
.filter(project -> methodTypeId == null || methodTypeId <= 0L ||
74-
Objects.equals(project.getMethodTypeId(), methodTypeId))
75-
.filter(project -> positionTagId == null || positionTagId <= 0 ||
76-
project.getPositionTagIds().contains(positionTagId))
77-
.filter(project -> skillTagId == null || skillTagId.isEmpty() ||
78-
project.getSkillTagIds().stream().anyMatch(skillTagId::contains))
79-
.collect(Collectors.toList());
80-
81-
// 필터링된 결과 기준으로 total, lastPage 계산
8283
int totalProjects = filteredProjectsAll.size();
8384
int lastPage = (int) Math.ceil((double) totalProjects / 12);
8485

85-
// 페이지네이션 적용
8686
List<ProjectAllDto> filteredProjects = filteredProjectsAll.stream()
8787
.skip((page - 1) * 12)
8888
.limit(12)

0 commit comments

Comments
 (0)