From 5bcd00048d90999700c3cbe0f4aecf1b79771e10 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Wed, 4 Jun 2025 15:21:47 +0900 Subject: [PATCH 01/22] =?UTF-8?q?fix:=20GET/api/menus/{menuId}=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java index 055669e..f5e76fa 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java @@ -19,6 +19,8 @@ public class GetMenuResponse { private String menuTitle; private int menuPrice; private String menuPinImgUrl; + private String menuMemoTitle; + private String menuMemoContent; private String storeTitle; private String storeAddress; private List tagImgUrls; @@ -58,6 +60,8 @@ public static GetMenuResponse of(Menu menu, List imgUrls, List tags .menuTitle(menu.getTitle()) .menuPrice(menu.getPrice()) .menuPinImgUrl(menuPinImgUrl) + .menuMemoTitle(menu.getMemoTitle()) + .menuMemoContent(menu.getMemoContent()) .storeAddress(menu.getStore().getAddress()) .storeTitle(menu.getStore().getTitle()) .tagImgUrls(tagImgUrls) From 142d013f5812c6af1262f419f1b589a444d0f182 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Wed, 4 Jun 2025 17:46:10 +0900 Subject: [PATCH 02/22] feat: AddressParser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 테스트 코드 작성 --- .../domain/store/util/AddressParser.java | 25 +++++++++++++ .../domain/store/unit/AddressTest.java | 37 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java create mode 100644 src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java diff --git a/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java b/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java new file mode 100644 index 0000000..4fd7788 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java @@ -0,0 +1,25 @@ +package com.ourmenu.backend.domain.store.util; + +import java.util.Arrays; +import java.util.List; + +public class AddressParser { + + private AddressParser() { + } + + private static List parseAddress(String address) { + return Arrays.stream(address.split(" ")).toList(); + } + + public static String parseAddressToCityDistrict(String address) { + List addresses = parseAddress(address); + if (addresses.size() >= 2) { + return addresses.get(0) + " " + addresses.get(1); + } + if (addresses.size() == 1) { + return addresses.get(0); + } + return ""; + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java b/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java new file mode 100644 index 0000000..512cc32 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java @@ -0,0 +1,37 @@ +package com.ourmenu.backend.domain.store.unit; + +import com.ourmenu.backend.domain.store.util.AddressParser; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("주소 파싱 단위 테스트") +public class AddressTest { + + + @Test + void 상세주소를_시_구_조합으로_변환_할_수_있다() { + //given + String cityDistrict = "서울 광진구"; + String address = "서울 광진구 능동로16길 57 (우)05021"; + + //when + String simpleAddress = AddressParser.parseAddressToCityDistrict(address); + + //then + Assertions.assertThat(simpleAddress).isEqualTo(cityDistrict); + } + + @Test + void 옳지못한_주소에_대해서_예외를_발생시키지_않는다() { + //given + String address = "서울"; + + //when + String simpleAddress = AddressParser.parseAddressToCityDistrict(address); + + //then + Assertions.assertThat(simpleAddress).isEqualTo(address); + } + +} From 30312dba274aa466cb22fbab32041d593f155c9c Mon Sep 17 00:00:00 2001 From: david-parkk Date: Wed, 4 Jun 2025 17:51:30 +0900 Subject: [PATCH 03/22] =?UTF-8?q?fix:=20=EB=A9=94=EB=89=B4=20=EB=8B=A8?= =?UTF-8?q?=EC=88=9C=20=EC=A1=B0=ED=9A=8C=20=EC=9D=91=EB=8B=B5=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 시+구 주소 사용 --- .../backend/domain/menu/dto/GetSimpleMenuResponse.java | 5 ++++- .../backend/domain/menu/dto/MenuFolderMenuResponse.java | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java index 3d47086..d77bcc7 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.menu.dto; import com.ourmenu.backend.domain.menu.domain.Menu; +import com.ourmenu.backend.domain.store.util.AddressParser; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -21,11 +22,13 @@ public class GetSimpleMenuResponse { private LocalDateTime createdAt; public static GetSimpleMenuResponse of(Menu menu, String menuImgUrl) { + String storeAddress = AddressParser.parseAddressToCityDistrict(menu.getStore().getAddress()); + return GetSimpleMenuResponse.builder() .menuId(menu.getId()) .menuTitle(menu.getTitle()) .storeTitle(menu.getStore().getTitle()) - .storeAddress(menu.getStore().getAddress()) + .storeAddress(storeAddress) .menuPrice(menu.getPrice()) .menuImgUrl(menuImgUrl) .createdAt(menu.getCreatedAt()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java index 4683d34..af8600f 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java @@ -1,5 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; +import com.ourmenu.backend.domain.store.util.AddressParser; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -20,11 +21,13 @@ public class MenuFolderMenuResponse { private LocalDateTime createdAt; public static MenuFolderMenuResponse of(MenuSimpleDto menuSimpleDto, String menuImgUrl) { + String storeAddress = AddressParser.parseAddressToCityDistrict(menuSimpleDto.getStoreAddress()); + return MenuFolderMenuResponse.builder() .menuId(menuSimpleDto.getMenuId()) .menuTitle(menuSimpleDto.getMenuTitle()) .storeTitle(menuSimpleDto.getStoreTitle()) - .storeAddress(menuSimpleDto.getStoreAddress()) + .storeAddress(storeAddress) .menuPrice(menuSimpleDto.getMenuPrice()) .menuImgUrl(menuImgUrl) .createdAt(menuSimpleDto.getCreatedAt()) From 4a953c4de9c924e7c91876a0688adfc2a94d6ac1 Mon Sep 17 00:00:00 2001 From: Park Jiwon <57484954+david-parkk@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:08:11 +0900 Subject: [PATCH 04/22] =?UTF-8?q?Revert=20"[FIX]=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EB=8B=A8=EC=88=9C=20=EC=A1=B0=ED=9A=8C=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?API=20=EC=88=98=EC=A0=95"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/dto/GetSimpleMenuResponse.java | 5 +-- .../menu/dto/MenuFolderMenuResponse.java | 5 +-- .../domain/store/util/AddressParser.java | 25 ------------- .../domain/store/unit/AddressTest.java | 37 ------------------- 4 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java delete mode 100644 src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java index d77bcc7..3d47086 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java @@ -1,7 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; import com.ourmenu.backend.domain.menu.domain.Menu; -import com.ourmenu.backend.domain.store.util.AddressParser; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -22,13 +21,11 @@ public class GetSimpleMenuResponse { private LocalDateTime createdAt; public static GetSimpleMenuResponse of(Menu menu, String menuImgUrl) { - String storeAddress = AddressParser.parseAddressToCityDistrict(menu.getStore().getAddress()); - return GetSimpleMenuResponse.builder() .menuId(menu.getId()) .menuTitle(menu.getTitle()) .storeTitle(menu.getStore().getTitle()) - .storeAddress(storeAddress) + .storeAddress(menu.getStore().getAddress()) .menuPrice(menu.getPrice()) .menuImgUrl(menuImgUrl) .createdAt(menu.getCreatedAt()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java index af8600f..4683d34 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java @@ -1,6 +1,5 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.store.util.AddressParser; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -21,13 +20,11 @@ public class MenuFolderMenuResponse { private LocalDateTime createdAt; public static MenuFolderMenuResponse of(MenuSimpleDto menuSimpleDto, String menuImgUrl) { - String storeAddress = AddressParser.parseAddressToCityDistrict(menuSimpleDto.getStoreAddress()); - return MenuFolderMenuResponse.builder() .menuId(menuSimpleDto.getMenuId()) .menuTitle(menuSimpleDto.getMenuTitle()) .storeTitle(menuSimpleDto.getStoreTitle()) - .storeAddress(storeAddress) + .storeAddress(menuSimpleDto.getStoreAddress()) .menuPrice(menuSimpleDto.getMenuPrice()) .menuImgUrl(menuImgUrl) .createdAt(menuSimpleDto.getCreatedAt()) diff --git a/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java b/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java deleted file mode 100644 index 4fd7788..0000000 --- a/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ourmenu.backend.domain.store.util; - -import java.util.Arrays; -import java.util.List; - -public class AddressParser { - - private AddressParser() { - } - - private static List parseAddress(String address) { - return Arrays.stream(address.split(" ")).toList(); - } - - public static String parseAddressToCityDistrict(String address) { - List addresses = parseAddress(address); - if (addresses.size() >= 2) { - return addresses.get(0) + " " + addresses.get(1); - } - if (addresses.size() == 1) { - return addresses.get(0); - } - return ""; - } -} diff --git a/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java b/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java deleted file mode 100644 index 512cc32..0000000 --- a/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ourmenu.backend.domain.store.unit; - -import com.ourmenu.backend.domain.store.util.AddressParser; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -@DisplayName("주소 파싱 단위 테스트") -public class AddressTest { - - - @Test - void 상세주소를_시_구_조합으로_변환_할_수_있다() { - //given - String cityDistrict = "서울 광진구"; - String address = "서울 광진구 능동로16길 57 (우)05021"; - - //when - String simpleAddress = AddressParser.parseAddressToCityDistrict(address); - - //then - Assertions.assertThat(simpleAddress).isEqualTo(cityDistrict); - } - - @Test - void 옳지못한_주소에_대해서_예외를_발생시키지_않는다() { - //given - String address = "서울"; - - //when - String simpleAddress = AddressParser.parseAddressToCityDistrict(address); - - //then - Assertions.assertThat(simpleAddress).isEqualTo(address); - } - -} From 9a40bd7fe6709858578fb0291664c732c4d92367 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Mon, 9 Jun 2025 17:14:50 +0900 Subject: [PATCH 05/22] =?UTF-8?q?refactor:=20=EC=9C=A0=ED=8B=B8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DefaultImgConverter -> DefaultImgConverterService - UrlConverter -> UrlConverterService --- .../domain/cache/application/CacheService.java | 3 +-- .../UrlConverterService.java} | 8 ++++---- .../domain/home/application/HomeService.java | 10 +++++----- .../home/dto/GetHomeRecommendResponse.java | 8 ++++---- .../home/dto/SaveAndGetQuestionRequest.java | 9 +++++---- .../domain/menu/application/MapService.java | 10 +++++----- .../menu/application/MenuFolderService.java | 16 ++++++++-------- .../menu/application/MenuImgService.java | 8 ++++---- .../domain/menu/application/MenuService.java | 18 +++++++++--------- .../converter/DefaultImgConverterService.java} | 8 ++++---- .../menu/dto/GetMenuFolderMenuResponse.java | 7 ++++--- .../domain/menu/dto/GetMenuResponse.java | 10 +++++----- .../menu/dto/MenuFolderInfoOnMapDto.java | 6 +++--- .../domain/menu/dto/MenuFolderResponse.java | 6 +++--- .../domain/menu/dto/MenuInfoOnMapDto.java | 8 ++++---- .../backend/domain/menu/dto/MenuOnMapDto.java | 8 ++++---- .../menu/dto/SaveMenuFolderResponse.java | 6 +++--- .../domain/menu/dto/SaveMenuResponse.java | 9 +++++---- .../menu/dto/UpdateMenuFolderResponse.java | 6 +++--- .../backend/domain/cache/api/CacheApiTest.java | 4 ++-- .../backend/domain/home/api/HomeApiTest.java | 9 +++++---- .../home/application/HomeImgUrlTest.java | 8 ++++---- .../backend/domain/menu/api/MenuApiTest.java | 8 ++++---- .../domain/menu/api/MenuFolderApiTest.java | 6 +++--- 24 files changed, 101 insertions(+), 98 deletions(-) rename src/main/java/com/ourmenu/backend/domain/cache/{util/UrlConverter.java => application/UrlConverterService.java} (92%) rename src/main/java/com/ourmenu/backend/domain/menu/{util/DefaultImgConverter.java => application/converter/DefaultImgConverterService.java} (68%) diff --git a/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java b/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java index efae0f3..e9f19f9 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/application/CacheService.java @@ -8,7 +8,6 @@ import com.ourmenu.backend.domain.cache.dto.SimpleMenuFolderIconResponse; import com.ourmenu.backend.domain.cache.dto.SimpleMenuPinResponse; import com.ourmenu.backend.domain.cache.dto.SimpleTagImgResponse; -import com.ourmenu.backend.domain.cache.util.UrlConverter; import com.ourmenu.backend.domain.tag.domain.Tag; import java.util.Arrays; import java.util.List; @@ -19,7 +18,7 @@ @RequiredArgsConstructor public class CacheService { - private final UrlConverter urlConvertor; + private final UrlConverterService urlConvertor; public GetCacheInfoResponse getCacheInfo() { List menuFolderIconInfo = getMenuFolderIconInfo(); diff --git a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java b/src/main/java/com/ourmenu/backend/domain/cache/application/UrlConverterService.java similarity index 92% rename from src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java rename to src/main/java/com/ourmenu/backend/domain/cache/application/UrlConverterService.java index d4420ff..9d51a05 100644 --- a/src/main/java/com/ourmenu/backend/domain/cache/util/UrlConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/cache/application/UrlConverterService.java @@ -1,4 +1,4 @@ -package com.ourmenu.backend.domain.cache.util; +package com.ourmenu.backend.domain.cache.application; import com.ourmenu.backend.domain.cache.domain.HomeImg; import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; @@ -6,10 +6,10 @@ import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.tag.domain.Tag; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; -@Component -public class UrlConverter { +@Service +public class UrlConverterService { @Value("${spring.cloud.aws.credentials.default.bucket.url}") private String url; diff --git a/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java b/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java index 46cb01f..3df27f7 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java +++ b/src/main/java/com/ourmenu/backend/domain/home/application/HomeService.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.home.application; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.home.dao.HomeQuestionAnswerRepository; import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.home.domain.HomeQuestionAnswer; @@ -30,7 +30,7 @@ public class HomeService { private final RecommendMenuCacheService recommendMenuCacheService; private final MenuService menuService; private final MealTimeService mealTimeService; - private final UrlConverter urlConverter; + private final UrlConverterService urlConverterService; /** * 홈 질문 응답 값을 저장 및 추천 메뉴를 캐싱한다. 질문에 관련 없는 응답이면 에러를 반환한다. @@ -70,12 +70,12 @@ public SaveAndGetQuestionRequest updateQuestion(Long userId) { .userId(userId) .build(); HomeQuestionAnswer saveHomeQuestionAnswer = homeQuestionAnswerRepository.save(homeQuestionAnswer); - return SaveAndGetQuestionRequest.from(saveHomeQuestionAnswer, urlConverter); + return SaveAndGetQuestionRequest.from(saveHomeQuestionAnswer, urlConverterService); } HomeQuestionAnswer homeQuestionAnswer = optionalHomeQuestionAnswer.get(); homeQuestionAnswer.update(randomQuestion); - return SaveAndGetQuestionRequest.from(homeQuestionAnswer, urlConverter); + return SaveAndGetQuestionRequest.from(homeQuestionAnswer, urlConverterService); } /** @@ -93,7 +93,7 @@ public GetHomeRecommendResponse getRecommendMenus(Long userId) { List randomRecommendMenus = getRandomRecommendMenu(); return GetHomeRecommendResponse.of(answer, questionRecommendMenus, tagRandomRecommendDto.getTag(), - tagRandomRecommendDto.getGetRecommendMenuResponses(), randomRecommendMenus, urlConverter); + tagRandomRecommendDto.getGetRecommendMenuResponses(), randomRecommendMenus, urlConverterService); } /** diff --git a/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java b/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java index 12eb561..d29a6d3 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/home/dto/GetHomeRecommendResponse.java @@ -1,7 +1,7 @@ package com.ourmenu.backend.domain.home.dto; import com.ourmenu.backend.domain.cache.domain.HomeImg; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.tag.domain.Tag; import java.util.List; @@ -27,10 +27,10 @@ public static GetHomeRecommendResponse of(Answer answer, Tag tag, List tagRecommendMenus, List otherRecommendMenus, - UrlConverter urlConverter) { + UrlConverterService urlConverterService) { HomeImg homeImg = answer.getRandomHomeImg(); - String HomeImgUrl = urlConverter.getHomeImgUrl(homeImg); - String tagRecommendImgUrl = urlConverter.getHomeRecommendTagImgUrl(tag); + String HomeImgUrl = urlConverterService.getHomeImgUrl(homeImg); + String tagRecommendImgUrl = urlConverterService.getHomeRecommendTagImgUrl(tag); String otherRecommendImgUrl = tagRecommendImgUrl; return GetHomeRecommendResponse.builder() diff --git a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java index f773138..e5a5c5a 100644 --- a/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/home/dto/SaveAndGetQuestionRequest.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.home.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.home.domain.Answer; import com.ourmenu.backend.domain.home.domain.HomeQuestionAnswer; import com.ourmenu.backend.domain.home.domain.Question; @@ -18,19 +18,20 @@ public class SaveAndGetQuestionRequest { private String question; private List answers; - public static SaveAndGetQuestionRequest from(HomeQuestionAnswer homeQuestionAnswer, UrlConverter urlConverter) { + public static SaveAndGetQuestionRequest from(HomeQuestionAnswer homeQuestionAnswer, + UrlConverterService urlConverterService) { Question question = homeQuestionAnswer.getQuestion(); Answer answer1 = question.getAnswer1(); AnswerDto answerDto1 = AnswerDto.builder() .answer(answer1) - .answerImgUrl(urlConverter.getAnswerImgUrl(answer1)) + .answerImgUrl(urlConverterService.getAnswerImgUrl(answer1)) .build(); Answer answer2 = question.getAnswer2(); AnswerDto answerDto2 = AnswerDto.builder() .answer(answer2) - .answerImgUrl(urlConverter.getAnswerImgUrl(answer2)) + .answerImgUrl(urlConverterService.getAnswerImgUrl(answer2)) .build(); return SaveAndGetQuestionRequest.builder() diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java index fd5555d..f69866f 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MapService.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.application; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.dao.MenuFolderRepository; import com.ourmenu.backend.domain.menu.dao.MenuImgRepository; import com.ourmenu.backend.domain.menu.dao.MenuRepository; @@ -51,7 +51,7 @@ public class MapService { private final MenuImgRepository menuImgRepository; private final MenuFolderRepository menuFolderRepository; private final OwnedMenuSearchRepository ownedMenuSearchRepository; - private final UrlConverter urlConverter; + private final UrlConverterService urlConverterService; /** * 유저가 보유한 메뉴들을 가져와 위치가 같은 메뉴들은 그룹핑하여 조회 @@ -70,7 +70,7 @@ public List findMenusOnMap(Long userId) { return menuMaps.entrySet().stream() .map(entry -> MenuOnMapDto.from( - entry.getKey(), entry.getValue(), urlConverter)) + entry.getKey(), entry.getValue(), urlConverterService)) .collect(Collectors.toList()); } @@ -174,10 +174,10 @@ private MenuInfoOnMapDto getMenuInfo(Menu menu) { if (!menuFolders.isEmpty()) { MenuFolder latestMenuFolder = menuFolders.stream() .max(Comparator.comparing(MenuFolder::getCreatedAt)).get(); - menuFolderInfo = MenuFolderInfoOnMapDto.of(latestMenuFolder, menuFolders.size(), urlConverter); + menuFolderInfo = MenuFolderInfoOnMapDto.of(latestMenuFolder, menuFolders.size(), urlConverterService); } - return MenuInfoOnMapDto.of(menu, menuTags, menuImgs, menuFolderInfo, urlConverter); + return MenuInfoOnMapDto.of(menu, menuTags, menuImgs, menuFolderInfo, urlConverterService); } /** diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java index ddc698e..17b6ba3 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuFolderService.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.menu.application; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; +import com.ourmenu.backend.domain.menu.application.converter.DefaultImgConverterService; import com.ourmenu.backend.domain.menu.dao.MenuFolderRepository; import com.ourmenu.backend.domain.menu.dao.MenuRepository; import com.ourmenu.backend.domain.menu.domain.MenuFolder; @@ -13,7 +14,6 @@ import com.ourmenu.backend.domain.menu.exception.ForbiddenMenuFolderException; import com.ourmenu.backend.domain.menu.exception.NotFoundMenuFolderException; import com.ourmenu.backend.domain.menu.exception.OutOfBoundCustomIndexException; -import com.ourmenu.backend.domain.menu.util.DefaultImgConverter; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -27,9 +27,9 @@ public class MenuFolderService { private final AwsS3Service awsS3Service; private final MenuFolderRepository menuFolderRepository; private final MenuMenuFolderService menuMenuFolderService; - private final DefaultImgConverter defaultImgConvertor; + private final DefaultImgConverterService defaultImgConvertor; private final MenuRepository menuRepository; - private final UrlConverter urlConverter; + private final UrlConverterService urlConverterService; /** * 메뉴 폴더 저장 @@ -45,7 +45,7 @@ public SaveMenuFolderResponse saveMenuFolder(MenuFolderDto menuFolderDto) { MenuFolder menuFolder = saveMenuFolder(menuFolderDto, menuFolderImgUrl); return SaveMenuFolderResponse.of(menuFolder, menuFolderDto.getMenuIds(), - defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverterService); } /** @@ -95,7 +95,7 @@ public UpdateMenuFolderResponse updateMenuFolder(Long userId, Long menuFolderId, menuFolder.update(menuFolderDto); List menuMenuFolders = menuMenuFolderService.findAllByMenuFolderId(menuFolderId); return UpdateMenuFolderResponse.of(menuFolder, menuMenuFolders, - defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverterService); } /** @@ -126,7 +126,7 @@ public UpdateMenuFolderResponse updateMenuFolderIndex(Long userId, Long menuFold findMenuFolder.updateIndex(index); List menuMenuFolders = menuMenuFolderService.findAllByMenuFolderId(menuFolderId); return UpdateMenuFolderResponse.of(findMenuFolder, menuMenuFolders, - defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverterService); } @@ -144,7 +144,7 @@ public GetMenuFolderResponse findAllMenuFolder(Long userId) { List menuMenuFolders = menuMenuFolderService.findAllByMenuFolderId( menuFolder.getId()); return MenuFolderResponse.of(menuFolder, menuMenuFolders, - defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverter); + defaultImgConvertor.getDefaultMenuFolderImgUrl(), urlConverterService); }).toList(); int menuCount = menuRepository.countByUserId(userId); return GetMenuFolderResponse.of(menuCount, menuFolderResponses); diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuImgService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuImgService.java index f5f5210..e965a1e 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuImgService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuImgService.java @@ -1,8 +1,8 @@ package com.ourmenu.backend.domain.menu.application; +import com.ourmenu.backend.domain.menu.application.converter.DefaultImgConverterService; import com.ourmenu.backend.domain.menu.dao.MenuImgRepository; import com.ourmenu.backend.domain.menu.domain.MenuImg; -import com.ourmenu.backend.domain.menu.util.DefaultImgConverter; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ public class MenuImgService { private final MenuImgRepository menuImgRepository; private final AwsS3Service awsS3Service; - private final DefaultImgConverter defaultImgConverter; + private final DefaultImgConverterService defaultImgConverterService; @Transactional public List saveMenuImgs(Long menuId, List multipartFiles) { @@ -52,7 +52,7 @@ public String findUniqueImg(Long menuId) { return menuImgRepository.findAllByMenuId(menuId).stream() .map(MenuImg::getImgUrl) .findFirst() - .orElse(defaultImgConverter.getDefaultMenuImgUrl()); + .orElse(defaultImgConverterService.getDefaultMenuImgUrl()); } /** @@ -88,7 +88,7 @@ private MenuImg saveMenuImg(Long menuId, String imgUrl) { private MenuImg createDefaultMenuImg() { return MenuImg.builder() .menuId(null) - .imgUrl(defaultImgConverter.getDefaultMenuImgUrl()) + .imgUrl(defaultImgConverterService.getDefaultMenuImgUrl()) .build(); } } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java index c0701ef..b00dff1 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/MenuService.java @@ -1,7 +1,8 @@ package com.ourmenu.backend.domain.menu.application; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.home.dto.GetRecommendMenuResponse; +import com.ourmenu.backend.domain.menu.application.converter.DefaultImgConverterService; import com.ourmenu.backend.domain.menu.dao.MenuRepository; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuFolder; @@ -18,7 +19,6 @@ import com.ourmenu.backend.domain.menu.dto.SaveMenuResponse; import com.ourmenu.backend.domain.menu.exception.ForbiddenMenuException; import com.ourmenu.backend.domain.menu.exception.NotFoundMenuException; -import com.ourmenu.backend.domain.menu.util.DefaultImgConverter; import com.ourmenu.backend.domain.store.application.StoreService; import com.ourmenu.backend.domain.store.domain.Store; import com.ourmenu.backend.domain.tag.application.MenuTagService; @@ -40,8 +40,8 @@ public class MenuService { private final StoreService storeService; private final MenuImgService menuImgService; private final MenuFolderService menuFolderService; - private final DefaultImgConverter defaultImgConverter; - private final UrlConverter urlConverter; + private final DefaultImgConverterService defaultImgConverterService; + private final UrlConverterService urlConverterService; /** * 메뉴 저장(메뉴 사진, 메뉴판, 태그 의존 엔티티 생성 @@ -55,7 +55,7 @@ public SaveMenuResponse saveMenu(MenuDto menuDto) { Store store = storeService.saveStoreAndMap(menuDto.getStoreTitle(), menuDto.getStoreAddress(), menuDto.getMapX(), menuDto.getMapY()); - + Menu menu = Menu.builder() .title(menuDto.getMenuTitle()) .price(menuDto.getMenuPrice()) @@ -79,7 +79,7 @@ public SaveMenuResponse saveMenu(MenuDto menuDto) { //s3 업로드및 이미지 연관관계 생성 List menuImgs = menuImgService.saveMenuImgs(saveMenu.getId(), menuDto.getMenuImgs()); return SaveMenuResponse.of(saveMenu, store, store.getMap(), menuImgs, saveMenuMenuFolders, saveTag, - urlConverter); + urlConverterService); } /** @@ -127,8 +127,8 @@ public GetMenuFolderMenuResponse findMenusByMenuFolder(Long userId, Long menuFol .toList(); MenuFolder menuFolder = menuFolderService.findOne(userId, menuFolderId); - return GetMenuFolderMenuResponse.of(menuFolder, defaultImgConverter.getDefaultMenuFolderImgUrl(), - menuResponses, urlConverter); + return GetMenuFolderMenuResponse.of(menuFolder, defaultImgConverterService.getDefaultMenuFolderImgUrl(), + menuResponses, urlConverterService); } /** @@ -218,7 +218,7 @@ public GetMenuResponse findMenu(Long userId, Long menuId) { List imgUrls = menuImgService.findImgUrls(menuId); List tags = menuTagService.findTagNames(menuId); List menuFolders = menuFolderService.findAllByMenuId(menuId); - return GetMenuResponse.of(menu, imgUrls, tags, menuFolders, urlConverter); + return GetMenuResponse.of(menu, imgUrls, tags, menuFolders, urlConverterService); } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/util/DefaultImgConverter.java b/src/main/java/com/ourmenu/backend/domain/menu/application/converter/DefaultImgConverterService.java similarity index 68% rename from src/main/java/com/ourmenu/backend/domain/menu/util/DefaultImgConverter.java rename to src/main/java/com/ourmenu/backend/domain/menu/application/converter/DefaultImgConverterService.java index d7a43f1..c73667b 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/util/DefaultImgConverter.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/application/converter/DefaultImgConverterService.java @@ -1,10 +1,10 @@ -package com.ourmenu.backend.domain.menu.util; +package com.ourmenu.backend.domain.menu.application.converter; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; -@Component -public class DefaultImgConverter { +@Service +public class DefaultImgConverterService { @Value("${spring.cloud.aws.credentials.default.bucket.url}") private String url; diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java index b13fa41..f21b2d4 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuFolderMenuResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import java.util.List; import lombok.AccessLevel; @@ -20,13 +20,14 @@ public class GetMenuFolderMenuResponse { private List menus; public static GetMenuFolderMenuResponse of(MenuFolder menuFolder, String defaultMenuFolderImgUrl, - List menus, UrlConverter urlConverter) { + List menus, + UrlConverterService urlConverterService) { String menuFolderImgUrl = menuFolder.getImgUrl(); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } - String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverterService.getMenuFolderImgUrl(menuFolder.getIcon()); return GetMenuFolderMenuResponse.builder() .menuFolderId(menuFolder.getId()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java index f5e76fa..5527718 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetMenuResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.tag.domain.Tag; @@ -38,12 +38,12 @@ private static class SimpleMenuFolder { } public static GetMenuResponse of(Menu menu, List imgUrls, List tags, - List menuFolders, UrlConverter urlConverter) { - String menuPinImgUrl = urlConverter.getMenuPinMapUrl(menu.getPin()); + List menuFolders, UrlConverterService urlConverterService) { + String menuPinImgUrl = urlConverterService.getMenuPinMapUrl(menu.getPin()); List simpleMenuFolders = menuFolders.stream() .map(menuFolder -> { - String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverterService.getMenuFolderImgUrl(menuFolder.getIcon()); return SimpleMenuFolder.builder() .menuFolderId(menuFolder.getId()) .menuFolderTitle(menuFolder.getTitle()) @@ -52,7 +52,7 @@ public static GetMenuResponse of(Menu menu, List imgUrls, List tags }) .toList(); List tagImgUrls = tags.stream() - .map(urlConverter::getOrangeTagImgUrl) + .map(urlConverterService::getOrangeTagImgUrl) .toList(); return GetMenuResponse.builder(). diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java index 1ddd40c..cce4c76 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderInfoOnMapDto.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import lombok.Builder; import lombok.Getter; @@ -13,8 +13,8 @@ public class MenuFolderInfoOnMapDto { private String menuFolderIconImgUrl; private int menuFolderCount; - public static MenuFolderInfoOnMapDto of(MenuFolder menuFolder, int count, UrlConverter urlConverter) { - String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); + public static MenuFolderInfoOnMapDto of(MenuFolder menuFolder, int count, UrlConverterService urlConverterService) { + String menuFolderIconImgUrl = urlConverterService.getMenuFolderImgUrl(menuFolder.getIcon()); return MenuFolderInfoOnMapDto.builder() .menuFolderTitle(menuFolder.getTitle()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java index 67b177c..eca835f 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.domain.MenuMenuFolder; import java.util.List; @@ -22,13 +22,13 @@ public class MenuFolderResponse { private int index; public static MenuFolderResponse of(MenuFolder menuFolder, List menuFolders, - String defaultMenuFolderImgUrl, UrlConverter urlConverter) { + String defaultMenuFolderImgUrl, UrlConverterService urlConverterService) { String menuFolderImgUrl = menuFolder.getImgUrl(); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } - String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverterService.getMenuFolderImgUrl(menuFolder.getIcon()); List menuIds = menuFolders.stream() .map(menuMenuFolder -> menuMenuFolder.getMenu().getId()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java index 9d4bbc2..4190731 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuInfoOnMapDto.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuImg; import com.ourmenu.backend.domain.tag.domain.MenuTag; @@ -25,11 +25,11 @@ public class MenuInfoOnMapDto { private Double mapY; public static MenuInfoOnMapDto of(Menu menu, List menuTags, List menuImgs, - MenuFolderInfoOnMapDto menuFolderInfo, UrlConverter urlConverter) { - String menuPinImgUrl = urlConverter.getMenuPinMapUrl(menu.getPin()); + MenuFolderInfoOnMapDto menuFolderInfo, UrlConverterService urlConverterService) { + String menuPinImgUrl = urlConverterService.getMenuPinMapUrl(menu.getPin()); List menuTagImgUrls = menuTags.stream() .map(MenuTag::getTag) - .map(urlConverter::getOrangeTagImgUrl) + .map(urlConverterService::getOrangeTagImgUrl) .toList(); return MenuInfoOnMapDto.builder() diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java index 61c2108..db6653e 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuOnMapDto.java @@ -2,7 +2,7 @@ import com.ourmenu.backend.domain.cache.domain.MenuPin; import com.ourmenu.backend.domain.cache.util.MenuPinConverter; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.store.domain.Map; import java.util.List; @@ -19,14 +19,14 @@ public class MenuOnMapDto { private Double mapX; private Double mapY; - public static MenuOnMapDto from(Map map, List menus, UrlConverter urlConverter) { + public static MenuOnMapDto from(Map map, List menus, UrlConverterService urlConverterService) { List menuPins = menus.stream() .map(Menu::getPin) .toList(); MenuPin menuPin = MenuPinConverter.of(menuPins); - String menuPinImgUrl = urlConverter.getMenuPinMapUrl(menuPin); - String menuPinDisableImgUrl = urlConverter.getMenuPinMapAddDisable(menuPin); + String menuPinImgUrl = urlConverterService.getMenuPinMapUrl(menuPin); + String menuPinDisableImgUrl = urlConverterService.getMenuPinMapAddDisable(menuPin); return MenuOnMapDto.builder() .mapId(map.getId()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java index a9a59b3..0b8fb5b 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuFolderResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import java.util.List; import lombok.AccessLevel; @@ -21,9 +21,9 @@ public class SaveMenuFolderResponse { private int index; public static SaveMenuFolderResponse of(MenuFolder menuFolder, List menuIds, - String defaultMenuFolderImgUrl, UrlConverter urlConverter) { + String defaultMenuFolderImgUrl, UrlConverterService urlConverterService) { String menuFolderImgUrl = menuFolder.getImgUrl(); - String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverterService.getMenuFolderImgUrl(menuFolder.getIcon()); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java index 85b8861..a794e8b 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/SaveMenuResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.Menu; import com.ourmenu.backend.domain.menu.domain.MenuImg; import com.ourmenu.backend.domain.menu.domain.MenuMenuFolder; @@ -34,13 +34,14 @@ public class SaveMenuResponse { private List menuImgUrls; public static SaveMenuResponse of(Menu menu, Store store, Map map, List menuImgs, - List menuMenuFolders, List tags, UrlConverter urlConverter) { - String menuPinImgUrl = urlConverter.getMenuPinAddUrl(menu.getPin()); + List menuMenuFolders, List tags, + UrlConverterService urlConverterService) { + String menuPinImgUrl = urlConverterService.getMenuPinAddUrl(menu.getPin()); List menuFolderIds = menuMenuFolders.stream() .map(MenuMenuFolder::getFolderId) .toList(); List tagImgUrls = tags.stream() - .map(urlConverter::getOrangeTagImgUrl) + .map(urlConverterService::getOrangeTagImgUrl) .toList(); List menuImgUrls = menuImgs.stream() .map(MenuImg::getImgUrl) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java index afbffaf..c98063e 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/UpdateMenuFolderResponse.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.domain.MenuFolder; import com.ourmenu.backend.domain.menu.domain.MenuMenuFolder; import java.util.List; @@ -22,13 +22,13 @@ public class UpdateMenuFolderResponse { private int index; public static UpdateMenuFolderResponse of(MenuFolder menuFolder, List menuMenuFolders, - String defaultMenuFolderImgUrl, UrlConverter urlConverter) { + String defaultMenuFolderImgUrl, UrlConverterService urlConverterService) { String menuFolderImgUrl = menuFolder.getImgUrl(); if (menuFolderImgUrl == null) { menuFolderImgUrl = defaultMenuFolderImgUrl; } - String menuFolderIconImgUrl = urlConverter.getMenuFolderImgUrl(menuFolder.getIcon()); + String menuFolderIconImgUrl = urlConverterService.getMenuFolderImgUrl(menuFolder.getIcon()); List menuId = menuMenuFolders.stream() .map(menuMenuFolder -> menuMenuFolder.getMenu().getId()) diff --git a/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java index 4e3ee72..352de93 100644 --- a/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/cache/api/CacheApiTest.java @@ -6,7 +6,7 @@ import com.ourmenu.backend.domain.cache.dto.SimpleMenuFolderIconResponse; import com.ourmenu.backend.domain.cache.dto.SimpleMenuPinResponse; import com.ourmenu.backend.domain.cache.dto.SimpleTagImgResponse; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.global.TestConfig; import com.ourmenu.backend.global.config.GlobalDataConfig; import com.ourmenu.backend.global.data.GlobalUserTestData; @@ -34,7 +34,7 @@ public class CacheApiTest { GlobalUserTestData userTestData; @Autowired - UrlConverter urlConvertor; + UrlConverterService urlConvertor; RestTemplate restTemplate = new RestTemplate(); diff --git a/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java index 69ffbaa..f1696cf 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/home/api/HomeApiTest.java @@ -1,7 +1,7 @@ package com.ourmenu.backend.domain.home.api; import com.ourmenu.backend.domain.cache.domain.HomeImg; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.home.config.HomeTestConfig; import com.ourmenu.backend.domain.home.data.HomeTestData; import com.ourmenu.backend.domain.home.domain.Answer; @@ -31,7 +31,7 @@ public class HomeApiTest { HomeController homeController; @Autowired - UrlConverter urlConverter; + UrlConverterService urlConverterService; @Autowired HomeTestData homeTestData; @@ -104,8 +104,9 @@ void setUp() { Assertions.assertThat(response.getResponse().getAnswerImgUrl()).satisfiesAnyOf( answerImgUrl -> Assertions.assertThat(answerImgUrl) - .isEqualTo(urlConverter.getHomeImgUrl(HomeImg.LIKE1)), - answerImgUrl -> Assertions.assertThat(answerImgUrl).isEqualTo(urlConverter.getHomeImgUrl(HomeImg.LIKE2)) + .isEqualTo(urlConverterService.getHomeImgUrl(HomeImg.LIKE1)), + answerImgUrl -> Assertions.assertThat(answerImgUrl) + .isEqualTo(urlConverterService.getHomeImgUrl(HomeImg.LIKE2)) ); } diff --git a/src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java b/src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java index 1536640..b7b6f5d 100644 --- a/src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java +++ b/src/test/java/com/ourmenu/backend/domain/home/application/HomeImgUrlTest.java @@ -1,7 +1,7 @@ package com.ourmenu.backend.domain.home.application; import com.ourmenu.backend.domain.cache.domain.HomeImg; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.tag.domain.Tag; import java.util.Arrays; import java.util.List; @@ -18,7 +18,7 @@ public class HomeImgUrlTest { @Autowired - UrlConverter urlConverter; + UrlConverterService urlConverterService; RestTemplate restTemplate = new RestTemplate(); @@ -31,7 +31,7 @@ public class HomeImgUrlTest { //then homeImgs.stream().forEach(homeImg -> { - String homeImgUrl = urlConverter.getHomeImgUrl(homeImg); + String homeImgUrl = urlConverterService.getHomeImgUrl(homeImg); ResponseEntity responseEntity = restTemplate.getForEntity(homeImgUrl, String.class); Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); @@ -47,7 +47,7 @@ public class HomeImgUrlTest { //then tags.stream().forEach(tag -> { - String homeRecommendTagImgUrl = urlConverter.getHomeRecommendTagImgUrl(tag); + String homeRecommendTagImgUrl = urlConverterService.getHomeRecommendTagImgUrl(tag); ResponseEntity responseEntity = restTemplate.getForEntity(homeRecommendTagImgUrl, String.class); Assertions.assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue(); Assertions.assertThat(responseEntity.getBody()).isNotEmpty(); diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java index e893d6a..338b25b 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuApiTest.java @@ -1,7 +1,7 @@ package com.ourmenu.backend.domain.menu.api; import com.ourmenu.backend.domain.cache.domain.MenuPin; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; import com.ourmenu.backend.domain.menu.domain.Menu; @@ -36,7 +36,7 @@ public class MenuApiTest { MenuController menuController; @Autowired - UrlConverter urlConverter; + UrlConverterService urlConverterService; @Autowired GlobalUserTestData userTestData; @@ -70,7 +70,7 @@ void setUp() { Assertions.assertThat(response.getResponse().getMenus().size()).isEqualTo(3); Assertions.assertThat(response.getResponse().getMenuFolderIconImgUrl()) - .isEqualTo(urlConverter.getMenuFolderImgUrl(testMenuFolder.getIcon())); + .isEqualTo(urlConverterService.getMenuFolderImgUrl(testMenuFolder.getIcon())); } @Test @@ -89,7 +89,7 @@ void setUp() { Assertions.assertThat(response.getResponse().getMenuMemoTitle()).isEqualTo(menuMemoTitle); Assertions.assertThat(response.getResponse().getMenuPinImgUrl()) - .isEqualTo(urlConverter.getMenuPinAddUrl(MenuPin.BBQ)); + .isEqualTo(urlConverterService.getMenuPinAddUrl(MenuPin.BBQ)); } @Test diff --git a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java index db16f95..1e729b4 100644 --- a/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/menu/api/MenuFolderApiTest.java @@ -1,7 +1,7 @@ package com.ourmenu.backend.domain.menu.api; import com.ourmenu.backend.domain.cache.domain.MenuFolderIcon; -import com.ourmenu.backend.domain.cache.util.UrlConverter; +import com.ourmenu.backend.domain.cache.application.UrlConverterService; import com.ourmenu.backend.domain.menu.config.MenuTestConfig; import com.ourmenu.backend.domain.menu.data.MenuTestData; import com.ourmenu.backend.domain.menu.domain.MenuFolder; @@ -34,7 +34,7 @@ public class MenuFolderApiTest { MenuFolderController menuFolderController; @Autowired - UrlConverter urlConverter; + UrlConverterService urlConverterService; @Autowired GlobalUserTestData userTestData; @@ -157,7 +157,7 @@ void setUp() { .isEqualTo(modifiedMenuFolderName); Assertions.assertThat(updateMenuFolderResponseApiResponse.getResponse().getMenuFolderIconImgUrl()) - .isEqualTo(urlConverter.getMenuFolderImgUrl(testMenuFolder.getIcon())); + .isEqualTo(urlConverterService.getMenuFolderImgUrl(testMenuFolder.getIcon())); } @Test From 4accc248b197f1329be206603e8659f61b7283cc Mon Sep 17 00:00:00 2001 From: Park Jiwon <57484954+david-parkk@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:18:32 +0900 Subject: [PATCH 06/22] =?UTF-8?q?Revert=20"Revert=20"[FIX]=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=8B=A8=EC=88=9C=20=EC=A1=B0=ED=9A=8C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20API=20=EC=88=98=EC=A0=95""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/dto/GetSimpleMenuResponse.java | 5 ++- .../menu/dto/MenuFolderMenuResponse.java | 5 ++- .../domain/store/util/AddressParser.java | 25 +++++++++++++ .../domain/store/unit/AddressTest.java | 37 +++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java create mode 100644 src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java index 3d47086..d77bcc7 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/GetSimpleMenuResponse.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.menu.dto; import com.ourmenu.backend.domain.menu.domain.Menu; +import com.ourmenu.backend.domain.store.util.AddressParser; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -21,11 +22,13 @@ public class GetSimpleMenuResponse { private LocalDateTime createdAt; public static GetSimpleMenuResponse of(Menu menu, String menuImgUrl) { + String storeAddress = AddressParser.parseAddressToCityDistrict(menu.getStore().getAddress()); + return GetSimpleMenuResponse.builder() .menuId(menu.getId()) .menuTitle(menu.getTitle()) .storeTitle(menu.getStore().getTitle()) - .storeAddress(menu.getStore().getAddress()) + .storeAddress(storeAddress) .menuPrice(menu.getPrice()) .menuImgUrl(menuImgUrl) .createdAt(menu.getCreatedAt()) diff --git a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java index 4683d34..af8600f 100644 --- a/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/menu/dto/MenuFolderMenuResponse.java @@ -1,5 +1,6 @@ package com.ourmenu.backend.domain.menu.dto; +import com.ourmenu.backend.domain.store.util.AddressParser; import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -20,11 +21,13 @@ public class MenuFolderMenuResponse { private LocalDateTime createdAt; public static MenuFolderMenuResponse of(MenuSimpleDto menuSimpleDto, String menuImgUrl) { + String storeAddress = AddressParser.parseAddressToCityDistrict(menuSimpleDto.getStoreAddress()); + return MenuFolderMenuResponse.builder() .menuId(menuSimpleDto.getMenuId()) .menuTitle(menuSimpleDto.getMenuTitle()) .storeTitle(menuSimpleDto.getStoreTitle()) - .storeAddress(menuSimpleDto.getStoreAddress()) + .storeAddress(storeAddress) .menuPrice(menuSimpleDto.getMenuPrice()) .menuImgUrl(menuImgUrl) .createdAt(menuSimpleDto.getCreatedAt()) diff --git a/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java b/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java new file mode 100644 index 0000000..4fd7788 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/store/util/AddressParser.java @@ -0,0 +1,25 @@ +package com.ourmenu.backend.domain.store.util; + +import java.util.Arrays; +import java.util.List; + +public class AddressParser { + + private AddressParser() { + } + + private static List parseAddress(String address) { + return Arrays.stream(address.split(" ")).toList(); + } + + public static String parseAddressToCityDistrict(String address) { + List addresses = parseAddress(address); + if (addresses.size() >= 2) { + return addresses.get(0) + " " + addresses.get(1); + } + if (addresses.size() == 1) { + return addresses.get(0); + } + return ""; + } +} diff --git a/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java b/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java new file mode 100644 index 0000000..512cc32 --- /dev/null +++ b/src/test/java/com/ourmenu/backend/domain/store/unit/AddressTest.java @@ -0,0 +1,37 @@ +package com.ourmenu.backend.domain.store.unit; + +import com.ourmenu.backend.domain.store.util.AddressParser; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +@DisplayName("주소 파싱 단위 테스트") +public class AddressTest { + + + @Test + void 상세주소를_시_구_조합으로_변환_할_수_있다() { + //given + String cityDistrict = "서울 광진구"; + String address = "서울 광진구 능동로16길 57 (우)05021"; + + //when + String simpleAddress = AddressParser.parseAddressToCityDistrict(address); + + //then + Assertions.assertThat(simpleAddress).isEqualTo(cityDistrict); + } + + @Test + void 옳지못한_주소에_대해서_예외를_발생시키지_않는다() { + //given + String address = "서울"; + + //when + String simpleAddress = AddressParser.parseAddressToCityDistrict(address); + + //then + Assertions.assertThat(simpleAddress).isEqualTo(address); + } + +} From c901d873fd51b9e47d45f01e007d02e544663492 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Tue, 10 Jun 2025 13:25:57 +0900 Subject: [PATCH 07/22] =?UTF-8?q?docs:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=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 - 기술 스택, 아키 텍처 추가 --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9eb844d..e75cc0f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ -# OurMenu-BE-V2 -OurMenu-BE-V2 +## 기술 스택 + +

drawing

+ +## 아키텍처 + +

drawing

\ No newline at end of file From 985ca40bfe1aaf0cd9d34e35cf63c4bc61a35469 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Wed, 25 Jun 2025 17:41:58 +0900 Subject: [PATCH 08/22] =?UTF-8?q?feat:=20TimeZone=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker compose --- infra/docker/docker-compose.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/infra/docker/docker-compose.yml b/infra/docker/docker-compose.yml index 319012a..ff6b791 100644 --- a/infra/docker/docker-compose.yml +++ b/infra/docker/docker-compose.yml @@ -10,6 +10,7 @@ services: ports: - "8080:8080" environment: + TZ: Asia/Seoul KAKAO_API_KEY: ${KAKAO_API_KEY} MONGO_URL: ${MONGO_URL} MYSQL_HOST: ${MYSQL_HOST} @@ -22,4 +23,5 @@ services: SPRING_SWAGGER_SERVER_URL: ${URL} DEFAULT_BUCKET_URL: ${DEFAULT_BUCKET_URL} volumes: - - /var/log/springboot/:/var/log/springboot/ \ No newline at end of file + - /var/log/springboot/:/var/log/springboot/ + - /etc/localtime:/etc/localtime:ro From 31982a4abc7d849b0f1ae42934ac8e8f0b1f2c34 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 27 Jun 2025 17:08:23 +0900 Subject: [PATCH 09/22] =?UTF-8?q?fix:=20=ED=86=A0=ED=81=B0=20Claim=20SignI?= =?UTF-8?q?nType=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 9 +++++---- .../backend/global/util/JwtTokenProvider.java | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index e22a706..774e9af 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -65,7 +65,7 @@ public TokenDto signUp(SignUpRequest request) { throw new InvalidMealTimeCountException(); } - TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail()); + TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), request.getSignInType()); RefreshToken refreshToken = new RefreshToken(tokenDto.getRefreshToken(), request.getEmail()); refreshTokenRepository.save(refreshToken); return tokenDto; @@ -90,7 +90,7 @@ public TokenDto signIn(SignInRequest request) { throw new NotMatchPasswordException(); } - TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail()); + TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), request.getSignInType()); Optional refreshToken = refreshTokenRepository.findRefreshTokenByEmail(request.getEmail()); if (refreshToken.isPresent()) { @@ -158,6 +158,7 @@ public UserDto getUserInfo(CustomUserDetails userDetails) { public TokenDto reissueToken(ReissueRequest reissueRequest) { String refreshToken = reissueRequest.getRefreshToken(); String email = jwtTokenProvider.getEmailFromToken(refreshToken); + String signInType = jwtTokenProvider.getSignInTypeFromToken(refreshToken); if (email.isEmpty()) { throw new InvalidTokenException(); @@ -170,11 +171,11 @@ public TokenDto reissueToken(ReissueRequest reissueRequest) { RefreshToken storedToken = refreshTokenRepository.findRefreshTokenByEmail(email) .orElseThrow(NotMatchTokenException::new); - String newAccessToken = jwtTokenProvider.createToken(email, "Access"); + String newAccessToken = jwtTokenProvider.createToken(email, signInType, "Access"); String newRefreshToken = reissueRequest.getRefreshToken(); if (jwtTokenProvider.validateToken(refreshToken)) { - newRefreshToken = jwtTokenProvider.createToken(email, "Refresh"); + newRefreshToken = jwtTokenProvider.createToken(email, signInType, "Refresh"); storedToken.updateToken(newRefreshToken); refreshTokenRepository.save(storedToken); } diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index d918aa2..c898869 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -3,6 +3,7 @@ import com.ourmenu.backend.domain.user.application.CustomUserDetailsService; import com.ourmenu.backend.domain.user.dao.RefreshTokenRepository; import com.ourmenu.backend.domain.user.domain.RefreshToken; +import com.ourmenu.backend.domain.user.domain.SignInType; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.domain.user.exception.InvalidTokenException; import com.ourmenu.backend.domain.user.exception.TokenExpiredExcpetion; @@ -89,12 +90,12 @@ public String getHeaderToken(HttpServletRequest request, String type) { * @param email User의 Email * @return JWT 정보를 DTO로 반환 */ - public TokenDto createAllToken(String email) { + public TokenDto createAllToken(String email, String signInType) { Date now = new Date(); - String accessToken = createToken(email, "Access"); + String accessToken = createToken(email, signInType, "Access"); - String refreshToken = createToken(email, "Refresh"); + String refreshToken = createToken(email, signInType,"Refresh"); Instant refreshTokenExpiredAt = Instant.now().plus(30, ChronoUnit.DAYS); @@ -108,11 +109,12 @@ public TokenDto createAllToken(String email) { * @param type Token의 종류 * @return 생성한 Token값 */ - public String createToken(String email, String type) { + public String createToken(String email, String signInType, String type) { Date date = new Date(); Claims claims = Jwts.claims(); + claims.put("signInType", signInType); claims.put("email", email); long time = ACCESS_TIME; @@ -184,6 +186,12 @@ public String getEmailFromToken(String token) { .get("email", String.class); } + public String getSignInTypeFromToken(String token) { + return Jwts.parserBuilder().setSigningKey(key).build() + .parseClaimsJws(token).getBody() + .get("signInType", String.class); + } + /** * Response의 Header에 AccessToken값을 설정 * From 93342b14e9fb27297cfe17a92dd4024077a9f128 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 27 Jun 2025 17:34:01 +0900 Subject: [PATCH 10/22] =?UTF-8?q?feat:=20SignInType=20String=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=20=EB=A9=94=EC=86=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/domain/SignInType.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/domain/SignInType.java b/src/main/java/com/ourmenu/backend/domain/user/domain/SignInType.java index 78339e4..dbd8675 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/domain/SignInType.java +++ b/src/main/java/com/ourmenu/backend/domain/user/domain/SignInType.java @@ -1,5 +1,15 @@ package com.ourmenu.backend.domain.user.domain; +import com.ourmenu.backend.domain.user.exception.UnsupportedSignInTypeException; + public enum SignInType { - EMAIL, KAKAO + EMAIL, KAKAO; + + public static SignInType convert(String signInType) { + try { + return SignInType.valueOf(signInType); + } catch (IllegalArgumentException e) { + throw new UnsupportedSignInTypeException(); + } + } } From 516354e101562fa07b98113650e18e7f5bce4c96 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 27 Jun 2025 17:35:21 +0900 Subject: [PATCH 11/22] =?UTF-8?q?fix:=20RefreshToken=20SignInType=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/dao/RefreshTokenRepository.java | 3 ++- .../backend/domain/user/domain/RefreshToken.java | 6 +++++- .../ourmenu/backend/global/util/JwtTokenProvider.java | 10 +++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dao/RefreshTokenRepository.java b/src/main/java/com/ourmenu/backend/domain/user/dao/RefreshTokenRepository.java index 9ffbee9..a2b9d05 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dao/RefreshTokenRepository.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dao/RefreshTokenRepository.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.user.dao; import com.ourmenu.backend.domain.user.domain.RefreshToken; +import com.ourmenu.backend.domain.user.domain.SignInType; import org.springframework.data.repository.CrudRepository; import java.util.Optional; @@ -8,6 +9,6 @@ public interface RefreshTokenRepository extends CrudRepository { - Optional findRefreshTokenByEmail(String email); + Optional findRefreshTokenByEmailAndSignInType(String email, SignInType signInType); } diff --git a/src/main/java/com/ourmenu/backend/domain/user/domain/RefreshToken.java b/src/main/java/com/ourmenu/backend/domain/user/domain/RefreshToken.java index e1b587a..15719f1 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/domain/RefreshToken.java +++ b/src/main/java/com/ourmenu/backend/domain/user/domain/RefreshToken.java @@ -19,9 +19,13 @@ public class RefreshToken { @Indexed private String email; - public RefreshToken(String token, String email) { + @Indexed + private SignInType signInType; + + public RefreshToken(String token, String email, SignInType signInType) { this.refreshToken = token; this.email = email; + this.signInType = signInType; } public RefreshToken updateToken(String token) { diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index c898869..58c8709 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -90,7 +90,7 @@ public String getHeaderToken(HttpServletRequest request, String type) { * @param email User의 Email * @return JWT 정보를 DTO로 반환 */ - public TokenDto createAllToken(String email, String signInType) { + public TokenDto createAllToken(String email, SignInType signInType) { Date now = new Date(); String accessToken = createToken(email, signInType, "Access"); @@ -109,7 +109,7 @@ public TokenDto createAllToken(String email, String signInType) { * @param type Token의 종류 * @return 생성한 Token값 */ - public String createToken(String email, String signInType, String type) { + public String createToken(String email, SignInType signInType, String type) { Date date = new Date(); @@ -159,7 +159,7 @@ public Boolean refreshTokenValidation(String token) { return false; } - Optional refreshToken = refreshTokenRepository.findRefreshTokenByEmail(getEmailFromToken(token)); + Optional refreshToken = refreshTokenRepository.findRefreshTokenByEmailAndSignInType(getEmailFromToken(token), getSignInTypeFromToken(token)); return refreshToken.isPresent() && token.equals(refreshToken.get().getRefreshToken()); } @@ -186,10 +186,10 @@ public String getEmailFromToken(String token) { .get("email", String.class); } - public String getSignInTypeFromToken(String token) { + public SignInType getSignInTypeFromToken(String token) { return Jwts.parserBuilder().setSigningKey(key).build() .parseClaimsJws(token).getBody() - .get("signInType", String.class); + .get("signInType", SignInType.class); } /** From d7799b1e5cf5e332b66a2da64d2a0e8c9c9785a9 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 27 Jun 2025 17:53:02 +0900 Subject: [PATCH 12/22] =?UTF-8?q?fix:=20SignInType=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 28 +++++++++++++------ .../filter/JwtAuthenticationFilter.java | 4 ++- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 774e9af..799420b 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -65,8 +65,12 @@ public TokenDto signUp(SignUpRequest request) { throw new InvalidMealTimeCountException(); } - TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), request.getSignInType()); - RefreshToken refreshToken = new RefreshToken(tokenDto.getRefreshToken(), request.getEmail()); + TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), SignInType.convert(request.getSignInType())); + RefreshToken refreshToken = new RefreshToken( + tokenDto.getRefreshToken(), + request.getEmail(), + SignInType.convert(request.getSignInType()) + ); refreshTokenRepository.save(refreshToken); return tokenDto; } @@ -90,13 +94,18 @@ public TokenDto signIn(SignInRequest request) { throw new NotMatchPasswordException(); } - TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), request.getSignInType()); - Optional refreshToken = refreshTokenRepository.findRefreshTokenByEmail(request.getEmail()); + TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), SignInType.convert(request.getSignInType())); + Optional refreshToken = refreshTokenRepository + .findRefreshTokenByEmailAndSignInType(request.getEmail(), SignInType.convert(request.getSignInType())); if (refreshToken.isPresent()) { refreshTokenRepository.save(refreshToken.get().updateToken(tokenDto.getRefreshToken())); } else { - RefreshToken newToken = new RefreshToken(tokenDto.getRefreshToken(), request.getEmail()); + RefreshToken newToken = new RefreshToken( + tokenDto.getRefreshToken(), + request.getEmail(), + SignInType.convert(request.getSignInType()) + ); refreshTokenRepository.save(newToken); } @@ -158,7 +167,7 @@ public UserDto getUserInfo(CustomUserDetails userDetails) { public TokenDto reissueToken(ReissueRequest reissueRequest) { String refreshToken = reissueRequest.getRefreshToken(); String email = jwtTokenProvider.getEmailFromToken(refreshToken); - String signInType = jwtTokenProvider.getSignInTypeFromToken(refreshToken); + SignInType signInType = jwtTokenProvider.getSignInTypeFromToken(refreshToken); if (email.isEmpty()) { throw new InvalidTokenException(); @@ -168,7 +177,7 @@ public TokenDto reissueToken(ReissueRequest reissueRequest) { throw new TokenExpiredExcpetion(); } - RefreshToken storedToken = refreshTokenRepository.findRefreshTokenByEmail(email) + RefreshToken storedToken = refreshTokenRepository.findRefreshTokenByEmailAndSignInType(email, signInType) .orElseThrow(NotMatchTokenException::new); String newAccessToken = jwtTokenProvider.createToken(email, signInType, "Access"); @@ -199,8 +208,9 @@ public void signOut(HttpServletRequest request) { } String email = jwtTokenProvider.getEmailFromToken(token); + SignInType signInType = jwtTokenProvider.getSignInTypeFromToken(token); - refreshTokenRepository.findRefreshTokenByEmail(email) + refreshTokenRepository.findRefreshTokenByEmailAndSignInType(email, signInType) .ifPresent(refreshTokenRepository::delete); } @@ -232,7 +242,7 @@ public void removeUser(Long userId) { User user = userRepository.findById(userId) .orElseThrow(NotFoundUserException::new); - refreshTokenRepository.findRefreshTokenByEmail(user.getEmail()) + refreshTokenRepository.findRefreshTokenByEmailAndSignInType(user.getEmail(), user.getSignInType()) .ifPresent(refreshTokenRepository::delete); userRepository.delete(user); diff --git a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java index 7ff997d..5364e60 100644 --- a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.global.filter; +import com.ourmenu.backend.domain.user.domain.SignInType; import com.ourmenu.backend.global.util.JwtTokenProvider; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -34,7 +35,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse if (refreshToken != null && jwtTokenProvider.refreshTokenValidation(refreshToken)) { String email = jwtTokenProvider.getEmailFromToken(refreshToken); - String newAccessToken = jwtTokenProvider.createToken(email, "Access"); + SignInType signInType = jwtTokenProvider.getSignInTypeFromToken(refreshToken); + String newAccessToken = jwtTokenProvider.createToken(email, signInType, "Access"); jwtTokenProvider.setHeaderAccessToken(response, newAccessToken); setAuthentication(jwtTokenProvider.getEmailFromToken(newAccessToken)); filterChain.doFilter(request,response); From 59c468f601ea56c11fcd875a11e243e320c9cd6d Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 27 Jun 2025 18:42:46 +0900 Subject: [PATCH 13/22] =?UTF-8?q?fix:=20=ED=86=A0=ED=81=B0=20SignInType=20?= =?UTF-8?q?String=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/global/util/JwtTokenProvider.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 58c8709..ace383b 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -114,7 +114,7 @@ public String createToken(String email, SignInType signInType, String type) { Date date = new Date(); Claims claims = Jwts.claims(); - claims.put("signInType", signInType); + claims.put("signInType", signInType.name()); claims.put("email", email); long time = ACCESS_TIME; @@ -169,8 +169,8 @@ public Boolean refreshTokenValidation(String token) { * @param email User의 Email * @return 인증 객체(Authentication) */ - public Authentication createAuthentication(String email) { - UserDetails userDetails = customUserDetailsService.loadUserByUsername(email); + public Authentication createAuthentication(String email, SignInType signInType) { + UserDetails userDetails = customUserDetailsService.loadUserByEmailAndSignInType(email, signInType); return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); } @@ -187,9 +187,11 @@ public String getEmailFromToken(String token) { } public SignInType getSignInTypeFromToken(String token) { - return Jwts.parserBuilder().setSigningKey(key).build() + String signInType = Jwts.parserBuilder().setSigningKey(key).build() .parseClaimsJws(token).getBody() - .get("signInType", SignInType.class); + .get("signInType", String.class); + + return SignInType.convert(signInType); } /** From e8708e2cd8aac1c5ebbd112d8ffd9c7be323c50d Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 27 Jun 2025 18:43:12 +0900 Subject: [PATCH 14/22] =?UTF-8?q?fix:=20=EC=9C=A0=EC=A0=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/application/CustomUserDetailsService.java | 14 +++++++++++++- .../domain/user/application/EmailService.java | 3 ++- .../domain/user/application/UserService.java | 10 ++++++---- .../backend/domain/user/dao/UserRepository.java | 3 ++- .../global/filter/JwtAuthenticationFilter.java | 11 +++++++---- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java b/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java index 2186b43..8c1200d 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java @@ -1,6 +1,7 @@ package com.ourmenu.backend.domain.user.application; import com.ourmenu.backend.domain.user.dao.UserRepository; +import com.ourmenu.backend.domain.user.domain.SignInType; import com.ourmenu.backend.domain.user.domain.User; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; import com.ourmenu.backend.domain.user.exception.NotFoundUserException; @@ -21,7 +22,18 @@ public class CustomUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { - User user= userRepository.findByEmail(email). + User user= userRepository.findByEmailAndSignInType(email, SignInType.EMAIL). + orElseThrow(NotFoundUserException::new); + + return new CustomUserDetails( + user.getId(), + user.getEmail(), + user.getPassword() + ); + } + + public UserDetails loadUserByEmailAndSignInType(String email, SignInType signInType) throws UsernameNotFoundException { + User user= userRepository.findByEmailAndSignInType(email, signInType). orElseThrow(NotFoundUserException::new); return new CustomUserDetails( diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index c07a95b..ec20aca 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -3,6 +3,7 @@ import com.ourmenu.backend.domain.user.dao.ConfirmCodeRepository; import com.ourmenu.backend.domain.user.dao.UserRepository; import com.ourmenu.backend.domain.user.domain.ConfirmCode; +import com.ourmenu.backend.domain.user.domain.SignInType; import com.ourmenu.backend.domain.user.domain.User; import com.ourmenu.backend.domain.user.dto.request.PostEmailRequest; import com.ourmenu.backend.domain.user.dto.response.EmailResponse; @@ -84,7 +85,7 @@ public void verifyConfirmCode(VerifyEmailRequest request){ public TemporaryPasswordResponse sendTemporaryPassword(PostEmailRequest request) { String email = request.getEmail(); String temporaryPassword = generateRandomCode(8); - User user = userRepository.findByEmail(email) + User user = userRepository.findByEmailAndSignInType(email, SignInType.EMAIL) .orElseThrow(NotFoundUserException::new); user.changePassword(passwordEncoder.encode(temporaryPassword)); diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 799420b..1b5c7cb 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -83,7 +83,9 @@ public TokenDto signUp(SignUpRequest request) { */ @Transactional public TokenDto signIn(SignInRequest request) { - Optional optionalUser = userRepository.findByEmail(request.getEmail()); + Optional optionalUser = userRepository + .findByEmailAndSignInType(request.getEmail(), SignInType.convert(request.getSignInType())); + if (optionalUser.isEmpty() || !optionalUser.get().getSignInType().name().equals(request.getSignInType())) { throw new NotFoundUserException(); } @@ -223,7 +225,7 @@ public void signOut(HttpServletRequest request) { public KakaoExistenceResponse validateKakaoUserExists(PostEmailRequest request) { String email = request.getEmail(); - Optional optionalUser = userRepository.findByEmail(email); + Optional optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.KAKAO); if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.KAKAO) { return KakaoExistenceResponse.from(true); @@ -274,7 +276,7 @@ private User saveUser(SignUpRequest request) { * @return */ private User signUpByKakao(SignUpRequest request) { - Optional optionalUser = userRepository.findByEmail(request.getEmail()); + Optional optionalUser = userRepository.findByEmailAndSignInType(request.getEmail(), SignInType.KAKAO); if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.KAKAO) { throw new DuplicateEmailException(); } @@ -294,7 +296,7 @@ private User signUpByKakao(SignUpRequest request) { * @return */ private User signUpByEmail(SignUpRequest request) { - Optional optionalUser = userRepository.findByEmail(request.getEmail()); + Optional optionalUser = userRepository.findByEmailAndSignInType(request.getEmail(), SignInType.EMAIL); if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.EMAIL) { throw new DuplicateEmailException(); } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dao/UserRepository.java b/src/main/java/com/ourmenu/backend/domain/user/dao/UserRepository.java index 935c7f2..019dade 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dao/UserRepository.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dao/UserRepository.java @@ -1,10 +1,11 @@ package com.ourmenu.backend.domain.user.dao; +import com.ourmenu.backend.domain.user.domain.SignInType; import com.ourmenu.backend.domain.user.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository { - Optional findByEmail(String email); + Optional findByEmailAndSignInType(String email, SignInType signInType); } diff --git a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java index 5364e60..44e90d3 100644 --- a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java @@ -28,7 +28,10 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse String refreshToken = jwtTokenProvider.getHeaderToken(request, "Refresh_token"); if(accessToken != null && jwtTokenProvider.validateToken(accessToken)) { - setAuthentication(jwtTokenProvider.getEmailFromToken(accessToken)); + setAuthentication( + jwtTokenProvider.getEmailFromToken(accessToken), + jwtTokenProvider.getSignInTypeFromToken(accessToken) + ); filterChain.doFilter(request,response); return; } @@ -38,7 +41,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse SignInType signInType = jwtTokenProvider.getSignInTypeFromToken(refreshToken); String newAccessToken = jwtTokenProvider.createToken(email, signInType, "Access"); jwtTokenProvider.setHeaderAccessToken(response, newAccessToken); - setAuthentication(jwtTokenProvider.getEmailFromToken(newAccessToken)); + setAuthentication(jwtTokenProvider.getEmailFromToken(newAccessToken), signInType); filterChain.doFilter(request,response); return; } @@ -46,8 +49,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse filterChain.doFilter(request,response); } - public void setAuthentication(String email) { - Authentication authentication = jwtTokenProvider.createAuthentication(email); + public void setAuthentication(String email, SignInType signInType) { + Authentication authentication = jwtTokenProvider.createAuthentication(email, signInType); SecurityContextHolder.getContext().setAuthentication(authentication); } From 8e2031b4a265f10f2280c65a3177908df123b16d Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 27 Jun 2025 18:49:29 +0900 Subject: [PATCH 15/22] =?UTF-8?q?fix:=20NoArgsConstructor=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/dto/response/ReissueRequest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java index 3c6b16b..c13bf2f 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/ReissueRequest.java @@ -3,8 +3,10 @@ import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor @AllArgsConstructor public class ReissueRequest { From bf2dda7721d747f378f01c8aec24a5d40bbe72dd Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sat, 28 Jun 2025 19:44:41 +0900 Subject: [PATCH 16/22] =?UTF-8?q?test:=20=EC=A4=91=EB=B3=B5=20=EA=B3=84?= =?UTF-8?q?=EC=A0=95=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/UserApiTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index fe3eaed..9926b99 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -209,4 +209,25 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); } + + @Test + public void 하나의_이메일을_다른_방식으로_회원가입할_수_있다() throws Exception{ + //given + userTestData.createTestEmailUser(); + + List mealTime = new ArrayList<>(); + mealTime.add(LocalTime.of(12, 0)); + mealTime.add(LocalTime.of(16, 0)); + SignUpRequest signUpRequest = new SignUpRequest("test123@gmail.com", + "password123", + mealTime, + "KAKAO" + ); + + //when + ApiResponse response = userController.signUp(signUpRequest); + + //then + Assertions.assertThat(response.isSuccess()).isEqualTo(true); + } } From 9efee1ca06578a25f09ba92c50585fd8d9fad69d Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sat, 28 Jun 2025 20:05:49 +0900 Subject: [PATCH 17/22] =?UTF-8?q?refactor:=20UserService=20=EA=B0=80?= =?UTF-8?q?=EB=8F=85=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 72 +++++++++---------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 1b5c7cb..0ca7d6a 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -55,8 +55,15 @@ public class UserService { */ @Transactional public TokenDto signUp(SignUpRequest request) { + SignInType signInType = SignInType.convert(request.getSignInType()); + String email = request.getEmail(); + User savedUser; - User savedUser = saveUser(request); + if (signInType.equals(SignInType.KAKAO)) { + savedUser = signUpByKakao(email); + } else { + savedUser = signUpByEmail(email, request.getPassword()); + } List mealTimes = mealTimeService.saveMealTimes(request.getMealTime(), savedUser.getId()); @@ -65,11 +72,11 @@ public TokenDto signUp(SignUpRequest request) { throw new InvalidMealTimeCountException(); } - TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), SignInType.convert(request.getSignInType())); + TokenDto tokenDto = jwtTokenProvider.createAllToken(email, signInType); RefreshToken refreshToken = new RefreshToken( tokenDto.getRefreshToken(), - request.getEmail(), - SignInType.convert(request.getSignInType()) + email, + signInType ); refreshTokenRepository.save(refreshToken); return tokenDto; @@ -83,30 +90,33 @@ public TokenDto signUp(SignUpRequest request) { */ @Transactional public TokenDto signIn(SignInRequest request) { + String email = request.getEmail(); + SignInType signInType = SignInType.convert(request.getSignInType()); + Optional optionalUser = userRepository - .findByEmailAndSignInType(request.getEmail(), SignInType.convert(request.getSignInType())); + .findByEmailAndSignInType(email, signInType); - if (optionalUser.isEmpty() || !optionalUser.get().getSignInType().name().equals(request.getSignInType())) { + if (optionalUser.isEmpty() || !optionalUser.get().getSignInType().equals(signInType)) { throw new NotFoundUserException(); } User user = optionalUser.get(); - if (request.getSignInType().equals("EMAIL") && !passwordEncoder.matches(request.getPassword(), user.getPassword())) { + if (signInType.equals(SignInType.EMAIL) && !passwordEncoder.matches(request.getPassword(), user.getPassword())) { throw new NotMatchPasswordException(); } - TokenDto tokenDto = jwtTokenProvider.createAllToken(request.getEmail(), SignInType.convert(request.getSignInType())); + TokenDto tokenDto = jwtTokenProvider.createAllToken(email, signInType); Optional refreshToken = refreshTokenRepository - .findRefreshTokenByEmailAndSignInType(request.getEmail(), SignInType.convert(request.getSignInType())); + .findRefreshTokenByEmailAndSignInType(email, signInType); if (refreshToken.isPresent()) { refreshTokenRepository.save(refreshToken.get().updateToken(tokenDto.getRefreshToken())); } else { RefreshToken newToken = new RefreshToken( tokenDto.getRefreshToken(), - request.getEmail(), - SignInType.convert(request.getSignInType()) + email, + signInType ); refreshTokenRepository.save(newToken); } @@ -227,7 +237,7 @@ public KakaoExistenceResponse validateKakaoUserExists(PostEmailRequest request) Optional optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.KAKAO); - if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.KAKAO) { + if (optionalUser.isPresent() && optionalUser.get().getSignInType().equals(SignInType.KAKAO)) { return KakaoExistenceResponse.from(true); } @@ -250,39 +260,20 @@ public void removeUser(Long userId) { userRepository.delete(user); } - /** - * 유저 정보를 저장한다. - * - * @param request - * @return - * @throws UnsupportedSignInTypeException 지원하지 않는 SignInType을 요청한 경우 - */ - private User saveUser(SignUpRequest request) { - if (request.getSignInType().equals("EMAIL")) { - return signUpByEmail(request); - } - - if (request.getSignInType().equals("KAKAO")) { - return signUpByKakao(request); - } - - throw new UnsupportedSignInTypeException(); - } - /** * Kakao 유저를 저장한다. * - * @param request + * @param email * @return */ - private User signUpByKakao(SignUpRequest request) { - Optional optionalUser = userRepository.findByEmailAndSignInType(request.getEmail(), SignInType.KAKAO); + private User signUpByKakao(String email) { + Optional optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.KAKAO); if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.KAKAO) { throw new DuplicateEmailException(); } User user = User.builder() - .email(request.getEmail()) + .email(email) .signInType(SignInType.KAKAO) .build(); @@ -292,19 +283,20 @@ private User signUpByKakao(SignUpRequest request) { /** * Email 유저를 저장한다. * - * @param request + * @param email + * @param password * @return */ - private User signUpByEmail(SignUpRequest request) { - Optional optionalUser = userRepository.findByEmailAndSignInType(request.getEmail(), SignInType.EMAIL); + private User signUpByEmail(String email, String password) { + Optional optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.EMAIL); if (optionalUser.isPresent() && optionalUser.get().getSignInType() == SignInType.EMAIL) { throw new DuplicateEmailException(); } - String encodedPassword = passwordEncoder.encode(request.getPassword()); + String encodedPassword = passwordEncoder.encode(password); User user = User.builder() - .email(request.getEmail()) + .email(email) .password(encodedPassword) .signInType(SignInType.EMAIL) .build(); From 8a3b54cec1e7718bf4efd13e905e75ff7b79b076 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sat, 28 Jun 2025 20:42:17 +0900 Subject: [PATCH 18/22] =?UTF-8?q?fix:=20UserDetailService=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/CustomUserDetailsService.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java b/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java index 8c1200d..d391bb5 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java @@ -8,30 +8,16 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor @Slf4j -public class CustomUserDetailsService implements UserDetailsService { +public class CustomUserDetailsService { private final UserRepository userRepository; - @Override - public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { - - User user= userRepository.findByEmailAndSignInType(email, SignInType.EMAIL). - orElseThrow(NotFoundUserException::new); - - return new CustomUserDetails( - user.getId(), - user.getEmail(), - user.getPassword() - ); - } - public UserDetails loadUserByEmailAndSignInType(String email, SignInType signInType) throws UsernameNotFoundException { User user= userRepository.findByEmailAndSignInType(email, signInType). orElseThrow(NotFoundUserException::new); From a4b8f3b9b27c19eecedbd5f82ef46f119013b991 Mon Sep 17 00:00:00 2001 From: Park Jiwon <57484954+david-parkk@users.noreply.github.com> Date: Mon, 7 Jul 2025 18:06:17 +0900 Subject: [PATCH 19/22] =?UTF-8?q?docs:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=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 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e75cc0f..0b415f3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## 기술 스택 -

drawing

+

drawing

## 아키텍처 -

drawing

\ No newline at end of file +

drawing

From 9f6d4e6ae0108f06de13d5c22bd235336adc742e Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 16 Jul 2025 17:38:09 +0900 Subject: [PATCH 20/22] =?UTF-8?q?fix:=20AccessToken=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EA=B8=B0=EA=B0=84=20=EC=9E=84=EC=8B=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/global/util/JwtTokenProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index ace383b..911e203 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -45,7 +45,7 @@ public class JwtTokenProvider { private Key key; private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; - private static final long ACCESS_TIME = 60 * 60 * 1000L; // 1시간 + private static final long ACCESS_TIME = 30 * 24 * 60 * 60 * 1000L; // 1시간 -> 30일로 임시 변경 private static final long REFRESH_TIME = 30 * 24 * 60 * 60 * 1000L; // 30일 public static final String ACCESS_TOKEN = "Authorization"; public static final String REFRESH_TOKEN = "Refresh-Token"; From e2b46ae4e9184f2b8eb93f3214be296806aad785 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 16 Jul 2025 17:52:53 +0900 Subject: [PATCH 21/22] =?UTF-8?q?fix:=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=20=EC=A1=B4=EC=9E=AC=20=EC=8B=9C=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 3 ++- .../dto/response/KakaoExistenceResponse.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 0ca7d6a..7638d15 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -238,7 +238,8 @@ public KakaoExistenceResponse validateKakaoUserExists(PostEmailRequest request) Optional optionalUser = userRepository.findByEmailAndSignInType(email, SignInType.KAKAO); if (optionalUser.isPresent() && optionalUser.get().getSignInType().equals(SignInType.KAKAO)) { - return KakaoExistenceResponse.from(true); + TokenDto token = jwtTokenProvider.createAllToken(email, SignInType.KAKAO); + return KakaoExistenceResponse.from(true, token); } return KakaoExistenceResponse.from(false); diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/KakaoExistenceResponse.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/KakaoExistenceResponse.java index af611bb..580ba42 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/KakaoExistenceResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/KakaoExistenceResponse.java @@ -3,15 +3,31 @@ import lombok.Builder; import lombok.Getter; +import java.time.Instant; + @Getter @Builder public class KakaoExistenceResponse { private boolean isExistUser; + private String grantType; + private String accessToken; + private String refreshToken; + private Instant refreshTokenExpiredAt; public static KakaoExistenceResponse from(boolean isExistUser){ return KakaoExistenceResponse.builder() .isExistUser(isExistUser) .build(); } + + public static KakaoExistenceResponse from(boolean isExistUser, TokenDto tokenDto){ + return KakaoExistenceResponse.builder() + .isExistUser(isExistUser) + .grantType(tokenDto.getGrantType()) + .accessToken(tokenDto.getAccessToken()) + .refreshToken(tokenDto.getRefreshToken()) + .refreshTokenExpiredAt(tokenDto.getRefreshTokenExpiredAt()) + .build(); + } } From 6b4712037a74a936a66a77cb77eb6afd305cd65b Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 16 Jul 2025 17:55:13 +0900 Subject: [PATCH 22/22] =?UTF-8?q?test:=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20API=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- .../java/com/ourmenu/backend/domain/user/api/UserApiTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java index 9926b99..14b0109 100644 --- a/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java +++ b/src/test/java/com/ourmenu/backend/domain/user/api/UserApiTest.java @@ -100,6 +100,7 @@ void setUp() { //then Assertions.assertThat(response.isSuccess()).isEqualTo(true); + Assertions.assertThat(response.getResponse().isExistUser()).isEqualTo(true); } @Test