From f725de5eeb1c7d609f8264651f43f1c0e896de02 Mon Sep 17 00:00:00 2001 From: seungin Date: Wed, 20 Aug 2025 10:28:47 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[refactor]=20=EC=9B=A8=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=A1=B4=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20swagger=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/user/controller/UserPlaceController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java index 7c1388a..49a618b 100644 --- a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java +++ b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java @@ -55,7 +55,7 @@ public CommonResponse createPlaceList( } @GetMapping - @Operation(summary = "내 장소 리스트 요약 조회", description = "장소 관련 목록(리스트)만 반환합니다(개수 포함).") + @Operation(summary = "내가 저장한 리스트 요약 조회", description = "장소 관련 목록(리스트)만 반환합니다.") @ApiResponses({ @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "404", description = "유저를 찾을 수 없음"), @@ -71,7 +71,7 @@ public CommonResponse> getMyPlaceSummaries( @DeleteMapping @Operation( - summary = "장소에서 웨이블존 제거", + summary = "내가 저장한 리스트에서 웨이블존 제거", description = "RequestBody로 placeId, waybleZoneId를 받아 지정한 장소에서 웨이블존을 제거합니다." ) @ApiResponses({ @@ -84,7 +84,7 @@ public CommonResponse removeZoneFromPlace( @RequestBody @Valid UserPlaceRemoveRequestDto request ) { userPlaceService.removeZoneFromPlace(userId, request.placeId(), request.waybleZoneId()); - return CommonResponse.success("제거되었습니다."); + return CommonResponse.success("성공적으로 제거되었습니다."); } @PostMapping("/zones") @@ -103,8 +103,8 @@ public CommonResponse addZonesToPlace( } @GetMapping("/zones") - @Operation(summary = "특정 장소 내 웨이블존 목록 조회(페이징)", - description = "placeId로 해당 장소 내부의 웨이블존 카드 목록을 반환합니다. (page는 0부터 시작.)") + @Operation(summary = "저장한 리스트 내 웨이블존 목록 조회(페이징)", + description = "placeId로 해당 장소 내부의 웨이블존 목록을 반환합니다. (page는 0부터 시작.)") @ApiResponses({ @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "404", description = "유저/장소를 찾을 수 없음"), From b1df4ead54dc3fe0f671b3be44873fd024f8f781 Mon Sep 17 00:00:00 2001 From: seungin Date: Wed, 20 Aug 2025 11:30:33 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[fix]=20=ED=95=98=EB=82=98=EC=9D=98=20?= =?UTF-8?q?=EC=9B=A8=EC=9D=B4=EB=B8=94=EC=A1=B4=EC=97=90=20=EC=97=AC?= =?UTF-8?q?=EB=9F=AC=EA=B0=9C=EC=9D=98=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserPlaceController.java | 12 ++++---- .../user/dto/UserPlaceAddZonesRequestDto.java | 4 +-- .../server/user/dto/UserPlaceRequestDto.java | 9 ------ .../server/user/dto/UserResponseDto.java | 4 --- .../server/user/exception/UserErrorCase.java | 2 +- .../server/user/service/UserPlaceService.java | 30 +++++++++++-------- 6 files changed, 26 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/com/wayble/server/user/dto/UserPlaceRequestDto.java delete mode 100644 src/main/java/com/wayble/server/user/dto/UserResponseDto.java diff --git a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java index 49a618b..a0a7151 100644 --- a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java +++ b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java @@ -69,7 +69,7 @@ public CommonResponse> getMyPlaceSummaries( return CommonResponse.success(summaries); } - @DeleteMapping + @DeleteMapping("/zones") @Operation( summary = "내가 저장한 리스트에서 웨이블존 제거", description = "RequestBody로 placeId, waybleZoneId를 받아 지정한 장소에서 웨이블존을 제거합니다." @@ -88,18 +88,18 @@ public CommonResponse removeZoneFromPlace( } @PostMapping("/zones") - @Operation(summary = "리스트에 웨이블존 추가", - description = "placeId와 waybleZoneId 배열을 받아 여러 웨이블존을 리스트에 추가합니다.") + @Operation(summary = "웨이블존에 저장한 리스트 추가 (여러개 가능)", + description = "웨이블존에 사용자가 요청한 리스트들을 추가합니다.") @ApiResponses({ - @ApiResponse(responseCode = "200", description = "웨이블존 추가 성공"), + @ApiResponse(responseCode = "200", description = "웨이블존에 리스트 추가 성공"), @ApiResponse(responseCode = "404", description = "유저/리스트/웨이블존을 찾을 수 없음") }) public CommonResponse addZonesToPlace( @Parameter(hidden = true) @CurrentUser Long userId, @RequestBody @Valid UserPlaceAddZonesRequestDto request ) { - userPlaceService.addZonesToPlace(userId, request.placeId(), request.waybleZoneIds()); - return CommonResponse.success("리스트에 웨이블존이 추가되었습니다."); + int added = userPlaceService.addZoneToPlaces(userId, request.placeIds(), request.waybleZoneId()); + return CommonResponse.success(String.format("%d개 리스트에 추가되었습니다.", added)); } @GetMapping("/zones") diff --git a/src/main/java/com/wayble/server/user/dto/UserPlaceAddZonesRequestDto.java b/src/main/java/com/wayble/server/user/dto/UserPlaceAddZonesRequestDto.java index bd1524c..ae986b4 100644 --- a/src/main/java/com/wayble/server/user/dto/UserPlaceAddZonesRequestDto.java +++ b/src/main/java/com/wayble/server/user/dto/UserPlaceAddZonesRequestDto.java @@ -5,6 +5,6 @@ import java.util.List; public record UserPlaceAddZonesRequestDto( - @NotNull Long placeId, - @NotEmpty List waybleZoneIds + @NotEmpty List<@NotNull Long> placeIds, + @NotNull Long waybleZoneId ) {} diff --git a/src/main/java/com/wayble/server/user/dto/UserPlaceRequestDto.java b/src/main/java/com/wayble/server/user/dto/UserPlaceRequestDto.java deleted file mode 100644 index a265e39..0000000 --- a/src/main/java/com/wayble/server/user/dto/UserPlaceRequestDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.wayble.server.user.dto; - -import jakarta.validation.constraints.NotNull; - -public record UserPlaceRequestDto( - @NotNull Long waybleZoneId, - @NotNull String title, - String color -) {} diff --git a/src/main/java/com/wayble/server/user/dto/UserResponseDto.java b/src/main/java/com/wayble/server/user/dto/UserResponseDto.java deleted file mode 100644 index 7e5a712..0000000 --- a/src/main/java/com/wayble/server/user/dto/UserResponseDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.wayble.server.user.dto; - -public record UserResponseDto() { -} diff --git a/src/main/java/com/wayble/server/user/exception/UserErrorCase.java b/src/main/java/com/wayble/server/user/exception/UserErrorCase.java index 1d28320..4fb835a 100644 --- a/src/main/java/com/wayble/server/user/exception/UserErrorCase.java +++ b/src/main/java/com/wayble/server/user/exception/UserErrorCase.java @@ -23,7 +23,7 @@ public enum UserErrorCase implements ErrorCase { NICKNAME_DUPLICATED(409,1013, "이미 사용 중인 닉네임입니다."), PLACE_NOT_FOUND(404, 1014, "저장된 장소를 찾을 수 없습니다."), PLACE_MAPPING_NOT_FOUND(404, 1015, "해당 장소에 해당 웨이블존이 없습니다."), - PLACE_TITLE_DUPLICATED(400, 1016, "동일한 이름의 리스트가 이미 있습니다."); + PLACE_TITLE_DUPLICATED(409, 1016, "동일한 이름의 리스트가 이미 있습니다."); private final Integer httpStatusCode; private final Integer errorCode; diff --git a/src/main/java/com/wayble/server/user/service/UserPlaceService.java b/src/main/java/com/wayble/server/user/service/UserPlaceService.java index caa4d07..af048e7 100644 --- a/src/main/java/com/wayble/server/user/service/UserPlaceService.java +++ b/src/main/java/com/wayble/server/user/service/UserPlaceService.java @@ -3,7 +3,6 @@ import com.wayble.server.common.exception.ApplicationException; import com.wayble.server.user.dto.UserPlaceCreateRequestDto; -import com.wayble.server.user.dto.UserPlaceRequestDto; import com.wayble.server.user.dto.UserPlaceSummaryDto; import com.wayble.server.user.entity.User; import com.wayble.server.user.entity.UserPlace; @@ -59,18 +58,21 @@ public Long createPlaceList(Long userId, UserPlaceCreateRequestDto request) { } @Transactional - public void addZonesToPlace(Long userId, Long placeId, List waybleZoneIds) { - UserPlace place = userPlaceRepository.findByIdAndUser_Id(placeId, userId) - .orElseThrow(() -> new ApplicationException(UserErrorCase.PLACE_NOT_FOUND)); + public int addZoneToPlaces(Long userId, List placeIds, Long waybleZoneId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new ApplicationException(UserErrorCase.USER_NOT_FOUND)); + + WaybleZone zone = waybleZoneRepository.findById(waybleZoneId) + .orElseThrow(() -> new ApplicationException(UserErrorCase.WAYBLE_ZONE_NOT_FOUND)); - Set uniqueIds = new LinkedHashSet<>(waybleZoneIds); + Set uniquePlaceIds = new LinkedHashSet<>(placeIds); int added = 0; - for (Long zoneId : uniqueIds) { - WaybleZone zone = waybleZoneRepository.findById(zoneId) - .orElseThrow(() -> new ApplicationException(UserErrorCase.WAYBLE_ZONE_NOT_FOUND)); + for (Long placeId : uniquePlaceIds) { + UserPlace place = userPlaceRepository.findByIdAndUser_Id(placeId, user.getId()) + .orElseThrow(() -> new ApplicationException(UserErrorCase.PLACE_NOT_FOUND)); - boolean exists = mappingRepository.existsByUserPlace_IdAndWaybleZone_Id(placeId, zoneId); + boolean exists = mappingRepository.existsByUserPlace_IdAndWaybleZone_Id(placeId, waybleZoneId); if (exists) continue; mappingRepository.save(UserPlaceWaybleZoneMapping.builder() @@ -79,16 +81,18 @@ public void addZonesToPlace(Long userId, Long placeId, List waybleZoneIds) .build()); place.increaseCount(); - zone.addLikes(1); - waybleZoneRepository.save(zone); + userPlaceRepository.save(place); + zone.addLikes(1); // 리스트 하나에 추가될 때마다 +1 added++; } - if (added > 0) userPlaceRepository.save(place); + if (added > 0) { + waybleZoneRepository.save(zone); + } + return added; } - @Transactional(readOnly = true) public List getMyPlaceSummaries(Long userId, String sort) { userRepository.findById(userId) From 76198c7bd88b7a7947c7fbfd66a764b3431f9513 Mon Sep 17 00:00:00 2001 From: seungin Date: Wed, 20 Aug 2025 11:43:20 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[refactor]=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=20=EC=9D=98=EB=AF=B8?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/wayble/server/user/controller/UserPlaceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java index a0a7151..7ca0bfc 100644 --- a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java +++ b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java @@ -94,7 +94,7 @@ public CommonResponse removeZoneFromPlace( @ApiResponse(responseCode = "200", description = "웨이블존에 리스트 추가 성공"), @ApiResponse(responseCode = "404", description = "유저/리스트/웨이블존을 찾을 수 없음") }) - public CommonResponse addZonesToPlace( + public CommonResponse addZoneToPlaces( @Parameter(hidden = true) @CurrentUser Long userId, @RequestBody @Valid UserPlaceAddZonesRequestDto request ) { From 89b59953993dcf1dbb556ff9a9e6ce11ccee6809 Mon Sep 17 00:00:00 2001 From: seungin Date: Wed, 20 Aug 2025 11:58:17 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[refactor]=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserPlaceController.java | 41 ++++++++++--------- .../server/user/service/UserPlaceService.java | 2 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java index 7ca0bfc..1f72bf2 100644 --- a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java +++ b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java @@ -69,26 +69,9 @@ public CommonResponse> getMyPlaceSummaries( return CommonResponse.success(summaries); } - @DeleteMapping("/zones") - @Operation( - summary = "내가 저장한 리스트에서 웨이블존 제거", - description = "RequestBody로 placeId, waybleZoneId를 받아 지정한 장소에서 웨이블존을 제거합니다." - ) - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "제거 성공"), - @ApiResponse(responseCode = "404", description = "장소 또는 매핑 정보를 찾을 수 없음"), - @ApiResponse(responseCode = "403", description = "권한이 없습니다.") - }) - public CommonResponse removeZoneFromPlace( - @Parameter(hidden = true) @CurrentUser Long userId, - @RequestBody @Valid UserPlaceRemoveRequestDto request - ) { - userPlaceService.removeZoneFromPlace(userId, request.placeId(), request.waybleZoneId()); - return CommonResponse.success("성공적으로 제거되었습니다."); - } @PostMapping("/zones") - @Operation(summary = "웨이블존에 저장한 리스트 추가 (여러개 가능)", + @Operation(summary = "웨이블존에 저장한 리스트 추가 (여러 개 가능)", description = "웨이블존에 사용자가 요청한 리스트들을 추가합니다.") @ApiResponses({ @ApiResponse(responseCode = "200", description = "웨이블존에 리스트 추가 성공"), @@ -104,7 +87,7 @@ public CommonResponse addZoneToPlaces( @GetMapping("/zones") @Operation(summary = "저장한 리스트 내 웨이블존 목록 조회(페이징)", - description = "placeId로 해당 장소 내부의 웨이블존 목록을 반환합니다. (page는 0부터 시작.)") + description = "placeId로 해당 장소 내부의 웨이블존 목록을 반환합니다. (page는 1부터 시작.)") @ApiResponses({ @ApiResponse(responseCode = "200", description = "조회 성공"), @ApiResponse(responseCode = "404", description = "유저/장소를 찾을 수 없음"), @@ -113,10 +96,28 @@ public CommonResponse addZoneToPlaces( public CommonResponse> getZonesInPlace( @Parameter(hidden = true) @CurrentUser Long userId, @RequestParam Long placeId, - @RequestParam(defaultValue = "0") @Min(0) Integer page, + @RequestParam(defaultValue = "1") @Min(0) Integer page, @RequestParam(defaultValue = "20") @Min(1) @Max(100) Integer size ) { Page zones = userPlaceService.getZonesInPlace(userId, placeId, page, size); return CommonResponse.success(zones); } + + @DeleteMapping("/zones") + @Operation( + summary = "내가 저장한 리스트에서 웨이블존 제거", + description = "RequestBody로 placeId, waybleZoneId를 받아 지정한 장소에서 웨이블존을 제거합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "제거 성공"), + @ApiResponse(responseCode = "404", description = "장소 또는 매핑 정보를 찾을 수 없음"), + @ApiResponse(responseCode = "403", description = "권한이 없습니다.") + }) + public CommonResponse removeZoneFromPlace( + @Parameter(hidden = true) @CurrentUser Long userId, + @RequestBody @Valid UserPlaceRemoveRequestDto request + ) { + userPlaceService.removeZoneFromPlace(userId, request.placeId(), request.waybleZoneId()); + return CommonResponse.success("성공적으로 제거되었습니다."); + } } diff --git a/src/main/java/com/wayble/server/user/service/UserPlaceService.java b/src/main/java/com/wayble/server/user/service/UserPlaceService.java index af048e7..2be3deb 100644 --- a/src/main/java/com/wayble/server/user/service/UserPlaceService.java +++ b/src/main/java/com/wayble/server/user/service/UserPlaceService.java @@ -117,7 +117,7 @@ public Page getZonesInPlace(Long userId, Long placeId UserPlace place = userPlaceRepository.findByIdAndUser_Id(placeId, userId) .orElseThrow(() -> new ApplicationException(UserErrorCase.PLACE_NOT_FOUND)); - Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "id")); + Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "id")); Page zones = mappingRepository.findZonesByPlaceId(place.getId(), pageable); return zones.map(z -> From fa9f0f8eaa939319d4c93419e94732d7b1e83e1c Mon Sep 17 00:00:00 2001 From: seungin Date: Wed, 20 Aug 2025 12:36:36 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[fix]=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=200=20->=201=20=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/wayble/server/user/controller/UserPlaceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java index 1f72bf2..ac89661 100644 --- a/src/main/java/com/wayble/server/user/controller/UserPlaceController.java +++ b/src/main/java/com/wayble/server/user/controller/UserPlaceController.java @@ -96,7 +96,7 @@ public CommonResponse addZoneToPlaces( public CommonResponse> getZonesInPlace( @Parameter(hidden = true) @CurrentUser Long userId, @RequestParam Long placeId, - @RequestParam(defaultValue = "1") @Min(0) Integer page, + @RequestParam(defaultValue = "1") @Min(1) Integer page, @RequestParam(defaultValue = "20") @Min(1) @Max(100) Integer size ) { Page zones = userPlaceService.getZonesInPlace(userId, placeId, page, size);