From e72c5347a1e6637afcb3f5bc8eacf90b609b52a3 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Mon, 24 Mar 2025 17:46:42 +0900 Subject: [PATCH 01/15] =?UTF-8?q?[Fix]Test=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cafeteria/CafeteriaServiceV2Test.java | 47 +----- .../cafeteria/CampusServiceV2Test.java | 15 +- .../service/notice/CategoryServiceV2Test.java | 51 +++++++ .../notice/NoticeCategoryServiceV2Test.java | 40 ----- .../service/notice/NoticeServiceV2Test.java | 139 ++++++++++++++++++ .../userInfo/DepartmentServiceV2Test.java | 10 +- .../service/userInfo/UserServiceV2Test.java | 33 +---- 7 files changed, 203 insertions(+), 132 deletions(-) create mode 100644 src/test/java/com/example/Jinus/service/notice/CategoryServiceV2Test.java delete mode 100644 src/test/java/com/example/Jinus/service/notice/NoticeCategoryServiceV2Test.java create mode 100644 src/test/java/com/example/Jinus/service/notice/NoticeServiceV2Test.java diff --git a/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceV2Test.java b/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceV2Test.java index be6ba52..2a57bbd 100644 --- a/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceV2Test.java @@ -8,6 +8,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; @@ -25,16 +27,11 @@ import static org.springframework.test.web.client.ExpectedCount.times; @ExtendWith(MockitoExtension.class) -@SpringBootTest public class CafeteriaServiceV2Test { - @Autowired - private CafeteriaServiceV2 cafeteriaServiceV2; - @Autowired - private RedisTemplate redisTemplate; - @Autowired + @InjectMocks private CacheServiceV2 cacheServiceV2; - @MockBean + @Mock private CafeteriaRepositoryV2 cafeteriaRepositoryV2; @Test @@ -54,40 +51,4 @@ public void checkUserCafeteriaList() { // then assertThat(result).usingRecursiveComparison().isEqualTo(resultList); } - -// @Test -// @DisplayName("campusId, cafeteriaName을 키값으로 캐싱하여 cafeteriaId 값을 찾는다.") -// public void checkCacheData() { -// // given -// int campusId = 1; -// String cafeteriaName = "교직원식당"; -// int expectedCafeteriaId = 4; -// String expectedCacheKey = "cafeteridId::" + campusId + "::" + cafeteriaName; // 캐싱 키 예상값 -// -// // Mock 설정: DB 조회 시 특정 값 반환하도록 설정 -// Mockito.when(cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId)).thenReturn(Optional.of(expectedCafeteriaId)); -// -// // when: 첫 번째 호출 (DB 조회 발생 후 Redis에 캐싱됨) -// int cafeteriaId = cafeteriaServiceV2.getCafeteriaId(cafeteriaName, campusId); -// -// // then: DB에서 가져온 값이 기대한 값과 같은지 확인 -// assertThat(cafeteriaId).isEqualTo(expectedCafeteriaId); -// -// // Redis에서 직접 키 조회하여 확인 -// ValueOperations valueOps = redisTemplate.opsForValue(); -// String cachedValue = valueOps.get(expectedCacheKey); -// -// assertThat(cachedValue).isNotNull(); // 캐시가 존재해야 함 -// assertThat(Integer.parseInt(cachedValue)).isEqualTo(expectedCafeteriaId); // 저장된 값이 예상한 값과 같은지 확인 -// -// // 캐시가 적용되었는지 검증: 두 번째 호출에서는 DB 조회가 발생하면 안 됨 -// int cachedCafeteriaId = cafeteriaServiceV2.getCafeteriaId(cafeteriaName, campusId); -// -// // 두 번째 호출은 캐시에서 가져와야 하므로 DB 호출이 한 번만 발생해야 함 -// verify(cafeteriaRepositoryV2, Mockito.times(1)).findCafeteriaId(cafeteriaName, campusId); -// -// // 캐시된 값과 두 번째 조회한 값이 같은지 확인 -// assertThat(cachedCafeteriaId).isEqualTo(expectedCafeteriaId); -// -// } } diff --git a/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceV2Test.java b/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceV2Test.java index 698e134..1ca2b10 100644 --- a/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceV2Test.java @@ -2,33 +2,26 @@ import com.example.Jinus.entity.cafeteria.CampusEntity; import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; -import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; import com.example.Jinus.service.v2.cafeteria.CampusServiceV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ActiveProfiles; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) -@SpringBootTest public class CampusServiceV2Test { - @Autowired + @InjectMocks private CampusServiceV2 campusServiceV2; - @MockBean + @Mock private CampusRepositoryV2 campusRepositoryV2; @Test diff --git a/src/test/java/com/example/Jinus/service/notice/CategoryServiceV2Test.java b/src/test/java/com/example/Jinus/service/notice/CategoryServiceV2Test.java new file mode 100644 index 0000000..67117b5 --- /dev/null +++ b/src/test/java/com/example/Jinus/service/notice/CategoryServiceV2Test.java @@ -0,0 +1,51 @@ +package com.example.Jinus.service.notice; + +import com.example.Jinus.entity.notice.NoticeCategoryEntity; +import com.example.Jinus.repository.v2.notice.CategoryRepositoryV2; +import com.example.Jinus.service.v2.notice.CategoryServiceV2; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + + +@ExtendWith(MockitoExtension.class) +public class CategoryServiceV2Test { + + @Mock + private CategoryRepositoryV2 noticeCategoryRepository; + @InjectMocks + private CategoryServiceV2 categoryService; + + @Test + @DisplayName("사용자 학과id와 일치하는 카테고리 찾기") + void checkGetCategoryEntityTest() { + // Given - 테스트 데이터 생성 + int departmentId = 1; + List expectedCategories = List.of( + new NoticeCategoryEntity(1, 1, "공지사항", 0, 0, 0, null), + new NoticeCategoryEntity(2, 1, "학사일정", 0, 0, 0, null) + ); + + // Mocking - 목 객체의 동작 정의 + when(noticeCategoryRepository.findCategoryListByDepartmentId(departmentId)) + .thenReturn(expectedCategories); + + // When - 서비스 호출 + List result = categoryService.getCategoryEntity(departmentId); + + // Then - 결과 검증 + assertEquals(expectedCategories.size(), result.size()); // 2개의 카테고리 반환해야 함 + assertEquals(expectedCategories, result); + // 서비스 메소드 중복 호출 방지를 위한 호출 횟수 확인 + verify(noticeCategoryRepository, times(1)) + .findCategoryListByDepartmentId(departmentId); + } +} diff --git a/src/test/java/com/example/Jinus/service/notice/NoticeCategoryServiceV2Test.java b/src/test/java/com/example/Jinus/service/notice/NoticeCategoryServiceV2Test.java deleted file mode 100644 index e6b1163..0000000 --- a/src/test/java/com/example/Jinus/service/notice/NoticeCategoryServiceV2Test.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.example.Jinus.service.notice; - -import com.example.Jinus.repository.v2.notice.CategoryRepositoryV2; -import com.example.Jinus.service.v2.notice.CategoryServiceV2; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; - -import static org.assertj.core.api.Assertions.assertThat; - - -@SpringBootTest -@ExtendWith(MockitoExtension.class) - -public class NoticeCategoryServiceV2Test { - - @Autowired - CategoryServiceV2 categoryService; - @MockBean - CategoryRepositoryV2 noticeCategoryRepository; - -// @Test -// @DisplayName("사용자 학과id와 일치하는 카테고리 찾기") -// public void checkCategoryByDepartmentId() { -// // given -// int departmentId = 1; -// List categoryList = new ArrayList<>(); -// categoryList.add(new NoticeCategoryEntity(1, 1, "취업", 12, 12, 12, "3/4")); -// categoryList.add(new NoticeCategoryEntity(2, 1, "공지", 12, 12, 12, "3/4")); -// -// // when -// Mockito.when(noticeCategoryRepository.findCategoryListByDepartmentId(departmentId)).thenReturn(categoryList); -// List> result = categoryService.getCategoryEntity(departmentId); -// -// // then -// assertThat(result).usingRecursiveComparison().isEqualTo(categoryList); -// } -} diff --git a/src/test/java/com/example/Jinus/service/notice/NoticeServiceV2Test.java b/src/test/java/com/example/Jinus/service/notice/NoticeServiceV2Test.java new file mode 100644 index 0000000..4bbdf53 --- /dev/null +++ b/src/test/java/com/example/Jinus/service/notice/NoticeServiceV2Test.java @@ -0,0 +1,139 @@ +package com.example.Jinus.service.notice; + +import com.example.Jinus.dto.response.ListItemDto; +import com.example.Jinus.entity.notice.NoticeCategoryEntity; +import com.example.Jinus.entity.notice.NoticeEntity; +import com.example.Jinus.repository.v2.notice.NoticeRepositoryV2; +import com.example.Jinus.service.v2.notice.CategoryServiceV2; +import com.example.Jinus.service.v2.notice.NoticeServiceV2; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class NoticeServiceV2Test { + + @InjectMocks + private NoticeServiceV2 noticeServiceV2; + @Mock + private CategoryServiceV2 categoryServiceV2; + @Mock + private NoticeRepositoryV2 noticeRepositoryV2; + + private List mockCategoryEntities; + private List mockNoticeEntities; + + @BeforeEach + void setUp() { + // 공지 카테고리 엔티티 Mock 데이터 생성 + mockCategoryEntities = new ArrayList<>(); + NoticeCategoryEntity category = new NoticeCategoryEntity(); + category.setId(1); + category.setMi(123); + category.setBbsId(456); + category.setCategory("학과공지"); + mockCategoryEntities.add(category); + + // 공지 엔티티 Mock 데이터 생성 + mockNoticeEntities = new ArrayList<>(); + NoticeEntity notice = new NoticeEntity(); + notice.setTitle("시험 일정 공지"); + notice.setCreatedAt("2025-03-24"); + notice.setNttSn(1001); + mockNoticeEntities.add(notice); + } + + @Test + @DisplayName("학과정보 존재하는 경우 공지리스트 반환") + void checkExistUserReturnNotice() { + // given + String departmentEng = "computer"; + int departmentId = 1; + + when(categoryServiceV2.getCategoryEntity(departmentId)).thenReturn(mockCategoryEntities); + when(noticeRepositoryV2.findNoticeListByCategoryId(1)).thenReturn(mockNoticeEntities); + + // when + String result = noticeServiceV2.existUserReturnNotice(departmentEng, departmentId); + + // then + assertNotNull(result); + assertTrue(result.contains("학과공지")); // JSON 결과에 "학과공지" 포함 확인 + verify(categoryServiceV2, times(1)).getCategoryEntity(departmentId); + } + + @Test + @DisplayName("공지가 존재하지 않는 경우") + void checkThereIsNoNoticeData() { + // given + String departmentEng = "computer"; + int departmentId = 1; + + when(categoryServiceV2.getCategoryEntity(departmentId)).thenReturn(new ArrayList<>()); + + // when + String result = noticeServiceV2.existUserReturnNotice(departmentEng, departmentId); + + // then + assertNotNull(result); + assertTrue(result.contains("최근에 등록된 공지사항이 없어!")); + } + + @Test + @DisplayName("학과 정보가 없어서 학과 등록 블록 반환") + void checkDoesNotExistUserReturnBlock() { + // when + String result = noticeServiceV2.doesNotExistUserReturnBlock(); + + // then + assertNotNull(result); + assertTrue(result.contains("학과 등록")); + assertTrue(result.contains("66cf0c8ae5715f75b254dfea")); // 블록 ID 포함 여부 확인 + } + + @Test + @DisplayName("공지 가져오기") + void checkGetNoticeList() { + // given + int categoryId = 1; + String departmentEng = "computer"; + String mi = "123"; + String bbsId = "456"; + + when(noticeRepositoryV2.findNoticeListByCategoryId(categoryId)).thenReturn(mockNoticeEntities); + + // when + List result = noticeServiceV2.getNoticeList(categoryId, mi, bbsId, departmentEng); + + // then + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals("시험 일정 공지", result.getFirst().getTitle()); + } + + @Test + @DisplayName("url 생성 테스트") + void checkNoticeDetailUrl() { + // given + String departmentEng = "computer"; + String mi = "123"; + String bbsId = "456"; + int nttSn = 1001; + + // when + String url = noticeServiceV2.noticeDetailUrl(departmentEng, mi, bbsId, nttSn); + + // then + assertEquals("https://www.gnu.ac.kr/computer/na/ntt/selectNttInfo.do?mi=123&bbsId=456&nttSn=1001", url); + } +} diff --git a/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceV2Test.java b/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceV2Test.java index 0c12791..feaa043 100644 --- a/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceV2Test.java @@ -5,20 +5,18 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) -@SpringBootTest public class DepartmentServiceV2Test { - @Autowired + @InjectMocks private DepartmentServiceV2 departmentServiceV2; - @MockBean + @Mock private DepartmentRepositoryV2 departmentRepositoryV2; @Test diff --git a/src/test/java/com/example/Jinus/service/userInfo/UserServiceV2Test.java b/src/test/java/com/example/Jinus/service/userInfo/UserServiceV2Test.java index a2bf5b4..7d323d1 100644 --- a/src/test/java/com/example/Jinus/service/userInfo/UserServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/userInfo/UserServiceV2Test.java @@ -9,25 +9,17 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ActiveProfiles; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.times; @ExtendWith(MockitoExtension.class) -@SpringBootTest public class UserServiceV2Test { - @Autowired @InjectMocks private UserServiceV2 userServiceV2; - @MockBean + @Mock private UserRepositoryV2 userRepositoryV2; @Test @@ -87,27 +79,4 @@ public void checkDoesNotExistUserDepartmentId() { // then assertThat(result).isEqualTo(-1); } - - - @Test - @DisplayName("사용자 학과 ID 캐싱 테스트") - public void testUserCampusIdCaching() { - // Given: 특정 userId에 대해 학과 ID 반환 - String userId = "user123"; - int campusId = 12; - - Mockito.when(userRepositoryV2.findCampusIdById(userId)) - .thenReturn(Optional.of(campusId)); - - // When: 첫 번째 조회 (DB에서 가져옴) - int firstCall = userServiceV2.getUserCampusId(userId); - int secondCall = userServiceV2.getUserCampusId(userId); // 캐시에서 가져와야 함 - - // Then: 두 번째 호출 시 DB 호출 없이 동일한 값이 반환되어야 함 - assertThat(firstCall).isEqualTo(12); // - assertThat(secondCall).isEqualTo(firstCall); - - // Verify: 한 번만 호출되어야 함 - Mockito.verify(userRepositoryV2, times(1)).findCampusIdById(userId); - } } From b91f4a74b3a4594281af97fe89bee86973928c13 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 27 Mar 2025 16:31:01 +0900 Subject: [PATCH 02/15] =?UTF-8?q?[Refactor]CafeteriaServiceV2=20=EB=8B=A8?= =?UTF-8?q?=EC=9D=BC=20=EC=B1=85=EC=9E=84=20=EC=9B=90=EC=B9=99=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/v2/CafeteriaControllerV2.java | 4 +- .../v2/cafeteria/CafeteriaQueryServiceV2.java | 23 +++ .../cafeteria/CafeteriaResponseServiceV2.java | 52 ++++++ .../v2/cafeteria/CafeteriaServiceV2.java | 163 +++++++++--------- .../service/v2/cafeteria/DietServiceV2.java | 6 +- 5 files changed, 166 insertions(+), 82 deletions(-) create mode 100644 src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java create mode 100644 src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaResponseServiceV2.java diff --git a/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java index cdd7280..822dad3 100644 --- a/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java @@ -22,10 +22,10 @@ public class CafeteriaControllerV2 { public String responseCafeteriaOrCampusListCard(@RequestBody RequestDto requestDto) { // userId로 campusId 찾기 String userId = requestDto.getUserRequest().getUser().getId(); - int campusId = userServiceV2.getUserCampusId(userId); + int userCampusId = userServiceV2.getUserCampusId(userId); int sysCampusId = requestDto.getAction().getClientExtra().getSys_campus_id(); - return cafeteriaServiceV2.campusOrCafeteria(campusId, sysCampusId); + return cafeteriaServiceV2.campusOrCafeteria(userCampusId, sysCampusId); } } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java new file mode 100644 index 0000000..bed0a39 --- /dev/null +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java @@ -0,0 +1,23 @@ +package com.example.Jinus.service.v2.cafeteria; + +import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CafeteriaQueryServiceV2 { + private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; + + @Cacheable(value = "cafeteriaId", key = "#campusId + '::' + #cafeteriaName", + unless = "#result == -1", + cacheManager = "contentCacheManager") + public int getCafeteriaId(String cafeteriaName, int campusId) { + return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); + } + + public String getImgUrl(int cafeteriaId) { + return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); + } +} diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaResponseServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaResponseServiceV2.java new file mode 100644 index 0000000..22bdb5c --- /dev/null +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaResponseServiceV2.java @@ -0,0 +1,52 @@ +package com.example.Jinus.service.v2.cafeteria; + +import com.example.Jinus.dto.data.CafeteriaDto; +import com.example.Jinus.dto.response.ButtonDto; +import com.example.Jinus.dto.response.ListItemDto; +import com.example.Jinus.dto.response.ResponseDto; +import com.example.Jinus.utility.JsonUtils; +import com.example.Jinus.utility.ListCardResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class CafeteriaResponseServiceV2 { + + // 식당 리스트 카드 생성 + public String createCafeteriaListCard(String campusName, List cafeteriaList) { + List listItems = mappingCafeteriaList(campusName, cafeteriaList); + ResponseDto responseDto = ListCardResponse.mappingResponseDto( + "어떤 교내 식당 정보가 알고 싶어?", listItems, mappingButtonDto() + ); + return JsonUtils.toJsonResponse(responseDto); + } + + // 식당 아이템 객체 생성 + private List mappingCafeteriaList(String campusName, List cafeteriaList) { + List listItems = new ArrayList<>(); + for (CafeteriaDto cafeteria : cafeteriaList) { + String userMessage = campusName + " " + cafeteria.getCafeteriaNameKo(); + ListItemDto listItem = new ListItemDto( + cafeteria.getCafeteriaNameKo(), campusName, + cafeteria.getThumbnailUrl(), "message", userMessage + ); + listItems.add(listItem); + } + return listItems; + } + + // 더보기 버튼 생성 + private List mappingButtonDto() { + List buttonDto = new ArrayList<>(); + Map extra = new HashMap<>(); + extra.put("sys_campus_id", -1); + buttonDto.add(new ButtonDto("더보기", "block", "66067167cdd882158c759fc2", extra)); + return buttonDto; + } +} diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java index 1a88646..7776dda 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java @@ -1,102 +1,111 @@ package com.example.Jinus.service.v2.cafeteria; import com.example.Jinus.dto.data.CafeteriaDto; -import com.example.Jinus.dto.response.ButtonDto; -import com.example.Jinus.dto.response.ListItemDto; -import com.example.Jinus.dto.response.ResponseDto; -import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; -import com.example.Jinus.utility.JsonUtils; -import com.example.Jinus.utility.ListCardResponse; import lombok.RequiredArgsConstructor; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Service @RequiredArgsConstructor public class CafeteriaServiceV2 { - private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; private final CampusServiceV2 campusServiceV2; private final CacheServiceV2 cacheServiceV2; + private final CafeteriaResponseServiceV2 cafeteriaResponseServiceV2; - - // 반환 조건 설정 - public String campusOrCafeteria(int campusId, int sysCampusId) { - // 더보기 버튼 누른 경우 - if (sysCampusId == -1) { + // 사용자가 선택한 블록 ID값에 따라 반환 조건 설정 + // campusId가 -1이면 사용자 정보가 존재하지 않는 경우임 + public String campusOrCafeteria(int userCampusId, int sysCampusId) { + if (sysCampusId == -1) { // 더보기 버튼 누른 경우 -> 캠퍼스 리스트 반환 return campusServiceV2.makeCampusListCard(); } - - // 사용자가 원하는 캠퍼스가 있을 때 - if (sysCampusId > 0) { - return makeCafeteriaListCard(sysCampusId); - } - - // 사용자가 원하는 캠퍼스가 없을 때 - return (campusId != -1) // 사용자 존재 여부 - ? makeCafeteriaListCard(campusId) - : campusServiceV2.makeCampusListCard(); + // 사용자가 캠퍼스를 선택한 경우 + int targetCampusId = (sysCampusId > 0) ? sysCampusId : userCampusId; + return (targetCampusId != -1) // 사용자 정보 DB 존재 여부 + ? returnCafeteriaListCard(targetCampusId) // 존재 O -> 식당 정보 반환 + : campusServiceV2.makeCampusListCard(); // 존재 X -> 캠퍼스 정보 반환 } - // 식당 리스트 반환 메소드 - private String makeCafeteriaListCard(int campusId) { + // 식당 리스트 반환 + private String returnCafeteriaListCard(int campusId) { String campusName = campusServiceV2.getUserCampusName(campusId); List cafeteriaList = cacheServiceV2.getCafeteriaList(campusId); - - // 식당 리스트 객체 생성 - List listItems = mappingCafeteriaList(campusName, cafeteriaList); - // response 객체 생성 - ResponseDto responseDto = ListCardResponse.mappingResponseDto("어떤 교내 식당 정보가 알고싶어 ?", listItems, mappingButtonDto()); - - return JsonUtils.toJsonResponse(responseDto); + return cafeteriaResponseServiceV2.createCafeteriaListCard(campusName, cafeteriaList); } - // 식당 리스트 객체 생성 - private List mappingCafeteriaList(String campusName, List cafeteriaList) { - List listItems = new ArrayList<>(); - for (CafeteriaDto cafeteria : cafeteriaList) { - String userMessage = campusName + " " + cafeteria.getCafeteriaNameKo(); - - // 리스트 아이템 객체 생성 - ListItemDto listItem = new ListItemDto(cafeteria.getCafeteriaNameKo(), campusName, - cafeteria.getThumbnailUrl(), "message", userMessage); - listItems.add(listItem); - } - return listItems; - } - - - // 더보기 버튼 리스트 생성 - private List mappingButtonDto() { - List buttonDto = new ArrayList<>(); - Map extra = new HashMap<>(); - extra.put("sys_campus_id", -1); - // 버튼 객체 생성 - ButtonDto button = new ButtonDto("더보기", "block", "66067167cdd882158c759fc2", extra); - buttonDto.add(button); - return buttonDto; - } - - - - @Cacheable(value = "cafeteriaId", key = "#campusId + '::' + #cafeteriaName", - unless = "#result == -1", - cacheManager = "contentCacheManager") - // 캠퍼스에 식당이 존재한다면 cafeteriaId 찾기 - public int getCafeteriaId(String cafeteriaName, int campusId) { - return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); - } - - - // 식당 imgUrl 찾기 - public String getImgUrl(int cafeteriaId) { - return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); - } +// // 반환 조건 설정 +// public String campusOrCafeteria(int campusId, int sysCampusId) { +// // 더보기 버튼 누른 경우 +// if (sysCampusId == -1) { +// return campusServiceV2.makeCampusListCard(); +// } +// +// // 사용자가 원하는 캠퍼스가 있을 때 +// if (sysCampusId > 0) { +// return makeCafeteriaListCard(sysCampusId); +// } +// +// // 사용자가 원하는 캠퍼스가 없을 때 +// return (campusId != -1) // 사용자 존재 여부 +// ? makeCafeteriaListCard(campusId) +// : campusServiceV2.makeCampusListCard(); +// } +// +// // 식당 리스트 반환 메소드 +// private String makeCafeteriaListCard(int campusId) { +// String campusName = campusServiceV2.getUserCampusName(campusId); +// List cafeteriaList = cacheServiceV2.getCafeteriaList(campusId); +// +// // 식당 리스트 객체 생성 +// List listItems = mappingCafeteriaList(campusName, cafeteriaList); +// // response 객체 생성 +// ResponseDto responseDto = ListCardResponse.mappingResponseDto("어떤 교내 식당 정보가 알고싶어 ?", listItems, mappingButtonDto()); +// +// return JsonUtils.toJsonResponse(responseDto); +// } +// +// +// // 식당 리스트 객체 생성 +// private List mappingCafeteriaList(String campusName, List cafeteriaList) { +// List listItems = new ArrayList<>(); +// for (CafeteriaDto cafeteria : cafeteriaList) { +// String userMessage = campusName + " " + cafeteria.getCafeteriaNameKo(); +// +// // 리스트 아이템 객체 생성 +// ListItemDto listItem = new ListItemDto(cafeteria.getCafeteriaNameKo(), campusName, +// cafeteria.getThumbnailUrl(), "message", userMessage); +// listItems.add(listItem); +// } +// return listItems; +// } +// +// +// // 더보기 버튼 리스트 생성 +// private List mappingButtonDto() { +// List buttonDto = new ArrayList<>(); +// Map extra = new HashMap<>(); +// extra.put("sys_campus_id", -1); +// // 버튼 객체 생성 +// ButtonDto button = new ButtonDto("더보기", "block", "66067167cdd882158c759fc2", extra); +// buttonDto.add(button); +// return buttonDto; +// } +// +// +// +// @Cacheable(value = "cafeteriaId", key = "#campusId + '::' + #cafeteriaName", +// unless = "#result == -1", +// cacheManager = "contentCacheManager") +// // 캠퍼스에 식당이 존재한다면 cafeteriaId 찾기 +// public int getCafeteriaId(String cafeteriaName, int campusId) { +// return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); +// } +// +// +// // 식당 imgUrl 찾기 +// public String getImgUrl(int cafeteriaId) { +// return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); +// } } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index 641ce81..23f3b22 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -31,9 +31,9 @@ public class DietServiceV2 { private final DietRepositoryV2 dietRepositoryV2; private final CampusServiceV2 campusServiceV2; - private final CafeteriaServiceV2 cafeteriaServiceV2; private final UserServiceV2 userServiceV2; private final CacheServiceV2 dietCacheServiceV2; + private final CafeteriaQueryServiceV2 queryServiceV2; // 식단 데이터 찾기 위해 필요한 파라미터 추출 및 초기화 public String requestHandler(RequestDto requestDto) { @@ -70,7 +70,7 @@ private Optional extractValue(DetailParamsItemFieldDto fieldDto) { // response 생성 로직 private String makeResponse(HandleRequestDto parameters) { int campusId = campusServiceV2.getCampusId(parameters.getCampusName()); - int cafeteriaId = cafeteriaServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); + int cafeteriaId = queryServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); // 캠퍼스에 식당이 존재하지 않는 경우 if (cafeteriaId == -1) { @@ -144,7 +144,7 @@ private StringBuilder processDietList(MultiValueMap dietList) { // 응답 내용 초기화 private String makeContents(HandleRequestDto parameters, int cafeteriaId, String diets) { // 식당 img 찾기 - String imgUrl = cafeteriaServiceV2.getImgUrl(cafeteriaId); + String imgUrl = queryServiceV2.getImgUrl(cafeteriaId); // title 데이터 연결 String title = "\uD83C\uDF71 " + From f19aa3dc49b91a1115600dd9538f21f0506cf58b Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 27 Mar 2025 17:02:48 +0900 Subject: [PATCH 03/15] Update Java CI-CD.yml dependency submission code removed --- .github/workflows/Java CI-CD.yml | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/.github/workflows/Java CI-CD.yml b/.github/workflows/Java CI-CD.yml index 02ceed8..8dcc546 100644 --- a/.github/workflows/Java CI-CD.yml +++ b/.github/workflows/Java CI-CD.yml @@ -1,10 +1,3 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle - name: Java CI with Gradle on: @@ -83,23 +76,3 @@ jobs: run: |- echo '${{ steps.compute-ssh.outputs.stdout }}' echo '${{ steps.compute-ssh.outputs.stderr }}' - - - dependency-submission: - - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'temurin' - - # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies. - # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md - - name: Generate and submit dependency graph - uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 From dd851d2deadeea00fcc1bebb99c3748c68edbb1c Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 27 Mar 2025 17:23:47 +0900 Subject: [PATCH 04/15] =?UTF-8?q?[Refactor]CampusServiceV2=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/cafeteria/CafeteriaServiceV2.java | 80 +------------------ .../v2/cafeteria/CampusResponseServiceV2.java | 47 +++++++++++ .../service/v2/cafeteria/CampusServiceV2.java | 35 -------- 3 files changed, 50 insertions(+), 112 deletions(-) create mode 100644 src/main/java/com/example/Jinus/service/v2/cafeteria/CampusResponseServiceV2.java diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java index 69ec74a..b251997 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java @@ -11,6 +11,7 @@ public class CafeteriaServiceV2 { private final CampusServiceV2 campusServiceV2; + private final CampusResponseServiceV2 campusResponseServiceV2; private final CacheServiceV2 cacheServiceV2; private final CafeteriaResponseServiceV2 cafeteriaResponseServiceV2; @@ -18,13 +19,13 @@ public class CafeteriaServiceV2 { // campusId가 -1이면 사용자 정보가 존재하지 않는 경우임 public String campusOrCafeteria(int userCampusId, int sysCampusId) { if (sysCampusId == -1) { // 더보기 버튼 누른 경우 -> 캠퍼스 리스트 반환 - return campusServiceV2.makeCampusListCard(); + return campusResponseServiceV2.makeCampusListCard(); } // 사용자가 캠퍼스를 선택한 경우 int targetCampusId = (sysCampusId > 0) ? sysCampusId : userCampusId; return (targetCampusId != -1) // 사용자 정보 DB 존재 여부 ? returnCafeteriaListCard(targetCampusId) // 존재 O -> 식당 정보 반환 - : campusServiceV2.makeCampusListCard(); // 존재 X -> 캠퍼스 정보 반환 + : campusResponseServiceV2.makeCampusListCard(); // 존재 X -> 캠퍼스 정보 반환 } // 식당 리스트 반환 @@ -33,79 +34,4 @@ private String returnCafeteriaListCard(int campusId) { List cafeteriaList = cacheServiceV2.getCafeteriaList(campusId); return cafeteriaResponseServiceV2.createCafeteriaListCard(campusName, cafeteriaList); } - -// // 반환 조건 설정 -// public String campusOrCafeteria(int campusId, int sysCampusId) { -// // 더보기 버튼 누른 경우 -// if (sysCampusId == -1) { -// return campusServiceV2.makeCampusListCard(); -// } -// -// // 사용자가 원하는 캠퍼스가 있을 때 -// if (sysCampusId > 0) { -// return makeCafeteriaListCard(sysCampusId); -// } -// -// // 사용자가 원하는 캠퍼스가 없을 때 -// return (campusId != -1) // 사용자 존재 여부 -// ? makeCafeteriaListCard(campusId) -// : campusServiceV2.makeCampusListCard(); -// } -// -// // 식당 리스트 반환 메소드 -// private String makeCafeteriaListCard(int campusId) { -// String campusName = campusServiceV2.getUserCampusName(campusId); -// List cafeteriaList = cacheServiceV2.getCafeteriaList(campusId); -// -// // 식당 리스트 객체 생성 -// List listItems = mappingCafeteriaList(campusName, cafeteriaList); -// // response 객체 생성 -// ResponseDto responseDto = ListCardResponse.mappingResponseDto("어떤 교내 식당 정보가 알고싶어 ?", listItems, mappingButtonDto()); -// -// return JsonUtils.toJsonResponse(responseDto); -// } -// -// -// // 식당 리스트 객체 생성 -// private List mappingCafeteriaList(String campusName, List cafeteriaList) { -// List listItems = new ArrayList<>(); -// for (CafeteriaDto cafeteria : cafeteriaList) { -// String userMessage = campusName + " " + cafeteria.getCafeteriaNameKo(); -// -// // 리스트 아이템 객체 생성 -// ListItemDto listItem = new ListItemDto(cafeteria.getCafeteriaNameKo(), campusName, -// cafeteria.getThumbnailUrl(), "message", userMessage); -// listItems.add(listItem); -// } -// return listItems; -// } -// -// -// // 더보기 버튼 리스트 생성 -// private List mappingButtonDto() { -// List buttonDto = new ArrayList<>(); -// Map extra = new HashMap<>(); -// extra.put("sys_campus_id", -1); -// // 버튼 객체 생성 -// ButtonDto button = new ButtonDto("더보기", "block", "66067167cdd882158c759fc2", extra); -// buttonDto.add(button); -// return buttonDto; -// } -// -// -// -// @Cacheable(value = "cafeteriaId", key = "#campusId + '::' + #cafeteriaName", -// unless = "#result == -1", -// cacheManager = "contentCacheManager") -// // 캠퍼스에 식당이 존재한다면 cafeteriaId 찾기 -// public int getCafeteriaId(String cafeteriaName, int campusId) { -// return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); -// } -// -// -// // 식당 imgUrl 찾기 -// public String getImgUrl(int cafeteriaId) { -// return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); -// } - } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusResponseServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusResponseServiceV2.java new file mode 100644 index 0000000..efb3b0f --- /dev/null +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusResponseServiceV2.java @@ -0,0 +1,47 @@ +package com.example.Jinus.service.v2.cafeteria; + +import com.example.Jinus.dto.response.ListItemDto; +import com.example.Jinus.dto.response.ResponseDto; +import com.example.Jinus.entity.cafeteria.CampusEntity; +import com.example.Jinus.utility.JsonUtils; +import com.example.Jinus.utility.ListCardResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class CampusResponseServiceV2 { + + private final CampusServiceV2 campusServiceV2; + + // 캠퍼스 리스트 반환 메소드 + public String makeCampusListCard() { + List campusList = campusServiceV2.getCampusList(); + // 캠퍼스 리스트 객체 생성 + List listItems = mappingCampusList(campusList); + // response 객체 생성 + ResponseDto responseDto = ListCardResponse.mappingResponseDto("어떤 캠퍼스 식당 정보가 궁금해 ?", listItems, null); + return JsonUtils.toJsonResponse(responseDto); + } + + // 캠퍼스 리스트 객체 생성 + private List mappingCampusList(List campusList) { + List listItems = new ArrayList<>(); + for (CampusEntity campus : campusList) { + String campusName = campus.getCampusNameKo(); + String imageUrl = campus.getThumbnailUrl(); + Map extra = new HashMap<>(); + extra.put("sys_campus_id", campus.getId()); + + // 캠퍼스 아이템 객체 생성 + ListItemDto listItem = new ListItemDto(campusName, imageUrl, "block", "66067167cdd882158c759fc2", extra); + listItems.add(listItem); + } + return listItems; + } +} diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java index eb61f20..4f4e938 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java @@ -1,18 +1,11 @@ package com.example.Jinus.service.v2.cafeteria; -import com.example.Jinus.dto.response.ListItemDto; -import com.example.Jinus.dto.response.ResponseDto; import com.example.Jinus.entity.cafeteria.CampusEntity; import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; -import com.example.Jinus.utility.JsonUtils; -import com.example.Jinus.utility.ListCardResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Service @RequiredArgsConstructor @@ -34,32 +27,4 @@ public List getCampusList() { public int getCampusId(String campusName) { return campusRepositoryV2.findCampusIdByName(campusName); } - - // 캠퍼스 리스트 반환 메소드 - public String makeCampusListCard() { - List campusList = getCampusList(); - - // 캠퍼스 리스트 객체 생성 - List listItems = mappingCampusList(campusList); - // response 객체 생성 - ResponseDto responseDto = ListCardResponse.mappingResponseDto("어떤 캠퍼스 식당 정보가 궁금해 ?", listItems, null); - - return JsonUtils.toJsonResponse(responseDto); - } - - // 캠퍼스 리스트 객체 생성 - private List mappingCampusList(List campusList) { - List listItems = new ArrayList<>(); - for (CampusEntity campus : campusList) { - String campusName = campus.getCampusNameKo(); - String imageUrl = campus.getThumbnailUrl(); - Map extra = new HashMap<>(); - extra.put("sys_campus_id", campus.getId()); - - // 캠퍼스 아이템 객체 생성 - ListItemDto listItem = new ListItemDto(campusName, imageUrl, "block", "66067167cdd882158c759fc2", extra); - listItems.add(listItem); - } - return listItems; - } } From fbca9f391baa188db5a1c21584e7a82536b57da6 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 27 Mar 2025 18:06:58 +0900 Subject: [PATCH 05/15] =?UTF-8?q?[Refactor]DietServiceV2=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/cafeteria/DietParameterServiceV2.java | 91 ++++++++ .../v2/cafeteria/DietQueryServiceV2.java | 72 ++++++ .../v2/cafeteria/DietResponseServiceV2.java | 68 ++++++ .../service/v2/cafeteria/DietServiceV2.java | 212 ++---------------- 4 files changed, 244 insertions(+), 199 deletions(-) create mode 100644 src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java create mode 100644 src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java create mode 100644 src/main/java/com/example/Jinus/service/v2/cafeteria/DietResponseServiceV2.java diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java new file mode 100644 index 0000000..60d5139 --- /dev/null +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java @@ -0,0 +1,91 @@ +package com.example.Jinus.service.v2.cafeteria; + +import com.example.Jinus.dto.data.HandleRequestDto; +import com.example.Jinus.dto.request.DetailParamsItemFieldDto; +import com.example.Jinus.dto.request.RequestDto; +import com.example.Jinus.service.v2.userInfo.UserServiceV2; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.sql.Date; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class DietParameterServiceV2 { + + private final UserServiceV2 userServiceV2; + private final CampusServiceV2 campusServiceV2; + + // 요청 파라미터 객체 생성 + public HandleRequestDto setParameters(String kakaoId, LocalTime time, RequestDto requestDto) { + // 요청 필수 파라미터 추출 + String cafeteriaName = requestDto.getAction().getParams().getSys_cafeteria_name(); + + // DetailParams에서 일반 파라미터 추출 및 초기화(null 체크 포함) + String campusNameValue = extractValue(requestDto.getAction().getDetailParams().getSys_campus_name()) + .orElseGet(() -> getCampusName(kakaoId)); + String dayValue = extractValue(requestDto.getAction().getDetailParams().getSys_date()) + .orElseGet(() -> getDay(time)); + String periodValue = extractValue(requestDto.getAction().getDetailParams().getSys_time_period()) + .orElseGet(() -> getPeriodOfDay(time)); + + // 오늘, 내일 문자열로 날짜 생성 + Date dietDate = getCurrentDate(dayValue); + // 요청 파라미터 객체 생성 + return new HandleRequestDto(kakaoId, campusNameValue, dayValue, periodValue, cafeteriaName, dietDate); + } + + // 일반 파라미터가 null인 경우 기본값 설정 + private Optional extractValue(DetailParamsItemFieldDto fieldDto) { + return Optional.ofNullable(fieldDto).map(DetailParamsItemFieldDto::getValue); + } + + // 일반 파라미터 값 채우기 + // sys_campus_name 파라미터 초기화 + private String getCampusName(String kakaoId) { + // 학과 등록 여부 확인 + int campusId = userServiceV2.getUserCampusId(kakaoId); + // 학과 등록한 경우 campusId가 존재함 + if (campusId != -1) { + return campusServiceV2.getUserCampusName(campusId); + } else { // 학과 등록 안한 경우 + return "가좌캠퍼스"; + } + } + + // sys_date 파라미터 초기화 - 시간 범위에 따라 오늘, 내일 판별 + private String getDay(LocalTime time) { + if (time.isAfter(LocalTime.parse("00:00:00")) && time.isBefore(LocalTime.parse("19:00:00"))) { + return "오늘"; + } else { + return "내일"; + } + } + + // sys_period 파라미터 초기화 - 시간 범위에 따라 아침, 점심, 저녁을 판별 + private String getPeriodOfDay(LocalTime time) { + if (time.isAfter(LocalTime.parse("19:00:00")) || time.isBefore(LocalTime.parse("09:30:00"))) { + return "아침"; + } else if (!time.isBefore(LocalTime.parse("09:30:00")) && time.isBefore(LocalTime.parse("13:30:00"))) { + return "점심"; + } else { + return "저녁"; + } + } + + // sysDay 파라미터 값으로 조회할 날짜 찾는 함수 + private Date getCurrentDate(String sysDate) { + // 현재 날짜 + LocalDate today = LocalDate.now(); + LocalDate tomorrow = today.plusDays(1); // 하루 뒤 날짜 계산 + + if (sysDate.equals("오늘")) { + return Date.valueOf(today); + } else { // 내일 + return Date.valueOf(tomorrow); + } + } +} diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java new file mode 100644 index 0000000..8ec2634 --- /dev/null +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java @@ -0,0 +1,72 @@ +package com.example.Jinus.service.v2.cafeteria; + +import com.example.Jinus.dto.data.DietDto; +import com.example.Jinus.dto.data.HandleRequestDto; +import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.sql.Date; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +@Service +@RequiredArgsConstructor +public class DietQueryServiceV2 { + + private final CacheServiceV2 cacheServiceV2; + private final DietRepositoryV2 dietRepositoryV2; + + // 메뉴 존재 여부에 따른 반환값 처리 로직 + public String getDietResponse(HandleRequestDto parameters, int cafeteriaId) { + // 메뉴 존재하는 경우 + if (checkThereIsDiet(parameters, cafeteriaId) != -1) { + // 메뉴 찾기 + MultiValueMap dietList = getDiets(parameters, cafeteriaId); + return processDietList(dietList).toString(); + } + return "\n메뉴가 존재하지 않습니다."; // 메뉴가 없는 경우 + } + + + // 식당 메뉴 존재여부 확인 + private int checkThereIsDiet(HandleRequestDto parameters, int cafeteriaId) { + // 오늘, 내일 문자열로 날짜 설정하기 + Date dietDate = parameters.getDietDate(); + List dietDtos = + dietRepositoryV2.findDietList(dietDate, parameters.getPeriod(), cafeteriaId); + return (!dietDtos.isEmpty()) ? 1 : -1; + } + + + // 카테고리별 메뉴 리스트 생성하기 + private MultiValueMap getDiets(HandleRequestDto parameters, int cafeteriaId) { + List dietDtos = cacheServiceV2.getDietList(parameters, cafeteriaId); + MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) + + for (DietDto o : dietDtos) { + String key = (o.getDishCategory() != null) ? o.getDishCategory() + : (o.getDishType() != null) ? o.getDishType() + : "메뉴"; + + dietList.add(key, o.getDishName()); + } + return dietList; + } + + // 카테고리별 메뉴 문자열로 나열하기 + private StringBuilder processDietList(MultiValueMap dietList) { + // 키 추출 + Set keys = new TreeSet<>(dietList.keySet()); // 순서 보장 - 오름차순 + StringBuilder description = new StringBuilder(); + + for (String key : keys) { + description.append("\n[").append(key).append("]").append("\n"); + dietList.get(key).forEach(diet -> description.append(diet).append("\n")); + } + return description; + } +} diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietResponseServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietResponseServiceV2.java new file mode 100644 index 0000000..a033a1f --- /dev/null +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietResponseServiceV2.java @@ -0,0 +1,68 @@ +package com.example.Jinus.service.v2.cafeteria; + +import com.example.Jinus.dto.data.HandleRequestDto; +import com.example.Jinus.dto.response.*; +import com.example.Jinus.utility.JsonUtils; +import com.example.Jinus.utility.SimpleTextResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class DietResponseServiceV2 { + + // 응답 객체 매핑 + public String mappingResponse(HandleRequestDto parameters, String imgUrl, String title, String description) { + // imgUrl 객체 생성 + ThumbnailDto thumbnail = new ThumbnailDto(imgUrl); + + // 버튼 리스트 객체 생성 + List buttonList = List.of(new ButtonDto("공유하기", "share")); + + // 아이템 객체 생성 + BasicCardDto basicCardDto = new BasicCardDto(title, description, thumbnail, buttonList); + List outputs = List.of(new ComponentDto(basicCardDto)); + + List quickReplies = mappingQuickReply(parameters); + + TemplateDto templateDto = new TemplateDto(outputs, quickReplies); + ResponseDto responseDto = new ResponseDto("2.0", templateDto); + + return JsonUtils.toJsonResponse(responseDto); + } + + private List mappingQuickReply(HandleRequestDto parameters) { + List periods = getNextMealPeriods(parameters.getPeriod()); + return periods.stream() + .map(period -> createQuickReply(period, parameters)) + .collect(Collectors.toList()); + } + + // 현재 시간대(period)에 따라 다음 선택할 식사 시간대를 반환 + private List getNextMealPeriods(String currentPeriod) { + return switch (currentPeriod) { + case "아침" -> List.of("점심", "저녁"); + case "점심" -> List.of("아침", "저녁"); + default -> List.of("아침", "점심"); + }; + } + + // QuickReplyDto 객체를 생성하는 메서드 + private QuickReplyDto createQuickReply(String period, HandleRequestDto parameters) { + String message = String.format("%s %s %s %s 메뉴", + parameters.getCampusName(), + parameters.getCafeteriaName(), + parameters.getDay(), + period); + return new QuickReplyDto(period, "message", message); + } + + // 캠퍼스에 식당이 존재하지 않는 경우 메시지 출력 + public String errorMsgThereIsNoCafeteria() { + return SimpleTextResponse + .simpleTextResponse("식당을 찾지 못했어!\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!"); + } +} diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index 23f3b22..57f22ba 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -1,147 +1,57 @@ package com.example.Jinus.service.v2.cafeteria; -import com.example.Jinus.dto.data.DietDto; -import com.example.Jinus.dto.request.DetailParamsItemFieldDto; import com.example.Jinus.dto.data.HandleRequestDto; import com.example.Jinus.dto.request.RequestDto; -import com.example.Jinus.dto.response.*; import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; import com.example.Jinus.utility.DateUtils; -import com.example.Jinus.utility.JsonUtils; -import com.example.Jinus.utility.SimpleTextResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import java.sql.Date; -import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; -import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.TreeSet; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class DietServiceV2 { - private final DietRepositoryV2 dietRepositoryV2; + private final CampusServiceV2 campusServiceV2; - private final UserServiceV2 userServiceV2; - private final CacheServiceV2 dietCacheServiceV2; private final CafeteriaQueryServiceV2 queryServiceV2; + private final DietParameterServiceV2 parameterServiceV2; + private final DietResponseServiceV2 dietResponseServiceV2; + private final DietQueryServiceV2 dietQueryServiceV2; // 식단 데이터 찾기 위해 필요한 파라미터 추출 및 초기화 public String requestHandler(RequestDto requestDto) { String kakaoId = requestDto.getUserRequest().getUser().getId(); - // 현재 시간 파악 LocalTime time = getCurrentTime(); + // 사용자 발화에서 파라미터 추출 및 객체 생성 + HandleRequestDto parameters = parameterServiceV2.setParameters(kakaoId, time, requestDto); - // DetailParams에서 값 추출 (null 체크 포함) - String campusNameValue = extractValue(requestDto.getAction().getDetailParams().getSys_campus_name()) - .orElseGet(() -> getCampusName(kakaoId)); - String dayValue = extractValue(requestDto.getAction().getDetailParams().getSys_date()) - .orElseGet(() -> getDay(time)); - String periodValue = extractValue(requestDto.getAction().getDetailParams().getSys_time_period()) - .orElseGet(() -> getPeriodOfDay(time)); - - // 요청 필수 파라미터 추출 - String cafeteriaName = requestDto.getAction().getParams().getSys_cafeteria_name(); - // 오늘, 내일 문자열로 날짜 생성 - Date dietDate = getCurrentDate(dayValue); - // 요청 파라미터 객체 생성 - HandleRequestDto parameters = new HandleRequestDto(kakaoId, campusNameValue, dayValue, periodValue, cafeteriaName, dietDate); - - return makeResponse(parameters); + return checkIsCafeteriaInCampus(parameters); } - - // 기본값 설정 유틸 - private Optional extractValue(DetailParamsItemFieldDto fieldDto) { - return Optional.ofNullable(fieldDto).map(DetailParamsItemFieldDto::getValue); - } - - - // response 생성 로직 - private String makeResponse(HandleRequestDto parameters) { + // 식당 존재 여부에 따른 메뉴 조회 로직 + private String checkIsCafeteriaInCampus(HandleRequestDto parameters) { int campusId = campusServiceV2.getCampusId(parameters.getCampusName()); int cafeteriaId = queryServiceV2.getCafeteriaId(parameters.getCafeteriaName(), campusId); // 캠퍼스에 식당이 존재하지 않는 경우 if (cafeteriaId == -1) { - return errorMsgThereIsNoCafeteria(); + return dietResponseServiceV2.errorMsgThereIsNoCafeteria(); } - // 캠퍼스에 식당이 존재하는 경우 - String diets = getDietResponse(parameters, cafeteriaId); + String diets = dietQueryServiceV2.getDietResponse(parameters, cafeteriaId); return makeContents(parameters, cafeteriaId, diets); } - // 메뉴 존재 여부 확인 - private String getDietResponse(HandleRequestDto parameters, int cafeteriaId) { - // 메뉴 존재하는 경우 - if (checkThereIsDiet(parameters, cafeteriaId) != -1) { - // 메뉴 찾기 - MultiValueMap dietList = getDiets(parameters, cafeteriaId); - return processDietList(dietList).toString(); - } - return "\n메뉴가 존재하지 않습니다."; // 메뉴가 없는 경우 - } - - - // 캠퍼스에 식당이 존재하지 않는 경우 메시지 출력 - private String errorMsgThereIsNoCafeteria() { - return SimpleTextResponse - .simpleTextResponse("식당을 찾지 못했어!\n어떤 캠퍼스에 있는 식당인지 정확히 알려줘!"); - } - - - // 식당 메뉴 존재여부 확인 - private int checkThereIsDiet(HandleRequestDto parameters, int cafeteriaId) { - // 오늘, 내일 문자열로 날짜 설정하기 - Date dietDate = parameters.getDietDate(); - List dietDtos = - dietRepositoryV2.findDietList(dietDate, parameters.getPeriod(), cafeteriaId); - return (!dietDtos.isEmpty()) ? 1 : -1; - } - - - // 카테고리별 메뉴 리스트 생성하기 - private MultiValueMap getDiets(HandleRequestDto parameters, int cafeteriaId) { - List dietDtos = dietCacheServiceV2.getDietList(parameters, cafeteriaId); - MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) - - for (DietDto o : dietDtos) { - String key = (o.getDishCategory() != null) ? o.getDishCategory() - : (o.getDishType() != null) ? o.getDishType() - : "메뉴"; - - dietList.add(key, o.getDishName()); - } - return dietList; - } - - - // 카테고리별 메뉴 문자열로 나열하기 - private StringBuilder processDietList(MultiValueMap dietList) { - // 키 추출 - Set keys = new TreeSet<>(dietList.keySet()); // 순서 보장 - 오름차순 - StringBuilder description = new StringBuilder(); - - for (String key : keys) { - description.append("\n[").append(key).append("]").append("\n"); - dietList.get(key).forEach(diet -> description.append(diet).append("\n")); - } - return description; - } - - // 응답 내용 초기화 + // 응답 내용 생성 private String makeContents(HandleRequestDto parameters, int cafeteriaId, String diets) { // 식당 img 찾기 String imgUrl = queryServiceV2.getImgUrl(cafeteriaId); @@ -159,91 +69,9 @@ private String makeContents(HandleRequestDto parameters, int cafeteriaId, String String description = dietDate + "(" + day + ") " + parameters.getPeriod() + "\n" + diets; - return mappingResponse(parameters, imgUrl, title, description); + return dietResponseServiceV2.mappingResponse(parameters, imgUrl, title, description); } - // 응답 객체 매핑 - private String mappingResponse(HandleRequestDto parameters, String imgUrl, String title, String description) { - // imgUrl 객체 생성 - ThumbnailDto thumbnail = new ThumbnailDto(imgUrl); - - // 버튼 리스트 객체 생성 - List buttonList = List.of(new ButtonDto("공유하기", "share")); - - // 아이템 객체 생성 - BasicCardDto basicCardDto = new BasicCardDto(title, description, thumbnail, buttonList); - List outputs = List.of(new ComponentDto(basicCardDto)); - - List quickReplies = mappingQuickReply(parameters); - - TemplateDto templateDto = new TemplateDto(outputs, quickReplies); - ResponseDto responseDto = new ResponseDto("2.0", templateDto); - - return JsonUtils.toJsonResponse(responseDto); - } - - - private List mappingQuickReply(HandleRequestDto parameters) { - List periods = getNextMealPeriods(parameters.getPeriod()); - return periods.stream() - .map(period -> createQuickReply(period, parameters)) - .collect(Collectors.toList()); - } - - - // 현재 시간대(period)에 따라 다음 선택할 식사 시간대를 반환 - private List getNextMealPeriods(String currentPeriod) { - return switch (currentPeriod) { - case "아침" -> List.of("점심", "저녁"); - case "점심" -> List.of("아침", "저녁"); - default -> List.of("아침", "점심"); - }; - } - - - // QuickReplyDto 객체를 생성하는 메서드 - private QuickReplyDto createQuickReply(String period, HandleRequestDto parameters) { - String message = String.format("%s %s %s %s 메뉴", - parameters.getCampusName(), - parameters.getCafeteriaName(), - parameters.getDay(), - period); - return new QuickReplyDto(period, "message", message); - } - - - // 일반 파라미터 값 채우기 - // sys_campus_name 파라미터 초기화 - private String getCampusName(String kakaoId) { - // 학과 등록 여부 확인 - int campusId = userServiceV2.getUserCampusId(kakaoId); - // 학과 등록한 경우 campusId가 존재함 - if (campusId != -1) { - return campusServiceV2.getUserCampusName(campusId); - } else { // 학과 등록 안한 경우 - return "가좌캠퍼스"; - } - } - - // sys_date 파라미터 초기화 - 시간 범위에 따라 오늘, 내일 판별 - private String getDay(LocalTime time) { - if (time.isAfter(LocalTime.parse("00:00:00")) && time.isBefore(LocalTime.parse("19:00:00"))) { - return "오늘"; - } else { - return "내일"; - } - } - - // sys_period 파라미터 초기화 - 시간 범위에 따라 아침, 점심, 저녁을 판별 - private String getPeriodOfDay(LocalTime time) { - if (time.isAfter(LocalTime.parse("19:00:00")) || time.isBefore(LocalTime.parse("09:30:00"))) { - return "아침"; - } else if (!time.isBefore(LocalTime.parse("09:30:00")) && time.isBefore(LocalTime.parse("13:30:00"))) { - return "점심"; - } else { - return "저녁"; - } - } // 현재 시간 출력 함수 private LocalTime getCurrentTime() { @@ -253,18 +81,4 @@ private LocalTime getCurrentTime() { return LocalTime.parse(timeSplit[0]); } - - - // sysDay 파라미터 값으로 조회할 날짜 찾는 함수 - private Date getCurrentDate(String sysDate) { - // 현재 날짜 - LocalDate today = LocalDate.now(); - LocalDate tomorrow = today.plusDays(1); // 하루 뒤 날짜 계산 - - if (sysDate.equals("오늘")) { - return Date.valueOf(today); - } else { // 내일 - return Date.valueOf(tomorrow); - } - } } From e70e82bb144ae86654ec3a01cb8216564b6cf116 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 17 Apr 2025 14:37:42 +0900 Subject: [PATCH 06/15] =?UTF-8?q?[fix]Cafeteria=20Cacheable=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/Jinus/controller/v2/NoticeControllerV2.java | 4 ---- .../Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java index 1f653f1..dd47949 100644 --- a/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java @@ -4,9 +4,7 @@ import com.example.Jinus.service.v2.notice.NoticeServiceV2; import com.example.Jinus.service.v2.userInfo.DepartmentServiceV2; import com.example.Jinus.service.v2.userInfo.UserServiceV2; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,8 +18,6 @@ public class NoticeControllerV2 { private final NoticeServiceV2 noticeServiceV2; private final DepartmentServiceV2 departmentServiceV2; private final UserServiceV2 userServiceV2; - @Autowired - private ObjectMapper objectMapper; // 학교 공지사항 조회 @PostMapping("/v2/main-notice") diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java index bed0a39..305f4fa 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java @@ -10,9 +10,9 @@ public class CafeteriaQueryServiceV2 { private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; - @Cacheable(value = "cafeteriaId", key = "#campusId + '::' + #cafeteriaName", - unless = "#result == -1", - cacheManager = "contentCacheManager") +// @Cacheable(value = "cafeteriaId", key = "#campusId + '::' + #cafeteriaName", +// unless = "#result == -1", +// cacheManager = "contentCacheManager") public int getCafeteriaId(String cafeteriaName, int campusId) { return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); } From 00f353217bf4a05fa8cb78a4ec01ef0a2a6ed1b5 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 18 Apr 2025 01:31:21 +0900 Subject: [PATCH 07/15] =?UTF-8?q?[Refactor]=EC=BA=90=EC=8B=9C=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20=EB=B0=8F=20=EC=A4=91=EB=B3=B5=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jinus/config/RedisCacheManager.java | 39 ++++++++++----- .../Jinus/config/RestTemplateConfig.java | 28 ----------- .../Jinus/controller/v2/DietControllerV2.java | 2 + .../service/v2/cafeteria/CacheServiceV2.java | 49 ++++++++++++++----- .../v2/cafeteria/CafeteriaQueryServiceV2.java | 14 ++++-- .../service/v2/cafeteria/CampusServiceV2.java | 12 ++++- .../v2/cafeteria/DietParameterServiceV2.java | 2 + .../v2/cafeteria/DietQueryServiceV2.java | 21 +++----- .../service/v2/cafeteria/DietServiceV2.java | 6 +-- .../service/v2/userInfo/UserServiceV2.java | 2 + 10 files changed, 102 insertions(+), 73 deletions(-) delete mode 100644 src/main/java/com/example/Jinus/config/RestTemplateConfig.java diff --git a/src/main/java/com/example/Jinus/config/RedisCacheManager.java b/src/main/java/com/example/Jinus/config/RedisCacheManager.java index c01fc88..7fa82d9 100644 --- a/src/main/java/com/example/Jinus/config/RedisCacheManager.java +++ b/src/main/java/com/example/Jinus/config/RedisCacheManager.java @@ -21,37 +21,53 @@ public class RedisCacheManager { public CacheManager contentCacheManager(RedisConnectionFactory cf) { Map cacheConfigurations = new HashMap<>(); - // 1. 식당 리스트 캐시 (불변 데이터, 7일 유지) + // 1. 식당 리스트 캐시 (불변 데이터, 30일 유지) cacheConfigurations.put("cafeteriaList", RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key Serializer .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer - .entryTtl(Duration.ofDays(7)) // 7일 유지 + .entryTtl(Duration.ofDays(30)) .disableCachingNullValues()); // null 캐싱 방지 // 2. 식단 데이터 캐시 (하루 단위로 갱신) - cacheConfigurations.put("dietList", +// cacheConfigurations.put("dietList", +// RedisCacheConfiguration.defaultCacheConfig() +// .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key Serializer +// .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer +// .entryTtl(Duration.ofHours(12)) +// .disableCachingNullValues()); + + // 3. 캠퍼스 이름 캐시 (불변 데이터, 30일 유지) + cacheConfigurations.put("campusName", RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key Serializer .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer - .entryTtl(Duration.ofHours(12)) // 12시간 유지 - .disableCachingNullValues()); + .entryTtl(Duration.ofDays(30)) + .disableCachingNullValues()); // null 캐싱 방지 - // 3. 캠퍼스 이름별 캠퍼스 id 캐시 (불변 데이터, 7일 유지) - cacheConfigurations.put("campusName", + // 3. 식당 id 캐시 (불변 데이터, 30일 유지) + cacheConfigurations.put("cafeteriaId", RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key Serializer .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer - .entryTtl(Duration.ofDays(7)) // 7일 유지 + .entryTtl(Duration.ofDays(30)) .disableCachingNullValues()); // null 캐싱 방지 - // 3. 식당별 식당 id 캐시 (불변 데이터, 7일 유지) - cacheConfigurations.put("cafeteriaId", + // 4. 캠퍼스 id 캐시 (불변 데이터, 30일 유지) + cacheConfigurations.put("campusId", RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key Serializer .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer - .entryTtl(Duration.ofDays(7)) // 7일 유지 + .entryTtl(Duration.ofDays(30)) + .disableCachingNullValues()); // null 캐싱 방지 + + // 5. 식당 url 캐시 (불변 데이터, 30일 유지) + cacheConfigurations.put("cafeteriaUrl", + RedisCacheConfiguration.defaultCacheConfig() + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // Key Serializer + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer + .entryTtl(Duration.ofDays(30)) .disableCachingNullValues()); // null 캐싱 방지 @@ -60,4 +76,5 @@ public CacheManager contentCacheManager(RedisConnectionFactory cf) { .withInitialCacheConfigurations(cacheConfigurations) // 캐시별 설정 적용 .build(); } + } diff --git a/src/main/java/com/example/Jinus/config/RestTemplateConfig.java b/src/main/java/com/example/Jinus/config/RestTemplateConfig.java deleted file mode 100644 index b7046fc..0000000 --- a/src/main/java/com/example/Jinus/config/RestTemplateConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.Jinus.config; - -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.BufferingClientHttpRequestFactory; -import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.web.client.RestTemplate; - -import java.nio.charset.StandardCharsets; - -@Configuration -public class RestTemplateConfig { - @Bean - public RestTemplate restTemplate(RestTemplateBuilder builder) { - return builder - .requestFactory( - () -> new BufferingClientHttpRequestFactory( - new SimpleClientHttpRequestFactory() - ) - ).additionalMessageConverters( - new StringHttpMessageConverter( - StandardCharsets.UTF_8 - ) - ).build(); - } -} diff --git a/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java b/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java index 4fcdd3f..fb949c6 100644 --- a/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java @@ -4,6 +4,7 @@ import com.example.Jinus.service.v2.cafeteria.DietServiceV2; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController +@Slf4j @RequestMapping("/api/spring") @RequiredArgsConstructor public class DietControllerV2 { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CacheServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CacheServiceV2.java index 2353549..6eb741b 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CacheServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CacheServiceV2.java @@ -1,40 +1,65 @@ package com.example.Jinus.service.v2.cafeteria; +import com.example.Jinus.config.RedisConfig; import com.example.Jinus.dto.data.CafeteriaDto; import com.example.Jinus.dto.data.DietDto; import com.example.Jinus.dto.data.HandleRequestDto; import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.sql.Date; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.List; @Service +@Slf4j @RequiredArgsConstructor public class CacheServiceV2 { private final DietRepositoryV2 dietRepositoryV2; private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; + private final RedisConfig redisConfig; -// @Cacheable( -// value = "dietList", -// key = "#parameters?.dietDate?.toString() + '::' + #parameters?.period + '::' + #cafeteriaId", -// unless = "#result == null || #result.isEmpty()", -// cacheManager = "contentCacheManager" -// ) - // 식단 데이터 가져오기 public List getDietList(HandleRequestDto parameters, int cafeteriaId) { - // 오늘, 내일 문자열로 날짜 설정하기 - Date dietDate = parameters.getDietDate(); - // 식단 데이터 반환 - return dietRepositoryV2.findDietList(dietDate, parameters.getPeriod(), cafeteriaId); + String key = parameters.getDietDate() + "::" + parameters.getPeriod() + "::" + cafeteriaId; + + List cached = (List) redisConfig.redisTemplate().opsForValue().get(key); + if (cached != null) return cached; + + List result = dietRepositoryV2.findDietList(parameters.getDietDate(), parameters.getPeriod(), cafeteriaId); + + if (result != null && !result.isEmpty()) { + long ttlSeconds = calculateTtlUntilNextMidnight(parameters.getDietDate()); + redisConfig.redisTemplate().opsForValue().set(key, result, Duration.ofSeconds(ttlSeconds)); + } + + return result; + } + + // 식단 데이터 TTL 동적 생성 -> 조회 시간과 하루 뒤의 자정시간까지의 시간차이가 TTL 시간 + // 즉, 날짜가 바뀌면 만료되어야 함 + private long calculateTtlUntilNextMidnight(Date dietDate) { + LocalDateTime expireAt = dietDate.toLocalDate().plusDays(1).atStartOfDay(); // dietDate + 1일 자정 + LocalDateTime now = LocalDateTime.now(); + + Duration duration = Duration.between(now, expireAt); + long seconds = duration.getSeconds(); + + // 만약 이미 만료되었거나, 현재 시간이 더 크면 0 리턴 (저장 안 함) + return seconds > 0 ? seconds : 0; } // Redis에서 조회 (없으면 DB에서 가져옴) -// @Cacheable(value = "cafeteriaList", key = "#campusId", cacheManager = "contentCacheManager") + @Cacheable( + value = "cafeteriaList", + key = "#p0", + cacheManager = "contentCacheManager") public List getCafeteriaList(int campusId) { return cafeteriaRepositoryV2.findCafeteriaListByCampusId(campusId); } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java index 305f4fa..b974ae5 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java @@ -2,21 +2,29 @@ import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor +@Slf4j public class CafeteriaQueryServiceV2 { private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; -// @Cacheable(value = "cafeteriaId", key = "#campusId + '::' + #cafeteriaName", -// unless = "#result == -1", -// cacheManager = "contentCacheManager") + @Cacheable( + value = "cafeteriaId", + key = "#p0 + '::' + #p1", + unless = "#result == -1", + cacheManager = "contentCacheManager") public int getCafeteriaId(String cafeteriaName, int campusId) { return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); } + @Cacheable( + value = "cafeteriaUrl", + key = "#p0", + cacheManager = "contentCacheManager") public String getImgUrl(int cafeteriaId) { return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); } diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java index 4f4e938..8e4c1bc 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java @@ -3,15 +3,22 @@ import com.example.Jinus.entity.cafeteria.CampusEntity; import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.List; @Service @RequiredArgsConstructor +@Slf4j public class CampusServiceV2 { private final CampusRepositoryV2 campusRepositoryV2; + @Cacheable( + value = "campusId", + key = "#p0", + cacheManager = "contentCacheManager") // 사용자의 campusId 받아 캠퍼스 이름 찾기 public String getUserCampusName(int campusId) { return campusRepositoryV2.findCampusNameByCampusId(campusId); @@ -22,7 +29,10 @@ public List getCampusList() { return campusRepositoryV2.findCampusList(); } -// @Cacheable(value = "campusName", key = "#campusName", cacheManager = "contentCacheManager") + @Cacheable( + value = "campusName", + key = "#p0", + cacheManager = "contentCacheManager") // 캠퍼스 이름으로 id 찾기 public int getCampusId(String campusName) { return campusRepositoryV2.findCampusIdByName(campusName); diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java index 60d5139..c13a527 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java @@ -5,6 +5,7 @@ import com.example.Jinus.dto.request.RequestDto; import com.example.Jinus.service.v2.userInfo.UserServiceV2; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.sql.Date; @@ -14,6 +15,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class DietParameterServiceV2 { private final UserServiceV2 userServiceV2; diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java index 8ec2634..5cd0c6f 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java @@ -4,6 +4,7 @@ import com.example.Jinus.dto.data.HandleRequestDto; import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -15,6 +16,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class DietQueryServiceV2 { private final CacheServiceV2 cacheServiceV2; @@ -22,29 +24,20 @@ public class DietQueryServiceV2 { // 메뉴 존재 여부에 따른 반환값 처리 로직 public String getDietResponse(HandleRequestDto parameters, int cafeteriaId) { + // 메뉴 가져오기 + List dietDtos = cacheServiceV2.getDietList(parameters, cafeteriaId); // 메뉴 존재하는 경우 - if (checkThereIsDiet(parameters, cafeteriaId) != -1) { + if (!dietDtos.isEmpty()) { // 메뉴 찾기 - MultiValueMap dietList = getDiets(parameters, cafeteriaId); + MultiValueMap dietList = getDiets(dietDtos); return processDietList(dietList).toString(); } return "\n메뉴가 존재하지 않습니다."; // 메뉴가 없는 경우 } - // 식당 메뉴 존재여부 확인 - private int checkThereIsDiet(HandleRequestDto parameters, int cafeteriaId) { - // 오늘, 내일 문자열로 날짜 설정하기 - Date dietDate = parameters.getDietDate(); - List dietDtos = - dietRepositoryV2.findDietList(dietDate, parameters.getPeriod(), cafeteriaId); - return (!dietDtos.isEmpty()) ? 1 : -1; - } - - // 카테고리별 메뉴 리스트 생성하기 - private MultiValueMap getDiets(HandleRequestDto parameters, int cafeteriaId) { - List dietDtos = cacheServiceV2.getDietList(parameters, cafeteriaId); + private MultiValueMap getDiets(List dietDtos) { MultiValueMap dietList = new LinkedMultiValueMap<>(); // 중복 키 허용(값을 리스트로 반환) for (DietDto o : dietDtos) { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java index e6a4598..9439e14 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java @@ -2,20 +2,18 @@ import com.example.Jinus.dto.data.HandleRequestDto; import com.example.Jinus.dto.request.RequestDto; -import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; import com.example.Jinus.utility.DateUtils; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.util.MultiValueMap; import java.sql.Date; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; -import java.util.Set; -import java.util.TreeSet; @Service +@Slf4j @RequiredArgsConstructor public class DietServiceV2 { diff --git a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java b/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java index ae0a802..387e0b4 100644 --- a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java @@ -2,6 +2,7 @@ import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -11,6 +12,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class UserServiceV2 { private final UserRepositoryV2 userRepositoryV2; From cbd71efc1c2ef8652edd15cf3a567a68452afe02 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Mon, 21 Apr 2025 23:14:15 +0900 Subject: [PATCH 08/15] =?UTF-8?q?[fix]userService=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=ED=95=9C=20hikariCP=20connection=20error=20?= =?UTF-8?q?=EC=B0=BE=EB=8A=94=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/v2/userInfo/UserServiceV2.java | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java b/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java index 387e0b4..faa85bf 100644 --- a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java @@ -16,57 +16,6 @@ public class UserServiceV2 { private final UserRepositoryV2 userRepositoryV2; - private final RedisTemplate redisTemplate; - -// // 사용자 등록 여부 확인 -// public int getUserCampusId(String userId) { -// // redis에서 데이터 찾음 -// String key = "campusId:" + userId; -// // null값 처리 위해 Integer 사용 -// Integer campusId = (Integer) redisTemplate.opsForValue().get(key); -// System.out.println("campusId:" + campusId); -// -// // redis에 데이터 없는 경우 db 조회 -// if (campusId == null) { -// campusId = userRepositoryV2.findCampusIdById(userId).orElse(-1); -// // campusId가 -1이 아니면 캐시 저장 -// if (campusId != -1) { -// redisTemplate.opsForValue().set(key, campusId, Duration.ofDays(1)); // 1일 TTL 설정 -// } -// } -// return campusId; -// } -// -// // 사용자 학과 id 찾기 -// public int getUserDepartmentId(String userId) { -// String key = "departmentId:" + userId; -// Integer departmentId = (Integer) redisTemplate.opsForValue().get(key); -// System.out.println("departmentId:" + departmentId); -// -// if (departmentId == null) { -// departmentId = userRepositoryV2.findDepartmentIdById(userId).orElse(-1); -// // campusId가 -1이 아니면 캐시 저장 -// if (departmentId != -1) { -// redisTemplate.opsForValue().set(key, departmentId, Duration.ofDays(1)); // 1일 TTL 설정 -// } -// } -// return getParentDepartmentId(departmentId); -// } -// -// // 부모 게시판 매핑 (해당 학과 ID가 없으면 기본값 그대로 유지) -// public int getParentDepartmentId(int childDepartmentId) { -// Map parentDepartmentMap = Map.of( -// 52, 51, -// 53, 51, -// 103, 102, -// 104, 102, -// 106, 105, -// 107, 105 -// ); -// return parentDepartmentMap.getOrDefault(childDepartmentId, childDepartmentId); -// } - - public int getUserCampusId(String userId) { Optional campusId = userRepositoryV2.findCampusIdById(userId); From 0165d501b647f7dde3f0d1b3df4e7d4572360de6 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Tue, 22 Apr 2025 01:22:02 +0900 Subject: [PATCH 09/15] =?UTF-8?q?[Test]HikariCP=20=EB=A9=80=ED=8B=B0?= =?UTF-8?q?=EC=8A=A4=EB=A0=88=EB=93=9C=20=ED=99=98=EA=B2=BD=20=ED=85=8C?= =?UTF-8?q?=EC=8A=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 + .../service/v2/userInfo/UserServiceV2.java | 11 ++- .../userInfo/UserServiceHikariCPTest.java | 75 +++++++++++++++++++ .../resources/application-test.properties | 14 +++- 4 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java diff --git a/build.gradle b/build.gradle index b7bc055..b9c1a7f 100644 --- a/build.gradle +++ b/build.gradle @@ -55,6 +55,9 @@ dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + // 테스트 코드에서 Lombok 사용할 경우 필요 + testCompileOnly 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' compileOnly 'javax:javaee-api:8.0.1' // 테스트를 위한 h2 설정 diff --git a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java b/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java index faa85bf..9a331cb 100644 --- a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java +++ b/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java @@ -1,12 +1,11 @@ package com.example.Jinus.service.v2.userInfo; import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; -import java.time.Duration; import java.util.Map; import java.util.Optional; @@ -39,4 +38,12 @@ public int getUserDepartmentId(String userId) { return parentDepartmentMap.getOrDefault(departmentId, departmentId); } + // hikariCP test + @Transactional + public void selectCampusIdTest(String userId) throws InterruptedException { + log.info("selectCampusIdTest 시작 - userId: {}", userId); + Thread.sleep(2500); // 커넥션을 5초간 점유 (풀 점유 시 타임아웃 유도) + userRepositoryV2.findCampusIdById(userId); + log.info("selectCampusIdTest 종료 - userId: {}", userId); + } } diff --git a/src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java b/src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java new file mode 100644 index 0000000..91592df --- /dev/null +++ b/src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java @@ -0,0 +1,75 @@ +package com.example.Jinus.service.userInfo; + +import com.example.Jinus.service.v2.userInfo.UserServiceV2; +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.HikariPoolMXBean; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import javax.sql.DataSource; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@Slf4j +@SpringBootTest +@ActiveProfiles("test") +public class UserServiceHikariCPTest { + + @Autowired + private UserServiceV2 userService; + + @Autowired + private DataSource dataSource; + + @Test + @DisplayName("멀티스레드 10개 생성 후 id 조회") + void hikariConnectionTimeoutTest() throws InterruptedException { + int threadCount = 10; + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + CountDownLatch latch = new CountDownLatch(threadCount); + + for (int i = 0; i < threadCount; i++) { + final int userNo = i; + executor.submit(() -> { + try { + log.info(">> [{}] 서비스 호출 시작", userNo); + userService.selectCampusIdTest("user" + userNo); + log.info(">> [{}] 서비스 호출 완료", userNo); + } catch (Exception e) { + log.error(">> [{}] 예외 발생: {}", userNo, e.getMessage()); + } finally { + latch.countDown(); + } + }); + } + + // 커넥션 풀 상태 모니터링 (2초마다 찍기) + for (int i = 0; i < 5; i++) { + printHikariStatus(); + Thread.sleep(2000); + } + + latch.await(); + executor.shutdown(); + } + + private void printHikariStatus() { + if (!(dataSource instanceof HikariDataSource hikariDataSource)) { + log.warn("데이터소스는 Hikari가 아님: {}", dataSource.getClass()); + return; + } + + HikariPoolMXBean poolStats = hikariDataSource.getHikariPoolMXBean(); + log.info("### HikariCP 상태 체크 -> 총: {}, 사용 중: {}, 유휴: {}, 대기중 쓰레드: {}", + poolStats.getTotalConnections(), + poolStats.getActiveConnections(), + poolStats.getIdleConnections(), + poolStats.getThreadsAwaitingConnection() + ); + } +} diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties index 2025534..88a1479 100644 --- a/src/test/resources/application-test.properties +++ b/src/test/resources/application-test.properties @@ -1,8 +1,9 @@ # Datasource ?? spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:test +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password= +spring.datasource.type=com.zaxxer.hikari.HikariDataSource # H2 ??????? Hibernate dialect(JPA? ??? ?????? ???? ????) spring.jpa.database-platform=org.hibernate.dialect.H2Dialect @@ -14,4 +15,13 @@ spring.jpa.properties.hibernate.format_sql=true # H2 ?? ?? spring.h2.console.enabled=true -spring.h2.console.path=/h2 \ No newline at end of file +spring.h2.console.path=/h2 + +spring.datasource.hikari.maximumPoolSize=4 +spring.datasource.hikari.connectionTimeout=3000 +spring.datasource.hikari.maxLifetime=50000 +spring.datasource.hikari.idleTimeout=0 +spring.datasource.hikari.keepaliveTime=30000 +spring.datasource.hikari.validationTimeout=1000 +logging.level.com.zaxxer.hikari=trace +logging.level.com.zaxxer.hikari.HikariConfig=debug \ No newline at end of file From a5704cb4d3a892890b5f867635319795885abebb Mon Sep 17 00:00:00 2001 From: hykim02 Date: Thu, 8 May 2025 00:30:46 +0900 Subject: [PATCH 10/15] =?UTF-8?q?[Fix]=ED=8C=8C=EC=9D=BC=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...rollerV2.java => CafeteriaController.java} | 15 ++++++------- ...tControllerV2.java => DietController.java} | 8 +++---- ...ontrollerV2.java => NoticeController.java} | 16 +++++++------- .../CafeteriaRepository.java} | 5 ++--- .../CampusRepository.java} | 4 ++-- .../DietRepository.java} | 4 ++-- .../CategoryRepository.java} | 4 ++-- .../NoticeRepository.java} | 4 ++-- .../DepartmentRepository.java} | 4 ++-- .../UserRepository.java} | 4 ++-- .../CacheService.java} | 13 ++++++------ .../CafeteriaQueryService.java} | 8 +++---- .../CafeteriaResponseService.java} | 4 ++-- .../CafeteriaService.java} | 12 +++++------ .../CampusResponseService.java} | 6 +++--- .../CampusService.java} | 8 +++---- .../DietParameterService.java} | 11 +++++----- .../DietQueryService.java} | 12 +++++------ .../DietResponseService.java} | 4 ++-- .../DietService.java} | 16 +++++++------- .../CategoryService.java} | 8 +++---- .../NoticeService.java} | 10 ++++----- .../DepartmentService.java} | 8 +++---- .../UserService.java} | 8 +++---- ...Test.java => CafeteriaControllerTest.java} | 21 +++++++------------ ...Test.java => CafeteriaRepositoryTest.java} | 5 ++--- ...yV2Test.java => CampusRepositoryTest.java} | 5 ++--- ...java => NoticeCategoryRepositoryTest.java} | 5 ++--- ...yV2Test.java => NoticeRepositoryTest.java} | 5 ++--- ...Test.java => DepartmentRepostoryTest.java} | 5 ++--- ...oryV2Test.java => UserRepositoryTest.java} | 5 ++--- ...eV2Test.java => CafeteriaServiceTest.java} | 18 ++++------------ ...viceV2Test.java => CampusServiceTest.java} | 9 ++++---- ...ceV2Test.java => CategoryServiceTest.java} | 9 ++++---- ...viceV2Test.java => NoticeServiceTest.java} | 12 +++++------ ...V2Test.java => DepartmentServiceTest.java} | 9 ++++---- .../userInfo/UserServiceHikariCPTest.java | 3 +-- ...erviceV2Test.java => UserServiceTest.java} | 9 ++++---- 38 files changed, 143 insertions(+), 173 deletions(-) rename src/main/java/com/example/Jinus/controller/{v2/CafeteriaControllerV2.java => CafeteriaController.java} (65%) rename src/main/java/com/example/Jinus/controller/{v2/DietControllerV2.java => DietController.java} (76%) rename src/main/java/com/example/Jinus/controller/{v2/NoticeControllerV2.java => NoticeController.java} (79%) rename src/main/java/com/example/Jinus/repository/{v2/cafeteria/CafeteriaRepositoryV2.java => cafeteria/CafeteriaRepository.java} (88%) rename src/main/java/com/example/Jinus/repository/{v2/cafeteria/CampusRepositoryV2.java => cafeteria/CampusRepository.java} (86%) rename src/main/java/com/example/Jinus/repository/{v2/cafeteria/DietRepositoryV2.java => cafeteria/DietRepository.java} (85%) rename src/main/java/com/example/Jinus/repository/{v2/notice/CategoryRepositoryV2.java => notice/CategoryRepository.java} (77%) rename src/main/java/com/example/Jinus/repository/{v2/notice/NoticeRepositoryV2.java => notice/NoticeRepository.java} (78%) rename src/main/java/com/example/Jinus/repository/{v2/userInfo/DepartmentRepositoryV2.java => userInfo/DepartmentRepository.java} (76%) rename src/main/java/com/example/Jinus/repository/{v2/userInfo/UserRepositoryV2.java => userInfo/UserRepository.java} (84%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/CacheServiceV2.java => cafeteria/CacheService.java} (85%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/CafeteriaQueryServiceV2.java => cafeteria/CafeteriaQueryService.java} (78%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/CafeteriaResponseServiceV2.java => cafeteria/CafeteriaResponseService.java} (95%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/CafeteriaServiceV2.java => cafeteria/CafeteriaService.java} (80%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/CampusResponseServiceV2.java => cafeteria/CampusResponseService.java} (92%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/CampusServiceV2.java => cafeteria/CampusService.java} (83%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/DietParameterServiceV2.java => diet/DietParameterService.java} (92%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/DietQueryServiceV2.java => diet/DietQueryService.java} (88%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/DietResponseServiceV2.java => diet/DietResponseService.java} (96%) rename src/main/java/com/example/Jinus/service/{v2/cafeteria/DietServiceV2.java => diet/DietService.java} (85%) rename src/main/java/com/example/Jinus/service/{v2/notice/CategoryServiceV2.java => notice/CategoryService.java} (67%) rename src/main/java/com/example/Jinus/service/{v2/notice/NoticeServiceV2.java => notice/NoticeService.java} (95%) rename src/main/java/com/example/Jinus/service/{v2/userInfo/DepartmentServiceV2.java => userInfo/DepartmentService.java} (57%) rename src/main/java/com/example/Jinus/service/{v2/userInfo/UserServiceV2.java => userInfo/UserService.java} (88%) rename src/test/java/com/example/Jinus/controller/{CafeteriaControllerV2Test.java => CafeteriaControllerTest.java} (58%) rename src/test/java/com/example/Jinus/repository/cafeteria/{CafeteriaRepositoryV2Test.java => CafeteriaRepositoryTest.java} (92%) rename src/test/java/com/example/Jinus/repository/cafeteria/{CampusRepositoryV2Test.java => CampusRepositoryTest.java} (93%) rename src/test/java/com/example/Jinus/repository/notice/{NoticeCategoryRepositoryV2Test.java => NoticeCategoryRepositoryTest.java} (92%) rename src/test/java/com/example/Jinus/repository/notice/{NoticeRepositoryV2Test.java => NoticeRepositoryTest.java} (92%) rename src/test/java/com/example/Jinus/repository/userInfo/{DepartmentRepostoryV2Test.java => DepartmentRepostoryTest.java} (88%) rename src/test/java/com/example/Jinus/repository/userInfo/{UserRepositoryV2Test.java => UserRepositoryTest.java} (94%) rename src/test/java/com/example/Jinus/service/cafeteria/{CafeteriaServiceV2Test.java => CafeteriaServiceTest.java} (61%) rename src/test/java/com/example/Jinus/service/cafeteria/{CampusServiceV2Test.java => CampusServiceTest.java} (86%) rename src/test/java/com/example/Jinus/service/notice/{CategoryServiceV2Test.java => CategoryServiceTest.java} (85%) rename src/test/java/com/example/Jinus/service/notice/{NoticeServiceV2Test.java => NoticeServiceTest.java} (92%) rename src/test/java/com/example/Jinus/service/userInfo/{DepartmentServiceV2Test.java => DepartmentServiceTest.java} (74%) rename src/test/java/com/example/Jinus/service/userInfo/{UserServiceV2Test.java => UserServiceTest.java} (90%) diff --git a/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java b/src/main/java/com/example/Jinus/controller/CafeteriaController.java similarity index 65% rename from src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java rename to src/main/java/com/example/Jinus/controller/CafeteriaController.java index 8639664..545cc0b 100644 --- a/src/main/java/com/example/Jinus/controller/v2/CafeteriaControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/CafeteriaController.java @@ -1,12 +1,9 @@ -package com.example.Jinus.controller.v2; +package com.example.Jinus.controller; import com.example.Jinus.dto.request.RequestDto; -import com.example.Jinus.service.v2.cafeteria.CafeteriaServiceV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.example.Jinus.service.cafeteria.CafeteriaService; +import com.example.Jinus.service.userInfo.UserService; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -15,10 +12,10 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/spring") -public class CafeteriaControllerV2 { +public class CafeteriaController { - private final UserServiceV2 userServiceV2; - private final CafeteriaServiceV2 cafeteriaServiceV2; + private final UserService userServiceV2; + private final CafeteriaService cafeteriaServiceV2; // 사용자 존재 여부에 따라 응답 @PostMapping("/v2/cafeteria") diff --git a/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java b/src/main/java/com/example/Jinus/controller/DietController.java similarity index 76% rename from src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java rename to src/main/java/com/example/Jinus/controller/DietController.java index a4e95fa..d3b0ccf 100644 --- a/src/main/java/com/example/Jinus/controller/v2/DietControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/DietController.java @@ -1,7 +1,7 @@ -package com.example.Jinus.controller.v2; +package com.example.Jinus.controller; import com.example.Jinus.dto.request.RequestDto; -import com.example.Jinus.service.v2.cafeteria.DietServiceV2; +import com.example.Jinus.service.diet.DietService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -11,8 +11,8 @@ @RestController @RequestMapping("/api/spring") @RequiredArgsConstructor -public class DietControllerV2 { - private final DietServiceV2 dietServiceV2; +public class DietController { + private final DietService dietServiceV2; @PostMapping("/v2/dish") public String handleRequest(@RequestBody RequestDto requestDto) { diff --git a/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java b/src/main/java/com/example/Jinus/controller/NoticeController.java similarity index 79% rename from src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java rename to src/main/java/com/example/Jinus/controller/NoticeController.java index 1f653f1..12dbbe3 100644 --- a/src/main/java/com/example/Jinus/controller/v2/NoticeControllerV2.java +++ b/src/main/java/com/example/Jinus/controller/NoticeController.java @@ -1,9 +1,9 @@ -package com.example.Jinus.controller.v2; +package com.example.Jinus.controller; import com.example.Jinus.dto.request.RequestDto; -import com.example.Jinus.service.v2.notice.NoticeServiceV2; -import com.example.Jinus.service.v2.userInfo.DepartmentServiceV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; +import com.example.Jinus.service.notice.NoticeService; +import com.example.Jinus.service.userInfo.DepartmentService; +import com.example.Jinus.service.userInfo.UserService; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; @@ -15,11 +15,11 @@ @RestController @RequiredArgsConstructor @RequestMapping("/api/spring") -public class NoticeControllerV2 { +public class NoticeController { - private final NoticeServiceV2 noticeServiceV2; - private final DepartmentServiceV2 departmentServiceV2; - private final UserServiceV2 userServiceV2; + private final NoticeService noticeServiceV2; + private final DepartmentService departmentServiceV2; + private final UserService userServiceV2; @Autowired private ObjectMapper objectMapper; diff --git a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java b/src/main/java/com/example/Jinus/repository/cafeteria/CafeteriaRepository.java similarity index 88% rename from src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java rename to src/main/java/com/example/Jinus/repository/cafeteria/CafeteriaRepository.java index 72a9e2f..0bf62c4 100644 --- a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CafeteriaRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/cafeteria/CafeteriaRepository.java @@ -1,4 +1,4 @@ -package com.example.Jinus.repository.v2.cafeteria; +package com.example.Jinus.repository.cafeteria; import com.example.Jinus.dto.data.CafeteriaDto; import com.example.Jinus.entity.cafeteria.CafeteriaEntity; @@ -6,11 +6,10 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.HashMap; import java.util.List; import java.util.Optional; -public interface CafeteriaRepositoryV2 extends JpaRepository { +public interface CafeteriaRepository extends JpaRepository { // 사용자 campusId와 동일한 식당이름과 url 찾기 @Query( "SELECT new com.example.Jinus.dto.data.CafeteriaDto(c.cafeteriaNameKo, c.thumbnailUrl) " + diff --git a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CampusRepositoryV2.java b/src/main/java/com/example/Jinus/repository/cafeteria/CampusRepository.java similarity index 86% rename from src/main/java/com/example/Jinus/repository/v2/cafeteria/CampusRepositoryV2.java rename to src/main/java/com/example/Jinus/repository/cafeteria/CampusRepository.java index cebcdf5..4b901a8 100644 --- a/src/main/java/com/example/Jinus/repository/v2/cafeteria/CampusRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/cafeteria/CampusRepository.java @@ -1,4 +1,4 @@ -package com.example.Jinus.repository.v2.cafeteria; +package com.example.Jinus.repository.cafeteria; import com.example.Jinus.entity.cafeteria.CampusEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,7 +9,7 @@ import java.util.List; @Repository -public interface CampusRepositoryV2 extends JpaRepository { +public interface CampusRepository extends JpaRepository { // 사용자 campusId로 캠퍼스 이름 찾기 @Query("SELECT c.campusNameKo FROM CampusEntity c WHERE c.id = :campusId") String findCampusNameByCampusId(@Param("campusId") int campusId); diff --git a/src/main/java/com/example/Jinus/repository/v2/cafeteria/DietRepositoryV2.java b/src/main/java/com/example/Jinus/repository/cafeteria/DietRepository.java similarity index 85% rename from src/main/java/com/example/Jinus/repository/v2/cafeteria/DietRepositoryV2.java rename to src/main/java/com/example/Jinus/repository/cafeteria/DietRepository.java index 978aa4e..4787ac2 100644 --- a/src/main/java/com/example/Jinus/repository/v2/cafeteria/DietRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/cafeteria/DietRepository.java @@ -1,4 +1,4 @@ -package com.example.Jinus.repository.v2.cafeteria; +package com.example.Jinus.repository.cafeteria; import com.example.Jinus.dto.data.DietDto; import com.example.Jinus.entity.cafeteria.CafeteriaDietEntity; @@ -11,7 +11,7 @@ import java.util.List; @Repository -public interface DietRepositoryV2 extends JpaRepository { +public interface DietRepository extends JpaRepository { @Query("SELECT new com.example.Jinus.dto.data.DietDto(c.dishCategory, c.dishName, c.dishType) " + "FROM CafeteriaDietEntity c " + "WHERE c.dietDate = :dietDate " + diff --git a/src/main/java/com/example/Jinus/repository/v2/notice/CategoryRepositoryV2.java b/src/main/java/com/example/Jinus/repository/notice/CategoryRepository.java similarity index 77% rename from src/main/java/com/example/Jinus/repository/v2/notice/CategoryRepositoryV2.java rename to src/main/java/com/example/Jinus/repository/notice/CategoryRepository.java index 23e56ba..1af931c 100644 --- a/src/main/java/com/example/Jinus/repository/v2/notice/CategoryRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/notice/CategoryRepository.java @@ -1,4 +1,4 @@ -package com.example.Jinus.repository.v2.notice; +package com.example.Jinus.repository.notice; import com.example.Jinus.entity.notice.NoticeCategoryEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,7 +7,7 @@ import java.util.List; -public interface CategoryRepositoryV2 extends JpaRepository { +public interface CategoryRepository extends JpaRepository { @Query("SELECT n FROM NoticeCategoryEntity n" + " WHERE n.departmentId = :departmentId AND n.lastNttSn != 0") List findCategoryListByDepartmentId(@Param("departmentId")int departmentId); diff --git a/src/main/java/com/example/Jinus/repository/v2/notice/NoticeRepositoryV2.java b/src/main/java/com/example/Jinus/repository/notice/NoticeRepository.java similarity index 78% rename from src/main/java/com/example/Jinus/repository/v2/notice/NoticeRepositoryV2.java rename to src/main/java/com/example/Jinus/repository/notice/NoticeRepository.java index 4376317..22b7480 100644 --- a/src/main/java/com/example/Jinus/repository/v2/notice/NoticeRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/notice/NoticeRepository.java @@ -1,4 +1,4 @@ -package com.example.Jinus.repository.v2.notice; +package com.example.Jinus.repository.notice; import com.example.Jinus.entity.notice.NoticeEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,7 +7,7 @@ import java.util.List; -public interface NoticeRepositoryV2 extends JpaRepository { +public interface NoticeRepository extends JpaRepository { @Query("SELECT n FROM NoticeEntity n WHERE n.categoryId = :categoryId " + "ORDER BY n.createdAt DESC LIMIT 4") List findNoticeListByCategoryId(@Param("categoryId")int categoryId); diff --git a/src/main/java/com/example/Jinus/repository/v2/userInfo/DepartmentRepositoryV2.java b/src/main/java/com/example/Jinus/repository/userInfo/DepartmentRepository.java similarity index 76% rename from src/main/java/com/example/Jinus/repository/v2/userInfo/DepartmentRepositoryV2.java rename to src/main/java/com/example/Jinus/repository/userInfo/DepartmentRepository.java index b88985f..95a980d 100644 --- a/src/main/java/com/example/Jinus/repository/v2/userInfo/DepartmentRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/userInfo/DepartmentRepository.java @@ -1,4 +1,4 @@ -package com.example.Jinus.repository.v2.userInfo; +package com.example.Jinus.repository.userInfo; import com.example.Jinus.entity.userInfo.DepartmentEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -7,7 +7,7 @@ import org.springframework.stereotype.Repository; @Repository -public interface DepartmentRepositoryV2 extends JpaRepository { +public interface DepartmentRepository extends JpaRepository { // 학과 영문명 찾기 @Query("SELECT d.departmentEn FROM DepartmentEntity d WHERE d.id = :id") String findDepartmentEngById(@Param("id")Integer id); diff --git a/src/main/java/com/example/Jinus/repository/v2/userInfo/UserRepositoryV2.java b/src/main/java/com/example/Jinus/repository/userInfo/UserRepository.java similarity index 84% rename from src/main/java/com/example/Jinus/repository/v2/userInfo/UserRepositoryV2.java rename to src/main/java/com/example/Jinus/repository/userInfo/UserRepository.java index 9c8a138..adbf816 100644 --- a/src/main/java/com/example/Jinus/repository/v2/userInfo/UserRepositoryV2.java +++ b/src/main/java/com/example/Jinus/repository/userInfo/UserRepository.java @@ -1,4 +1,4 @@ -package com.example.Jinus.repository.v2.userInfo; +package com.example.Jinus.repository.userInfo; import com.example.Jinus.entity.userInfo.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,7 +9,7 @@ import java.util.Optional; @Repository -public interface UserRepositoryV2 extends JpaRepository { +public interface UserRepository extends JpaRepository { // 사용자 등록여부 확인(존재한다면 campusId 찾기) @Query("SELECT u.campusId FROM UserEntity u WHERE u.kakaoId = :kakaoId") Optional findCampusIdById(@Param("kakaoId") String id); diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CacheServiceV2.java b/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java similarity index 85% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/CacheServiceV2.java rename to src/main/java/com/example/Jinus/service/cafeteria/CacheService.java index 6eb741b..c2c246c 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CacheServiceV2.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java @@ -1,15 +1,14 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.cafeteria; import com.example.Jinus.config.RedisConfig; import com.example.Jinus.dto.data.CafeteriaDto; import com.example.Jinus.dto.data.DietDto; import com.example.Jinus.dto.data.HandleRequestDto; -import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; -import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; +import com.example.Jinus.repository.cafeteria.CafeteriaRepository; +import com.example.Jinus.repository.cafeteria.DietRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.sql.Date; @@ -20,9 +19,9 @@ @Service @Slf4j @RequiredArgsConstructor -public class CacheServiceV2 { - private final DietRepositoryV2 dietRepositoryV2; - private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; +public class CacheService { + private final DietRepository dietRepositoryV2; + private final CafeteriaRepository cafeteriaRepositoryV2; private final RedisConfig redisConfig; public List getDietList(HandleRequestDto parameters, int cafeteriaId) { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java similarity index 78% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java rename to src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java index b974ae5..0dcc2f0 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaQueryServiceV2.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java @@ -1,6 +1,6 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.cafeteria; -import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; +import com.example.Jinus.repository.cafeteria.CafeteriaRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; @@ -9,8 +9,8 @@ @Service @RequiredArgsConstructor @Slf4j -public class CafeteriaQueryServiceV2 { - private final CafeteriaRepositoryV2 cafeteriaRepositoryV2; +public class CafeteriaQueryService { + private final CafeteriaRepository cafeteriaRepositoryV2; @Cacheable( value = "cafeteriaId", diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaResponseServiceV2.java b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaResponseService.java similarity index 95% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaResponseServiceV2.java rename to src/main/java/com/example/Jinus/service/cafeteria/CafeteriaResponseService.java index 22bdb5c..6e4367d 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaResponseServiceV2.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaResponseService.java @@ -1,4 +1,4 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.cafeteria; import com.example.Jinus.dto.data.CafeteriaDto; import com.example.Jinus.dto.response.ButtonDto; @@ -16,7 +16,7 @@ @Service @RequiredArgsConstructor -public class CafeteriaResponseServiceV2 { +public class CafeteriaResponseService { // 식당 리스트 카드 생성 public String createCafeteriaListCard(String campusName, List cafeteriaList) { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaService.java similarity index 80% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java rename to src/main/java/com/example/Jinus/service/cafeteria/CafeteriaService.java index 532828e..2e06780 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CafeteriaServiceV2.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaService.java @@ -1,4 +1,4 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.cafeteria; import com.example.Jinus.dto.data.CafeteriaDto; import lombok.RequiredArgsConstructor; @@ -8,12 +8,12 @@ @Service @RequiredArgsConstructor -public class CafeteriaServiceV2 { +public class CafeteriaService { - private final CampusServiceV2 campusServiceV2; - private final CampusResponseServiceV2 campusResponseServiceV2; - private final CacheServiceV2 cacheServiceV2; - private final CafeteriaResponseServiceV2 cafeteriaResponseServiceV2; + private final CampusService campusServiceV2; + private final CampusResponseService campusResponseServiceV2; + private final CacheService cacheServiceV2; + private final CafeteriaResponseService cafeteriaResponseServiceV2; // 사용자가 선택한 블록 ID값에 따라 반환 조건 설정 // campusId가 -1이면 사용자 정보가 존재하지 않는 경우임 diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusResponseServiceV2.java b/src/main/java/com/example/Jinus/service/cafeteria/CampusResponseService.java similarity index 92% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/CampusResponseServiceV2.java rename to src/main/java/com/example/Jinus/service/cafeteria/CampusResponseService.java index efb3b0f..732cbed 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusResponseServiceV2.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CampusResponseService.java @@ -1,4 +1,4 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.cafeteria; import com.example.Jinus.dto.response.ListItemDto; import com.example.Jinus.dto.response.ResponseDto; @@ -15,9 +15,9 @@ @Service @RequiredArgsConstructor -public class CampusResponseServiceV2 { +public class CampusResponseService { - private final CampusServiceV2 campusServiceV2; + private final CampusService campusServiceV2; // 캠퍼스 리스트 반환 메소드 public String makeCampusListCard() { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java b/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java similarity index 83% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java rename to src/main/java/com/example/Jinus/service/cafeteria/CampusService.java index 8e4c1bc..6d4f35f 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/CampusServiceV2.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java @@ -1,7 +1,7 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.cafeteria; import com.example.Jinus.entity.cafeteria.CampusEntity; -import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; +import com.example.Jinus.repository.cafeteria.CampusRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; @@ -12,8 +12,8 @@ @Service @RequiredArgsConstructor @Slf4j -public class CampusServiceV2 { - private final CampusRepositoryV2 campusRepositoryV2; +public class CampusService { + private final CampusRepository campusRepositoryV2; @Cacheable( value = "campusId", diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java b/src/main/java/com/example/Jinus/service/diet/DietParameterService.java similarity index 92% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java rename to src/main/java/com/example/Jinus/service/diet/DietParameterService.java index c13a527..15b3829 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietParameterServiceV2.java +++ b/src/main/java/com/example/Jinus/service/diet/DietParameterService.java @@ -1,9 +1,10 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.diet; import com.example.Jinus.dto.data.HandleRequestDto; import com.example.Jinus.dto.request.DetailParamsItemFieldDto; import com.example.Jinus.dto.request.RequestDto; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; +import com.example.Jinus.service.cafeteria.CampusService; +import com.example.Jinus.service.userInfo.UserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -16,10 +17,10 @@ @Service @RequiredArgsConstructor @Slf4j -public class DietParameterServiceV2 { +public class DietParameterService { - private final UserServiceV2 userServiceV2; - private final CampusServiceV2 campusServiceV2; + private final UserService userServiceV2; + private final CampusService campusServiceV2; // 요청 파라미터 객체 생성 public HandleRequestDto setParameters(String kakaoId, LocalTime time, RequestDto requestDto) { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java b/src/main/java/com/example/Jinus/service/diet/DietQueryService.java similarity index 88% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java rename to src/main/java/com/example/Jinus/service/diet/DietQueryService.java index 5cd0c6f..0ae8d03 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietQueryServiceV2.java +++ b/src/main/java/com/example/Jinus/service/diet/DietQueryService.java @@ -1,15 +1,15 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.diet; import com.example.Jinus.dto.data.DietDto; import com.example.Jinus.dto.data.HandleRequestDto; -import com.example.Jinus.repository.v2.cafeteria.DietRepositoryV2; +import com.example.Jinus.repository.cafeteria.DietRepository; +import com.example.Jinus.service.cafeteria.CacheService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import java.sql.Date; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -17,10 +17,10 @@ @Service @RequiredArgsConstructor @Slf4j -public class DietQueryServiceV2 { +public class DietQueryService { - private final CacheServiceV2 cacheServiceV2; - private final DietRepositoryV2 dietRepositoryV2; + private final CacheService cacheServiceV2; + private final DietRepository dietRepositoryV2; // 메뉴 존재 여부에 따른 반환값 처리 로직 public String getDietResponse(HandleRequestDto parameters, int cafeteriaId) { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietResponseServiceV2.java b/src/main/java/com/example/Jinus/service/diet/DietResponseService.java similarity index 96% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/DietResponseServiceV2.java rename to src/main/java/com/example/Jinus/service/diet/DietResponseService.java index a033a1f..5f4d239 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietResponseServiceV2.java +++ b/src/main/java/com/example/Jinus/service/diet/DietResponseService.java @@ -1,4 +1,4 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.diet; import com.example.Jinus.dto.data.HandleRequestDto; import com.example.Jinus.dto.response.*; @@ -12,7 +12,7 @@ @Service @RequiredArgsConstructor -public class DietResponseServiceV2 { +public class DietResponseService { // 응답 객체 매핑 public String mappingResponse(HandleRequestDto parameters, String imgUrl, String title, String description) { diff --git a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java b/src/main/java/com/example/Jinus/service/diet/DietService.java similarity index 85% rename from src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java rename to src/main/java/com/example/Jinus/service/diet/DietService.java index 9439e14..5a6a8d0 100644 --- a/src/main/java/com/example/Jinus/service/v2/cafeteria/DietServiceV2.java +++ b/src/main/java/com/example/Jinus/service/diet/DietService.java @@ -1,7 +1,9 @@ -package com.example.Jinus.service.v2.cafeteria; +package com.example.Jinus.service.diet; import com.example.Jinus.dto.data.HandleRequestDto; import com.example.Jinus.dto.request.RequestDto; +import com.example.Jinus.service.cafeteria.CafeteriaQueryService; +import com.example.Jinus.service.cafeteria.CampusService; import com.example.Jinus.utility.DateUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,13 +17,13 @@ @Service @Slf4j @RequiredArgsConstructor -public class DietServiceV2 { +public class DietService { - private final CampusServiceV2 campusServiceV2; - private final CafeteriaQueryServiceV2 cafeteriaQueryServiceV2; - private final DietParameterServiceV2 dietParameterServiceV2; - private final DietResponseServiceV2 dietResponseServiceV2; - private final DietQueryServiceV2 dietQueryServiceV2; + private final CampusService campusServiceV2; + private final CafeteriaQueryService cafeteriaQueryServiceV2; + private final DietParameterService dietParameterServiceV2; + private final DietResponseService dietResponseServiceV2; + private final DietQueryService dietQueryServiceV2; // 식단 데이터 찾기 위해 필요한 파라미터 추출 및 초기화 public String requestHandler(RequestDto requestDto) { diff --git a/src/main/java/com/example/Jinus/service/v2/notice/CategoryServiceV2.java b/src/main/java/com/example/Jinus/service/notice/CategoryService.java similarity index 67% rename from src/main/java/com/example/Jinus/service/v2/notice/CategoryServiceV2.java rename to src/main/java/com/example/Jinus/service/notice/CategoryService.java index 9689039..90630ec 100644 --- a/src/main/java/com/example/Jinus/service/v2/notice/CategoryServiceV2.java +++ b/src/main/java/com/example/Jinus/service/notice/CategoryService.java @@ -1,7 +1,7 @@ -package com.example.Jinus.service.v2.notice; +package com.example.Jinus.service.notice; import com.example.Jinus.entity.notice.NoticeCategoryEntity; -import com.example.Jinus.repository.v2.notice.CategoryRepositoryV2; +import com.example.Jinus.repository.notice.CategoryRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -9,9 +9,9 @@ @Service @RequiredArgsConstructor -public class CategoryServiceV2 { +public class CategoryService { - private final CategoryRepositoryV2 noticeCategoryRepository; + private final CategoryRepository noticeCategoryRepository; // 사용자 학과id와 일치하는 카테고리 찾기 public List getCategoryEntity(int departmentId) { diff --git a/src/main/java/com/example/Jinus/service/v2/notice/NoticeServiceV2.java b/src/main/java/com/example/Jinus/service/notice/NoticeService.java similarity index 95% rename from src/main/java/com/example/Jinus/service/v2/notice/NoticeServiceV2.java rename to src/main/java/com/example/Jinus/service/notice/NoticeService.java index 6074534..e0bfd1d 100644 --- a/src/main/java/com/example/Jinus/service/v2/notice/NoticeServiceV2.java +++ b/src/main/java/com/example/Jinus/service/notice/NoticeService.java @@ -1,9 +1,9 @@ -package com.example.Jinus.service.v2.notice; +package com.example.Jinus.service.notice; import com.example.Jinus.dto.response.*; import com.example.Jinus.entity.notice.NoticeCategoryEntity; import com.example.Jinus.entity.notice.NoticeEntity; -import com.example.Jinus.repository.v2.notice.NoticeRepositoryV2; +import com.example.Jinus.repository.notice.NoticeRepository; import com.example.Jinus.utility.JsonUtils; import com.example.Jinus.utility.TextCardResponse; import lombok.RequiredArgsConstructor; @@ -16,10 +16,10 @@ @Service @RequiredArgsConstructor -public class NoticeServiceV2 { +public class NoticeService { - private final NoticeRepositoryV2 noticeRepositoryV2; - private final CategoryServiceV2 categoryServiceV2; + private final NoticeRepository noticeRepositoryV2; + private final CategoryService categoryServiceV2; // db에 학과정보가 있는 경우 -> 공지리스트 반환 public String existUserReturnNotice(String departmentEng, int departmentId) { diff --git a/src/main/java/com/example/Jinus/service/v2/userInfo/DepartmentServiceV2.java b/src/main/java/com/example/Jinus/service/userInfo/DepartmentService.java similarity index 57% rename from src/main/java/com/example/Jinus/service/v2/userInfo/DepartmentServiceV2.java rename to src/main/java/com/example/Jinus/service/userInfo/DepartmentService.java index 09e49ff..1f42b30 100644 --- a/src/main/java/com/example/Jinus/service/v2/userInfo/DepartmentServiceV2.java +++ b/src/main/java/com/example/Jinus/service/userInfo/DepartmentService.java @@ -1,14 +1,14 @@ -package com.example.Jinus.service.v2.userInfo; +package com.example.Jinus.service.userInfo; -import com.example.Jinus.repository.v2.userInfo.DepartmentRepositoryV2; +import com.example.Jinus.repository.userInfo.DepartmentRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor -public class DepartmentServiceV2 { +public class DepartmentService { - private final DepartmentRepositoryV2 departmentRepository; + private final DepartmentRepository departmentRepository; // 학과 영문명 찾기 public String getDepartmentEng(int departmentId) { diff --git a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java b/src/main/java/com/example/Jinus/service/userInfo/UserService.java similarity index 88% rename from src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java rename to src/main/java/com/example/Jinus/service/userInfo/UserService.java index 9a331cb..b1613c2 100644 --- a/src/main/java/com/example/Jinus/service/v2/userInfo/UserServiceV2.java +++ b/src/main/java/com/example/Jinus/service/userInfo/UserService.java @@ -1,6 +1,6 @@ -package com.example.Jinus.service.v2.userInfo; +package com.example.Jinus.service.userInfo; -import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; +import com.example.Jinus.repository.userInfo.UserRepository; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -12,9 +12,9 @@ @Service @RequiredArgsConstructor @Slf4j -public class UserServiceV2 { +public class UserService { - private final UserRepositoryV2 userRepositoryV2; + private final UserRepository userRepositoryV2; public int getUserCampusId(String userId) { Optional campusId = userRepositoryV2.findCampusIdById(userId); diff --git a/src/test/java/com/example/Jinus/controller/CafeteriaControllerV2Test.java b/src/test/java/com/example/Jinus/controller/CafeteriaControllerTest.java similarity index 58% rename from src/test/java/com/example/Jinus/controller/CafeteriaControllerV2Test.java rename to src/test/java/com/example/Jinus/controller/CafeteriaControllerTest.java index 9d1f072..1e05992 100644 --- a/src/test/java/com/example/Jinus/controller/CafeteriaControllerV2Test.java +++ b/src/test/java/com/example/Jinus/controller/CafeteriaControllerTest.java @@ -1,37 +1,32 @@ package com.example.Jinus.controller; -import com.example.Jinus.controller.v2.CafeteriaControllerV2; -import com.example.Jinus.service.v2.cafeteria.CafeteriaServiceV2; -import com.example.Jinus.service.v2.cafeteria.CampusServiceV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; +import com.example.Jinus.service.cafeteria.CafeteriaService; +import com.example.Jinus.service.cafeteria.CampusService; +import com.example.Jinus.service.userInfo.UserService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import java.util.ArrayList; import java.util.List; @ExtendWith(MockitoExtension.class) -@WebMvcTest(CafeteriaControllerV2.class) // 해당 클래스만 테스트 -public class CafeteriaControllerV2Test { +@WebMvcTest(CafeteriaController.class) // 해당 클래스만 테스트 +public class CafeteriaControllerTest { @Autowired private MockMvc mockMvc; // HTTP 요청을 모의 @MockBean - private CafeteriaServiceV2 cafeteriaServiceV2; // Service를 mock 처리 + private CafeteriaService cafeteriaServiceV2; // Service를 mock 처리 @MockBean - private CampusServiceV2 campusServiceV2; + private CampusService campusServiceV2; @MockBean - private UserServiceV2 userServiceV2; + private UserService userServiceV2; @Test @DisplayName("식당 리스트 반환") diff --git a/src/test/java/com/example/Jinus/repository/cafeteria/CafeteriaRepositoryV2Test.java b/src/test/java/com/example/Jinus/repository/cafeteria/CafeteriaRepositoryTest.java similarity index 92% rename from src/test/java/com/example/Jinus/repository/cafeteria/CafeteriaRepositoryV2Test.java rename to src/test/java/com/example/Jinus/repository/cafeteria/CafeteriaRepositoryTest.java index 8caf17d..9b5c4ab 100644 --- a/src/test/java/com/example/Jinus/repository/cafeteria/CafeteriaRepositoryV2Test.java +++ b/src/test/java/com/example/Jinus/repository/cafeteria/CafeteriaRepositoryTest.java @@ -2,7 +2,6 @@ import com.example.Jinus.dto.data.CafeteriaDto; import com.example.Jinus.entity.cafeteria.CafeteriaEntity; -import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,7 +22,7 @@ @DataJpaTest @ActiveProfiles("test") // application-test.properties 적용 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) // H2 사용 -public class CafeteriaRepositoryV2Test { +public class CafeteriaRepositoryTest { @BeforeEach void setUp() { @@ -31,7 +30,7 @@ void setUp() { cafeteriaRepositoryV2.save(cafeteriaEntity); } @Autowired - private CafeteriaRepositoryV2 cafeteriaRepositoryV2; + private CafeteriaRepository cafeteriaRepositoryV2; @Test @DisplayName("사용자 캠퍼스에 해당하는 식당리스트 찾기") diff --git a/src/test/java/com/example/Jinus/repository/cafeteria/CampusRepositoryV2Test.java b/src/test/java/com/example/Jinus/repository/cafeteria/CampusRepositoryTest.java similarity index 93% rename from src/test/java/com/example/Jinus/repository/cafeteria/CampusRepositoryV2Test.java rename to src/test/java/com/example/Jinus/repository/cafeteria/CampusRepositoryTest.java index 5219920..82071fd 100644 --- a/src/test/java/com/example/Jinus/repository/cafeteria/CampusRepositoryV2Test.java +++ b/src/test/java/com/example/Jinus/repository/cafeteria/CampusRepositoryTest.java @@ -1,7 +1,6 @@ package com.example.Jinus.repository.cafeteria; import com.example.Jinus.entity.cafeteria.CampusEntity; -import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -22,10 +21,10 @@ @DataJpaTest @ActiveProfiles("test") // application-test.properties 적용 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) // H2 사용 -public class CampusRepositoryV2Test { +public class CampusRepositoryTest { @Autowired - private CampusRepositoryV2 campusRepositoryV2; + private CampusRepository campusRepositoryV2; @BeforeEach void setUp() { diff --git a/src/test/java/com/example/Jinus/repository/notice/NoticeCategoryRepositoryV2Test.java b/src/test/java/com/example/Jinus/repository/notice/NoticeCategoryRepositoryTest.java similarity index 92% rename from src/test/java/com/example/Jinus/repository/notice/NoticeCategoryRepositoryV2Test.java rename to src/test/java/com/example/Jinus/repository/notice/NoticeCategoryRepositoryTest.java index 0ca8929..2b0dcfc 100644 --- a/src/test/java/com/example/Jinus/repository/notice/NoticeCategoryRepositoryV2Test.java +++ b/src/test/java/com/example/Jinus/repository/notice/NoticeCategoryRepositoryTest.java @@ -1,7 +1,6 @@ package com.example.Jinus.repository.notice; import com.example.Jinus.entity.notice.NoticeCategoryEntity; -import com.example.Jinus.repository.v2.notice.CategoryRepositoryV2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -22,10 +21,10 @@ @DataJpaTest @ActiveProfiles("test") // application-test.properties 적용 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) // H2 사용 -public class NoticeCategoryRepositoryV2Test { +public class NoticeCategoryRepositoryTest { @Autowired - private CategoryRepositoryV2 noticeCategoryRepository; + private CategoryRepository noticeCategoryRepository; @BeforeEach void setUp() { diff --git a/src/test/java/com/example/Jinus/repository/notice/NoticeRepositoryV2Test.java b/src/test/java/com/example/Jinus/repository/notice/NoticeRepositoryTest.java similarity index 92% rename from src/test/java/com/example/Jinus/repository/notice/NoticeRepositoryV2Test.java rename to src/test/java/com/example/Jinus/repository/notice/NoticeRepositoryTest.java index ad3c07e..97ddfed 100644 --- a/src/test/java/com/example/Jinus/repository/notice/NoticeRepositoryV2Test.java +++ b/src/test/java/com/example/Jinus/repository/notice/NoticeRepositoryTest.java @@ -1,7 +1,6 @@ package com.example.Jinus.repository.notice; import com.example.Jinus.entity.notice.NoticeEntity; -import com.example.Jinus.repository.v2.notice.NoticeRepositoryV2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -21,10 +20,10 @@ @DataJpaTest @ActiveProfiles("test") // application-test.properties 적용 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) // H2 사용 -public class NoticeRepositoryV2Test { +public class NoticeRepositoryTest { @Autowired - NoticeRepositoryV2 noticeRepositoryV2; + NoticeRepository noticeRepositoryV2; @BeforeEach void setUp() { diff --git a/src/test/java/com/example/Jinus/repository/userInfo/DepartmentRepostoryV2Test.java b/src/test/java/com/example/Jinus/repository/userInfo/DepartmentRepostoryTest.java similarity index 88% rename from src/test/java/com/example/Jinus/repository/userInfo/DepartmentRepostoryV2Test.java rename to src/test/java/com/example/Jinus/repository/userInfo/DepartmentRepostoryTest.java index ffebf90..bf0acbf 100644 --- a/src/test/java/com/example/Jinus/repository/userInfo/DepartmentRepostoryV2Test.java +++ b/src/test/java/com/example/Jinus/repository/userInfo/DepartmentRepostoryTest.java @@ -1,7 +1,6 @@ package com.example.Jinus.repository.userInfo; import com.example.Jinus.entity.userInfo.DepartmentEntity; -import com.example.Jinus.repository.v2.userInfo.DepartmentRepositoryV2; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,10 +16,10 @@ @DataJpaTest @ActiveProfiles("test") // application-test.properties 적용 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) // H2 사용 -public class DepartmentRepostoryV2Test { +public class DepartmentRepostoryTest { @Autowired - private DepartmentRepositoryV2 departmentRepository; + private DepartmentRepository departmentRepository; @Test @DisplayName("학과 영문명 찾기") diff --git a/src/test/java/com/example/Jinus/repository/userInfo/UserRepositoryV2Test.java b/src/test/java/com/example/Jinus/repository/userInfo/UserRepositoryTest.java similarity index 94% rename from src/test/java/com/example/Jinus/repository/userInfo/UserRepositoryV2Test.java rename to src/test/java/com/example/Jinus/repository/userInfo/UserRepositoryTest.java index 00591cc..e4927d2 100644 --- a/src/test/java/com/example/Jinus/repository/userInfo/UserRepositoryV2Test.java +++ b/src/test/java/com/example/Jinus/repository/userInfo/UserRepositoryTest.java @@ -1,7 +1,6 @@ package com.example.Jinus.repository.userInfo; import com.example.Jinus.entity.userInfo.UserEntity; -import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -20,7 +19,7 @@ @DataJpaTest @ActiveProfiles("test") // application-test.properties 적용 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY) // H2 사용 -public class UserRepositoryV2Test { +public class UserRepositoryTest { @BeforeEach void setUp() { @@ -29,7 +28,7 @@ void setUp() { } @Autowired - private UserRepositoryV2 userRepositoryV2; + private UserRepository userRepositoryV2; @Test @DisplayName("사용자 등록여부 확인") diff --git a/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceV2Test.java b/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceTest.java similarity index 61% rename from src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceV2Test.java rename to src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceTest.java index 2a57bbd..846f50a 100644 --- a/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/cafeteria/CafeteriaServiceTest.java @@ -1,10 +1,7 @@ package com.example.Jinus.service.cafeteria; -import com.example.Jinus.config.RedisCacheManager; import com.example.Jinus.dto.data.CafeteriaDto; -import com.example.Jinus.repository.v2.cafeteria.CafeteriaRepositoryV2; -import com.example.Jinus.service.v2.cafeteria.CacheServiceV2; -import com.example.Jinus.service.v2.cafeteria.CafeteriaServiceV2; +import com.example.Jinus.repository.cafeteria.CafeteriaRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -12,27 +9,20 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; -import static org.springframework.test.web.client.ExpectedCount.times; @ExtendWith(MockitoExtension.class) -public class CafeteriaServiceV2Test { +public class CafeteriaServiceTest { @InjectMocks - private CacheServiceV2 cacheServiceV2; + private CacheService cacheServiceV2; @Mock - private CafeteriaRepositoryV2 cafeteriaRepositoryV2; + private CafeteriaRepository cafeteriaRepositoryV2; @Test @DisplayName("사용자 캠퍼스id에 해당하는 식당리스트 찾기") diff --git a/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceV2Test.java b/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceTest.java similarity index 86% rename from src/test/java/com/example/Jinus/service/cafeteria/CampusServiceV2Test.java rename to src/test/java/com/example/Jinus/service/cafeteria/CampusServiceTest.java index 1ca2b10..f475f0d 100644 --- a/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/cafeteria/CampusServiceTest.java @@ -1,8 +1,7 @@ package com.example.Jinus.service.cafeteria; import com.example.Jinus.entity.cafeteria.CampusEntity; -import com.example.Jinus.repository.v2.cafeteria.CampusRepositoryV2; -import com.example.Jinus.service.v2.cafeteria.CampusServiceV2; +import com.example.Jinus.repository.cafeteria.CampusRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,12 +16,12 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) -public class CampusServiceV2Test { +public class CampusServiceTest { @InjectMocks - private CampusServiceV2 campusServiceV2; + private CampusService campusServiceV2; @Mock - private CampusRepositoryV2 campusRepositoryV2; + private CampusRepository campusRepositoryV2; @Test @DisplayName("사용자 캠퍼스 찾기") diff --git a/src/test/java/com/example/Jinus/service/notice/CategoryServiceV2Test.java b/src/test/java/com/example/Jinus/service/notice/CategoryServiceTest.java similarity index 85% rename from src/test/java/com/example/Jinus/service/notice/CategoryServiceV2Test.java rename to src/test/java/com/example/Jinus/service/notice/CategoryServiceTest.java index 67117b5..1e7e692 100644 --- a/src/test/java/com/example/Jinus/service/notice/CategoryServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/notice/CategoryServiceTest.java @@ -1,8 +1,7 @@ package com.example.Jinus.service.notice; import com.example.Jinus.entity.notice.NoticeCategoryEntity; -import com.example.Jinus.repository.v2.notice.CategoryRepositoryV2; -import com.example.Jinus.service.v2.notice.CategoryServiceV2; +import com.example.Jinus.repository.notice.CategoryRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,12 +16,12 @@ @ExtendWith(MockitoExtension.class) -public class CategoryServiceV2Test { +public class CategoryServiceTest { @Mock - private CategoryRepositoryV2 noticeCategoryRepository; + private CategoryRepository noticeCategoryRepository; @InjectMocks - private CategoryServiceV2 categoryService; + private CategoryService categoryService; @Test @DisplayName("사용자 학과id와 일치하는 카테고리 찾기") diff --git a/src/test/java/com/example/Jinus/service/notice/NoticeServiceV2Test.java b/src/test/java/com/example/Jinus/service/notice/NoticeServiceTest.java similarity index 92% rename from src/test/java/com/example/Jinus/service/notice/NoticeServiceV2Test.java rename to src/test/java/com/example/Jinus/service/notice/NoticeServiceTest.java index 4bbdf53..23cd712 100644 --- a/src/test/java/com/example/Jinus/service/notice/NoticeServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/notice/NoticeServiceTest.java @@ -3,9 +3,7 @@ import com.example.Jinus.dto.response.ListItemDto; import com.example.Jinus.entity.notice.NoticeCategoryEntity; import com.example.Jinus.entity.notice.NoticeEntity; -import com.example.Jinus.repository.v2.notice.NoticeRepositoryV2; -import com.example.Jinus.service.v2.notice.CategoryServiceV2; -import com.example.Jinus.service.v2.notice.NoticeServiceV2; +import com.example.Jinus.repository.notice.NoticeRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -21,14 +19,14 @@ import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) -public class NoticeServiceV2Test { +public class NoticeServiceTest { @InjectMocks - private NoticeServiceV2 noticeServiceV2; + private NoticeService noticeServiceV2; @Mock - private CategoryServiceV2 categoryServiceV2; + private CategoryService categoryServiceV2; @Mock - private NoticeRepositoryV2 noticeRepositoryV2; + private NoticeRepository noticeRepositoryV2; private List mockCategoryEntities; private List mockNoticeEntities; diff --git a/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceV2Test.java b/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceTest.java similarity index 74% rename from src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceV2Test.java rename to src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceTest.java index feaa043..4f84fa0 100644 --- a/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/userInfo/DepartmentServiceTest.java @@ -1,7 +1,6 @@ package com.example.Jinus.service.userInfo; -import com.example.Jinus.repository.v2.userInfo.DepartmentRepositoryV2; -import com.example.Jinus.service.v2.userInfo.DepartmentServiceV2; +import com.example.Jinus.repository.userInfo.DepartmentRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -13,11 +12,11 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) -public class DepartmentServiceV2Test { +public class DepartmentServiceTest { @InjectMocks - private DepartmentServiceV2 departmentServiceV2; + private DepartmentService departmentServiceV2; @Mock - private DepartmentRepositoryV2 departmentRepositoryV2; + private DepartmentRepository departmentRepositoryV2; @Test @DisplayName("학과 영문명 찾기") diff --git a/src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java b/src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java index 91592df..ab62bef 100644 --- a/src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java +++ b/src/test/java/com/example/Jinus/service/userInfo/UserServiceHikariCPTest.java @@ -1,6 +1,5 @@ package com.example.Jinus.service.userInfo; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariPoolMXBean; import lombok.extern.slf4j.Slf4j; @@ -21,7 +20,7 @@ public class UserServiceHikariCPTest { @Autowired - private UserServiceV2 userService; + private UserService userService; @Autowired private DataSource dataSource; diff --git a/src/test/java/com/example/Jinus/service/userInfo/UserServiceV2Test.java b/src/test/java/com/example/Jinus/service/userInfo/UserServiceTest.java similarity index 90% rename from src/test/java/com/example/Jinus/service/userInfo/UserServiceV2Test.java rename to src/test/java/com/example/Jinus/service/userInfo/UserServiceTest.java index 7d323d1..005142f 100644 --- a/src/test/java/com/example/Jinus/service/userInfo/UserServiceV2Test.java +++ b/src/test/java/com/example/Jinus/service/userInfo/UserServiceTest.java @@ -1,7 +1,6 @@ package com.example.Jinus.service.userInfo; -import com.example.Jinus.repository.v2.userInfo.UserRepositoryV2; -import com.example.Jinus.service.v2.userInfo.UserServiceV2; +import com.example.Jinus.repository.userInfo.UserRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -15,12 +14,12 @@ import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) -public class UserServiceV2Test { +public class UserServiceTest { @InjectMocks - private UserServiceV2 userServiceV2; + private UserService userServiceV2; @Mock - private UserRepositoryV2 userRepositoryV2; + private UserRepository userRepositoryV2; @Test @DisplayName("등록된 사용자 campusId 확인") From 4797300c83eceee4d7f831badb53d488cda21c6e Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 9 May 2025 15:35:13 +0900 Subject: [PATCH 11/15] [Feat]hikari, tomcat monitoring code --- build.gradle | 2 + .../Jinus/controller/DietController.java | 11 ++++- .../Jinus/monitor/HikariCPMonitor.java | 35 ++++++++++++++ .../Jinus/monitor/TomcatThreadMonitor.java | 47 +++++++++++++++++++ .../Jinus/service/diet/DietQueryService.java | 1 - .../service/userInfo/CollegeService.java | 7 --- .../Jinus/service/userInfo/UserService.java | 14 +++--- 7 files changed, 100 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java create mode 100644 src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java diff --git a/build.gradle b/build.gradle index b9c1a7f..9a08227 100644 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,8 @@ dependencies { // actuator implementation 'org.springframework.boot:spring-boot-starter-actuator' + implementation 'io.micrometer:micrometer-core' + implementation 'io.micrometer:micrometer-registry-prometheus' implementation 'io.sentry:sentry-spring-boot-starter-jakarta:8.3.0' implementation 'javax.enterprise:cdi-api:2.0' diff --git a/src/main/java/com/example/Jinus/controller/DietController.java b/src/main/java/com/example/Jinus/controller/DietController.java index d3b0ccf..018e08e 100644 --- a/src/main/java/com/example/Jinus/controller/DietController.java +++ b/src/main/java/com/example/Jinus/controller/DietController.java @@ -8,15 +8,22 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + @RestController @RequestMapping("/api/spring") @RequiredArgsConstructor public class DietController { - private final DietService dietServiceV2; + private final DietService dietService; + private static final Logger logger = LoggerFactory.getLogger(DietController.class); @PostMapping("/v2/dish") public String handleRequest(@RequestBody RequestDto requestDto) { - return dietServiceV2.requestHandler(requestDto); + String threadName = Thread.currentThread().getName(); + logger.info("[식단 요청] 스레드 이름: {}", threadName); + + return dietService.requestHandler(requestDto); } } diff --git a/src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java b/src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java new file mode 100644 index 0000000..f5930e4 --- /dev/null +++ b/src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java @@ -0,0 +1,35 @@ +package com.example.Jinus.monitor; + +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.HikariPoolMXBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +public class HikariCPMonitor { + + private final HikariDataSource dataSource; + + @Autowired + public HikariCPMonitor(HikariDataSource dataSource) { + this.dataSource = dataSource; + } + + @Scheduled(fixedRate = 1000) // 10초마다 상태 출력 + public void logHikariStatus() { + if (dataSource != null) { + HikariPoolMXBean poolMXBean = dataSource.getHikariPoolMXBean(); + + int total = poolMXBean.getTotalConnections(); + int active = poolMXBean.getActiveConnections(); + int idle = poolMXBean.getIdleConnections(); + int waiting = poolMXBean.getThreadsAwaitingConnection(); + + System.out.printf( + "[HikariCP 상태] 전체: %d / 사용 중: %d / 유휴: %d / 대기 중: %d%n", + total, active, idle, waiting + ); + } + } +} diff --git a/src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java b/src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java new file mode 100644 index 0000000..70d0acf --- /dev/null +++ b/src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java @@ -0,0 +1,47 @@ +package com.example.Jinus.monitor; + +import org.apache.catalina.connector.Connector; +import org.apache.coyote.ProtocolHandler; +import org.apache.coyote.AbstractProtocol; +import org.apache.tomcat.util.threads.ThreadPoolExecutor; +import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; +import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.concurrent.Executor; + +@Component +public class TomcatThreadMonitor { + + private final ServletWebServerApplicationContext context; + + public TomcatThreadMonitor(ServletWebServerApplicationContext context) { + this.context = context; + } + + @Scheduled(fixedRate = 1000) // 10초마다 출력 + public void logTomcatThreadPoolStatus() { + if (context.getWebServer() instanceof TomcatWebServer tomcatWebServer) { + Connector connector = tomcatWebServer.getTomcat().getConnector(); + ProtocolHandler handler = connector.getProtocolHandler(); + + if (handler instanceof AbstractProtocol protocol) { + Executor executor = protocol.getExecutor(); + + if (executor instanceof ThreadPoolExecutor threadPoolExecutor) { + int max = threadPoolExecutor.getMaximumPoolSize(); + int poolSize = threadPoolExecutor.getPoolSize(); + int active = threadPoolExecutor.getActiveCount(); + long taskCount = threadPoolExecutor.getTaskCount(); + long completedTaskCount = threadPoolExecutor.getCompletedTaskCount(); + + System.out.printf( + "[Tomcat 스레드] MaxPoolSize: %d, PoolSize: %d, 활성: %d, TaskCount: %d, 완료: %d%n", + max, poolSize, active, taskCount, completedTaskCount + ); + } + } + } + } +} diff --git a/src/main/java/com/example/Jinus/service/diet/DietQueryService.java b/src/main/java/com/example/Jinus/service/diet/DietQueryService.java index 0ae8d03..53cab73 100644 --- a/src/main/java/com/example/Jinus/service/diet/DietQueryService.java +++ b/src/main/java/com/example/Jinus/service/diet/DietQueryService.java @@ -20,7 +20,6 @@ public class DietQueryService { private final CacheService cacheServiceV2; - private final DietRepository dietRepositoryV2; // 메뉴 존재 여부에 따른 반환값 처리 로직 public String getDietResponse(HandleRequestDto parameters, int cafeteriaId) { diff --git a/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java b/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java index 91bf820..1892c42 100644 --- a/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java +++ b/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java @@ -13,16 +13,12 @@ public class CollegeService { public CollegeService(CollegeRepository collegeRepository) { this.collegeRepository = collegeRepository; -// logger.info("CollegeService 실행"); } public String getCollegeName(int collegeId) { -// logger.info("getCollegeName 실행"); CollegeEntity collegeEntity = collegeRepository.findById(collegeId).orElse(null); -// logger.info("collegeEntity: {}", collegeEntity); if (collegeEntity != null) { -// logger.info("collegeEng: {}", collegeEntity.getCollegeEng()); return collegeEntity.getCollegeEng(); // 학과 영어 이름 리턴(테이블 찾기 위함) } else { logger.debug("CollegeService: collge를 찾을 수 없습니다."); @@ -37,10 +33,7 @@ public boolean checkEtcValue(int collegeId) { // collegeId에 해당하는 campusId 찾기 public int getCampusId(int collegeId) { -// logger.info("getCampusId 실행"); int campusId = collegeRepository.findCampusId(collegeId); -// logger.info("campusId: {}", campusId); - return campusId; } } diff --git a/src/main/java/com/example/Jinus/service/userInfo/UserService.java b/src/main/java/com/example/Jinus/service/userInfo/UserService.java index b1613c2..3c787cf 100644 --- a/src/main/java/com/example/Jinus/service/userInfo/UserService.java +++ b/src/main/java/com/example/Jinus/service/userInfo/UserService.java @@ -39,11 +39,11 @@ public int getUserDepartmentId(String userId) { } // hikariCP test - @Transactional - public void selectCampusIdTest(String userId) throws InterruptedException { - log.info("selectCampusIdTest 시작 - userId: {}", userId); - Thread.sleep(2500); // 커넥션을 5초간 점유 (풀 점유 시 타임아웃 유도) - userRepositoryV2.findCampusIdById(userId); - log.info("selectCampusIdTest 종료 - userId: {}", userId); - } +// @Transactional +// public void selectCampusIdTest(String userId) throws InterruptedException { +// log.info("selectCampusIdTest 시작 - userId: {}", userId); +// Thread.sleep(2500); // 커넥션을 5초간 점유 (풀 점유 시 타임아웃 유도) +// userRepositoryV2.findCampusIdById(userId); +// log.info("selectCampusIdTest 종료 - userId: {}", userId); +// } } From 95b7613308195141c9ea4ec6af9c5250ccae1b52 Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 9 May 2025 15:43:31 +0900 Subject: [PATCH 12/15] =?UTF-8?q?[Fix]redis=20db=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20cacheable=20=EC=A3=BC=EC=84=9D=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jinus/service/cafeteria/CacheService.java | 8 +++---- .../cafeteria/CafeteriaQueryService.java | 18 +++++++-------- .../service/cafeteria/CampusService.java | 16 ++++++------- .../service/userInfo/CollegeService.java | 23 ------------------- 4 files changed, 21 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java b/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java index c2c246c..a1bd371 100644 --- a/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java @@ -55,10 +55,10 @@ private long calculateTtlUntilNextMidnight(Date dietDate) { // Redis에서 조회 (없으면 DB에서 가져옴) - @Cacheable( - value = "cafeteriaList", - key = "#p0", - cacheManager = "contentCacheManager") +// @Cacheable( +// value = "cafeteriaList", +// key = "#p0", +// cacheManager = "contentCacheManager") public List getCafeteriaList(int campusId) { return cafeteriaRepositoryV2.findCafeteriaListByCampusId(campusId); } diff --git a/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java index 0dcc2f0..b1763c3 100644 --- a/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java @@ -12,19 +12,19 @@ public class CafeteriaQueryService { private final CafeteriaRepository cafeteriaRepositoryV2; - @Cacheable( - value = "cafeteriaId", - key = "#p0 + '::' + #p1", - unless = "#result == -1", - cacheManager = "contentCacheManager") +// @Cacheable( +// value = "cafeteriaId", +// key = "#p0 + '::' + #p1", +// unless = "#result == -1", +// cacheManager = "contentCacheManager") public int getCafeteriaId(String cafeteriaName, int campusId) { return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); } - @Cacheable( - value = "cafeteriaUrl", - key = "#p0", - cacheManager = "contentCacheManager") +// @Cacheable( +// value = "cafeteriaUrl", +// key = "#p0", +// cacheManager = "contentCacheManager") public String getImgUrl(int cafeteriaId) { return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); } diff --git a/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java b/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java index 6d4f35f..74bf7cc 100644 --- a/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java @@ -15,10 +15,10 @@ public class CampusService { private final CampusRepository campusRepositoryV2; - @Cacheable( - value = "campusId", - key = "#p0", - cacheManager = "contentCacheManager") +// @Cacheable( +// value = "campusId", +// key = "#p0", +// cacheManager = "contentCacheManager") // 사용자의 campusId 받아 캠퍼스 이름 찾기 public String getUserCampusName(int campusId) { return campusRepositoryV2.findCampusNameByCampusId(campusId); @@ -29,10 +29,10 @@ public List getCampusList() { return campusRepositoryV2.findCampusList(); } - @Cacheable( - value = "campusName", - key = "#p0", - cacheManager = "contentCacheManager") +// @Cacheable( +// value = "campusName", +// key = "#p0", +// cacheManager = "contentCacheManager") // 캠퍼스 이름으로 id 찾기 public int getCampusId(String campusName) { return campusRepositoryV2.findCampusIdByName(campusName); diff --git a/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java b/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java index 1892c42..c8eb2ef 100644 --- a/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java +++ b/src/main/java/com/example/Jinus/service/userInfo/CollegeService.java @@ -1,6 +1,5 @@ package com.example.Jinus.service.userInfo; -import com.example.Jinus.entity.userInfo.CollegeEntity; import com.example.Jinus.repository.userInfo.CollegeRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,32 +7,10 @@ @Service public class CollegeService { - private static final Logger logger = LoggerFactory.getLogger(CollegeService.class); private final CollegeRepository collegeRepository; public CollegeService(CollegeRepository collegeRepository) { this.collegeRepository = collegeRepository; } - public String getCollegeName(int collegeId) { - CollegeEntity collegeEntity = collegeRepository.findById(collegeId).orElse(null); - - if (collegeEntity != null) { - return collegeEntity.getCollegeEng(); // 학과 영어 이름 리턴(테이블 찾기 위함) - } else { - logger.debug("CollegeService: collge를 찾을 수 없습니다."); - return null; - } - } - - public boolean checkEtcValue(int collegeId) { - CollegeEntity collegeEntity = collegeRepository.findById(collegeId).orElse(null); - return collegeEntity.isEtcValue(); - } - - // collegeId에 해당하는 campusId 찾기 - public int getCampusId(int collegeId) { - int campusId = collegeRepository.findCampusId(collegeId); - return campusId; - } } From eef320219fd58fd12282746b07605e1840cacffd Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 9 May 2025 15:48:33 +0900 Subject: [PATCH 13/15] =?UTF-8?q?[Fix]code=20rabbit=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/Jinus/monitor/HikariCPMonitor.java | 10 +++++----- .../com/example/Jinus/monitor/TomcatThreadMonitor.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java b/src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java index f5930e4..3bcd0ed 100644 --- a/src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java +++ b/src/main/java/com/example/Jinus/monitor/HikariCPMonitor.java @@ -2,11 +2,13 @@ import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariPoolMXBean; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component +@Slf4j public class HikariCPMonitor { private final HikariDataSource dataSource; @@ -16,7 +18,7 @@ public HikariCPMonitor(HikariDataSource dataSource) { this.dataSource = dataSource; } - @Scheduled(fixedRate = 1000) // 10초마다 상태 출력 + @Scheduled(fixedRateString = "${monitor.pool.status.rate.ms:60000}") // 상태 출력 주기 (기본 1분) public void logHikariStatus() { if (dataSource != null) { HikariPoolMXBean poolMXBean = dataSource.getHikariPoolMXBean(); @@ -26,10 +28,8 @@ public void logHikariStatus() { int idle = poolMXBean.getIdleConnections(); int waiting = poolMXBean.getThreadsAwaitingConnection(); - System.out.printf( - "[HikariCP 상태] 전체: %d / 사용 중: %d / 유휴: %d / 대기 중: %d%n", - total, active, idle, waiting - ); + log.info("[HikariCP 상태] 전체: {} / 사용 중: {} / 유휴: {} / 대기 중: {}", + + total, active, idle, waiting); } } } diff --git a/src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java b/src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java index 70d0acf..967429a 100644 --- a/src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java +++ b/src/main/java/com/example/Jinus/monitor/TomcatThreadMonitor.java @@ -1,5 +1,6 @@ package com.example.Jinus.monitor; +import lombok.extern.slf4j.Slf4j; import org.apache.catalina.connector.Connector; import org.apache.coyote.ProtocolHandler; import org.apache.coyote.AbstractProtocol; @@ -12,6 +13,7 @@ import java.util.concurrent.Executor; @Component +@Slf4j public class TomcatThreadMonitor { private final ServletWebServerApplicationContext context; @@ -20,7 +22,7 @@ public TomcatThreadMonitor(ServletWebServerApplicationContext context) { this.context = context; } - @Scheduled(fixedRate = 1000) // 10초마다 출력 + @Scheduled(fixedRateString = "${monitor.pool.status.rate.ms:60000}") // 상태 출력 주기 (기본 1분) public void logTomcatThreadPoolStatus() { if (context.getWebServer() instanceof TomcatWebServer tomcatWebServer) { Connector connector = tomcatWebServer.getTomcat().getConnector(); @@ -36,10 +38,8 @@ public void logTomcatThreadPoolStatus() { long taskCount = threadPoolExecutor.getTaskCount(); long completedTaskCount = threadPoolExecutor.getCompletedTaskCount(); - System.out.printf( - "[Tomcat 스레드] MaxPoolSize: %d, PoolSize: %d, 활성: %d, TaskCount: %d, 완료: %d%n", - max, poolSize, active, taskCount, completedTaskCount - ); + log.info("[Tomcat 스레드] MaxPoolSize: {}, PoolSize: {}, 활성: {}, TaskCount: {}, 완료: {}", + + max, poolSize, active, taskCount, completedTaskCount); } } } From 1e9729d0184e11b1bfbe771a3c2df16eb74578fd Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 9 May 2025 15:55:58 +0900 Subject: [PATCH 14/15] =?UTF-8?q?[Fix]=20build.test=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jinus/service/userInfo/UserService.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/Jinus/service/userInfo/UserService.java b/src/main/java/com/example/Jinus/service/userInfo/UserService.java index 3c787cf..b1613c2 100644 --- a/src/main/java/com/example/Jinus/service/userInfo/UserService.java +++ b/src/main/java/com/example/Jinus/service/userInfo/UserService.java @@ -39,11 +39,11 @@ public int getUserDepartmentId(String userId) { } // hikariCP test -// @Transactional -// public void selectCampusIdTest(String userId) throws InterruptedException { -// log.info("selectCampusIdTest 시작 - userId: {}", userId); -// Thread.sleep(2500); // 커넥션을 5초간 점유 (풀 점유 시 타임아웃 유도) -// userRepositoryV2.findCampusIdById(userId); -// log.info("selectCampusIdTest 종료 - userId: {}", userId); -// } + @Transactional + public void selectCampusIdTest(String userId) throws InterruptedException { + log.info("selectCampusIdTest 시작 - userId: {}", userId); + Thread.sleep(2500); // 커넥션을 5초간 점유 (풀 점유 시 타임아웃 유도) + userRepositoryV2.findCampusIdById(userId); + log.info("selectCampusIdTest 종료 - userId: {}", userId); + } } From d1755526bcfef7c5aac75055d55113aae71fb2bf Mon Sep 17 00:00:00 2001 From: hykim02 Date: Fri, 9 May 2025 16:45:22 +0900 Subject: [PATCH 15/15] =?UTF-8?q?[Fix]=20Cacheable=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jinus/service/cafeteria/CacheService.java | 8 ++++---- .../cafeteria/CafeteriaQueryService.java | 18 +++++++++--------- .../Jinus/service/cafeteria/CampusService.java | 16 ++++++++-------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java b/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java index a1bd371..c2c246c 100644 --- a/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CacheService.java @@ -55,10 +55,10 @@ private long calculateTtlUntilNextMidnight(Date dietDate) { // Redis에서 조회 (없으면 DB에서 가져옴) -// @Cacheable( -// value = "cafeteriaList", -// key = "#p0", -// cacheManager = "contentCacheManager") + @Cacheable( + value = "cafeteriaList", + key = "#p0", + cacheManager = "contentCacheManager") public List getCafeteriaList(int campusId) { return cafeteriaRepositoryV2.findCafeteriaListByCampusId(campusId); } diff --git a/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java index b1763c3..0dcc2f0 100644 --- a/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CafeteriaQueryService.java @@ -12,19 +12,19 @@ public class CafeteriaQueryService { private final CafeteriaRepository cafeteriaRepositoryV2; -// @Cacheable( -// value = "cafeteriaId", -// key = "#p0 + '::' + #p1", -// unless = "#result == -1", -// cacheManager = "contentCacheManager") + @Cacheable( + value = "cafeteriaId", + key = "#p0 + '::' + #p1", + unless = "#result == -1", + cacheManager = "contentCacheManager") public int getCafeteriaId(String cafeteriaName, int campusId) { return cafeteriaRepositoryV2.findCafeteriaId(cafeteriaName, campusId).orElse(-1); } -// @Cacheable( -// value = "cafeteriaUrl", -// key = "#p0", -// cacheManager = "contentCacheManager") + @Cacheable( + value = "cafeteriaUrl", + key = "#p0", + cacheManager = "contentCacheManager") public String getImgUrl(int cafeteriaId) { return cafeteriaRepositoryV2.findImgUrlByCafeteriaId(cafeteriaId); } diff --git a/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java b/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java index 74bf7cc..6d4f35f 100644 --- a/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java +++ b/src/main/java/com/example/Jinus/service/cafeteria/CampusService.java @@ -15,10 +15,10 @@ public class CampusService { private final CampusRepository campusRepositoryV2; -// @Cacheable( -// value = "campusId", -// key = "#p0", -// cacheManager = "contentCacheManager") + @Cacheable( + value = "campusId", + key = "#p0", + cacheManager = "contentCacheManager") // 사용자의 campusId 받아 캠퍼스 이름 찾기 public String getUserCampusName(int campusId) { return campusRepositoryV2.findCampusNameByCampusId(campusId); @@ -29,10 +29,10 @@ public List getCampusList() { return campusRepositoryV2.findCampusList(); } -// @Cacheable( -// value = "campusName", -// key = "#p0", -// cacheManager = "contentCacheManager") + @Cacheable( + value = "campusName", + key = "#p0", + cacheManager = "contentCacheManager") // 캠퍼스 이름으로 id 찾기 public int getCampusId(String campusName) { return campusRepositoryV2.findCampusIdByName(campusName);