diff --git a/src/main/java/com/example/cp_main_be/domain/member/user/domain/repository/UserRepository.java b/src/main/java/com/example/cp_main_be/domain/member/user/domain/repository/UserRepository.java index 0c654681..317fe0a4 100644 --- a/src/main/java/com/example/cp_main_be/domain/member/user/domain/repository/UserRepository.java +++ b/src/main/java/com/example/cp_main_be/domain/member/user/domain/repository/UserRepository.java @@ -4,6 +4,8 @@ import java.util.Optional; import java.util.UUID; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface UserRepository extends JpaRepository { @@ -11,5 +13,8 @@ public interface UserRepository extends JpaRepository { Optional findByUuid(UUID uuid); + @Query("SELECT u FROM User u LEFT JOIN FETCH u.gardens WHERE u.id = :userId") + Optional findByIdWithGardens(@Param("userId") Long userId); + Boolean existsByNickname(String nickname); } diff --git a/src/main/java/com/example/cp_main_be/domain/member/user/presentation/UserController.java b/src/main/java/com/example/cp_main_be/domain/member/user/presentation/UserController.java index 22c20c44..466a92a9 100644 --- a/src/main/java/com/example/cp_main_be/domain/member/user/presentation/UserController.java +++ b/src/main/java/com/example/cp_main_be/domain/member/user/presentation/UserController.java @@ -1,6 +1,5 @@ package com.example.cp_main_be.domain.member.user.presentation; -import com.example.cp_main_be.domain.garden.garden.domain.Garden; import com.example.cp_main_be.domain.member.user.domain.User; import com.example.cp_main_be.domain.member.user.domain.repository.UserRepository; import com.example.cp_main_be.domain.member.user.dto.request.AvatarChangeRequest; @@ -14,9 +13,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.websocket.server.PathParam; -import java.util.Comparator; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -90,12 +87,8 @@ public ResponseEntity> @GetMapping("/me/gardens") public ResponseEntity>> getMyGardenIds( @AuthenticationPrincipal User user) { - List gardenIds = - user.getGardens().stream() - .sorted(Comparator.comparing(Garden::getSlotNumber)) - .map(Garden::getId) - .collect(Collectors.toList()); - + // 로직을 서비스 계층으로 위임하여 트랜잭션 내에서 처리하도록 변경 + List gardenIds = userService.getMyGardenIds(user); return ResponseEntity.ok(ApiResponse.success(gardenIds)); } diff --git a/src/main/java/com/example/cp_main_be/domain/member/user/service/UserService.java b/src/main/java/com/example/cp_main_be/domain/member/user/service/UserService.java index b14afb95..fb05f715 100644 --- a/src/main/java/com/example/cp_main_be/domain/member/user/service/UserService.java +++ b/src/main/java/com/example/cp_main_be/domain/member/user/service/UserService.java @@ -128,6 +128,26 @@ public User getCurrentUser() { throw new IllegalArgumentException("인증 정보를 찾을 수 없습니다."); } + /** + * 사용자의 모든 텃밭 ID 목록을 슬롯 번호 순으로 정렬하여 반환합니다. + * + * @param user 현재 로그인한 사용자 + * @return 정렬된 텃밭 ID 목록 + */ + @Transactional(readOnly = true) + public List getMyGardenIds(User user) { + // LazyInitializationException을 방지하기 위해 Fetch Join으로 User와 gardens를 함께 조회 + User managedUser = + userRepository + .findByIdWithGardens(user.getId()) + .orElseThrow(() -> new UserNotFoundException("사용자를 찾을 수 없습니다.")); + + return managedUser.getGardens().stream() + .sorted(Comparator.comparing(Garden::getSlotNumber)) + .map(Garden::getId) + .collect(Collectors.toList()); + } + /** * 특정 유저의 프로필 정보를 조회합니다. *