diff --git a/src/main/java/com/example/UMC/domain/enums/entity/Gender.java b/src/main/java/com/example/UMC/domain/enums/entity/Gender.java index e74dfb1..ca82157 100644 --- a/src/main/java/com/example/UMC/domain/enums/entity/Gender.java +++ b/src/main/java/com/example/UMC/domain/enums/entity/Gender.java @@ -1,4 +1,4 @@ -package com.example.UMC.domain.enums; +package com.example.UMC.domain.enums.entity; public enum Gender { M, F, UNKNOWN diff --git a/src/main/java/com/example/UMC/domain/enums/entity/MissionStatus.java b/src/main/java/com/example/UMC/domain/enums/entity/MissionStatus.java index ad644c3..2b802fc 100644 --- a/src/main/java/com/example/UMC/domain/enums/entity/MissionStatus.java +++ b/src/main/java/com/example/UMC/domain/enums/entity/MissionStatus.java @@ -1,4 +1,4 @@ -package com.example.UMC.domain.enums; +package com.example.UMC.domain.enums.entity; public enum MissionStatus { NOT_STARTED, CANCEL, PROCESS, COMPLETE diff --git a/src/main/java/com/example/UMC/domain/enums/entity/Status.java b/src/main/java/com/example/UMC/domain/enums/entity/Status.java index 47dd735..ec584c4 100644 --- a/src/main/java/com/example/UMC/domain/enums/entity/Status.java +++ b/src/main/java/com/example/UMC/domain/enums/entity/Status.java @@ -1,4 +1,4 @@ -package com.example.UMC.domain.enums; +package com.example.UMC.domain.enums.entity; public enum Status { ACTIVE, LOCK diff --git a/src/main/java/com/example/UMC/domain/likes/entity/LikeCategory.java b/src/main/java/com/example/UMC/domain/likes/entity/LikeCategory.java index bc8a533..3f4f316 100644 --- a/src/main/java/com/example/UMC/domain/likes/entity/LikeCategory.java +++ b/src/main/java/com/example/UMC/domain/likes/entity/LikeCategory.java @@ -1,4 +1,4 @@ -package com.example.UMC.domain.likes; +package com.example.UMC.domain.likes.entity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/likes/entity/UserLikeFood.java b/src/main/java/com/example/UMC/domain/likes/entity/UserLikeFood.java index a0dcc75..a7e5146 100644 --- a/src/main/java/com/example/UMC/domain/likes/entity/UserLikeFood.java +++ b/src/main/java/com/example/UMC/domain/likes/entity/UserLikeFood.java @@ -1,6 +1,6 @@ -package com.example.UMC.domain.likes; +package com.example.UMC.domain.likes.entity; -import com.example.UMC.domain.user.User; +import com.example.UMC.domain.user.entity.User; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/mission/entity/Mission.java b/src/main/java/com/example/UMC/domain/mission/entity/Mission.java index fe3025a..46d6a0b 100644 --- a/src/main/java/com/example/UMC/domain/mission/entity/Mission.java +++ b/src/main/java/com/example/UMC/domain/mission/entity/Mission.java @@ -1,7 +1,7 @@ -package com.example.UMC.domain.mission; +package com.example.UMC.domain.mission.entity; -import com.example.UMC.domain.store.Store; -import com.example.UMC.domain.store.Region; +import com.example.UMC.domain.store.entity.Store; +import com.example.UMC.domain.store.entity.Region; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/UMC/domain/mission/entity/UserMission.java b/src/main/java/com/example/UMC/domain/mission/entity/UserMission.java index 614b43b..5f97c7e 100644 --- a/src/main/java/com/example/UMC/domain/mission/entity/UserMission.java +++ b/src/main/java/com/example/UMC/domain/mission/entity/UserMission.java @@ -1,8 +1,8 @@ -package com.example.UMC.domain.mission; +package com.example.UMC.domain.mission.entity; -import com.example.UMC.domain.enums.MissionStatus; -import com.example.UMC.domain.store.Region; -import com.example.UMC.domain.user.User; +import com.example.UMC.domain.enums.entity.MissionStatus; +import com.example.UMC.domain.store.entity.Region; +import com.example.UMC.domain.user.entity.User; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/example/UMC/domain/mission/repository/MissionRepository.java b/src/main/java/com/example/UMC/domain/mission/repository/MissionRepository.java index 6e835f8..230eeb2 100644 --- a/src/main/java/com/example/UMC/domain/mission/repository/MissionRepository.java +++ b/src/main/java/com/example/UMC/domain/mission/repository/MissionRepository.java @@ -1,2 +1,26 @@ -package com.example.UMC.domain.mission.repository;public interface MissionRepository { +package com.example.UMC.domain.mission.repository; + +import com.example.UMC.domain.mission.entity.Mission; +import com.example.UMC.domain.store.entity.Region; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface MissionRepository extends JpaRepository { + + /** + * 4. 홈 화면용 미션 목록 조회 + * - 현재 지역(region)에서 도전 가능한 미션 + * - 페이징 포함 + */ + @Query(""" + SELECT m + FROM Mission m + JOIN FETCH m.store s + WHERE s.region = :region + ORDER BY m.endsAt ASC + """) + Page findAllByRegion(@Param("region") Region region, Pageable pageable); } diff --git a/src/main/java/com/example/UMC/domain/mission/repository/UserMissionRepository.java b/src/main/java/com/example/UMC/domain/mission/repository/UserMissionRepository.java index 32d63cf..6420eed 100644 --- a/src/main/java/com/example/UMC/domain/mission/repository/UserMissionRepository.java +++ b/src/main/java/com/example/UMC/domain/mission/repository/UserMissionRepository.java @@ -1,2 +1,29 @@ -package com.example.UMC.domain.mission.repository;public interface UserMissionRepository { +package com.example.UMC.domain.mission.repository; + + +import com.example.UMC.domain.mission.entity.UserMission; +import com.example.UMC.domain.user.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface UserMissionRepository extends JpaRepository { + + /** + * 3. 내 미션 목록 조회 (진행 중 / 완료 포함) + * - 페이징 지원 + * - User 기준 + */ + @Query(""" + SELECT um + FROM UserMission um + JOIN FETCH um.mission m + JOIN FETCH m.store s + WHERE um.user = :user + ORDER BY um.completeAt DESC + """) + Page findAllByUser(@Param("user") User user, Pageable pageable); } + diff --git a/src/main/java/com/example/UMC/domain/notification/entity/Notification.java b/src/main/java/com/example/UMC/domain/notification/entity/Notification.java index fcfea87..a96f75a 100644 --- a/src/main/java/com/example/UMC/domain/notification/entity/Notification.java +++ b/src/main/java/com/example/UMC/domain/notification/entity/Notification.java @@ -1,8 +1,8 @@ -package com.example.UMC.domain.notification; +package com.example.UMC.domain.notification.entity; -import com.example.UMC.domain.BaseEntity; -import com.example.UMC.domain.user.User; +import com.example.UMC.global.commmon.BaseEntity; +import com.example.UMC.domain.user.entity.User; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/review/entity/Review.java b/src/main/java/com/example/UMC/domain/review/entity/Review.java index badf891..fa02b38 100644 --- a/src/main/java/com/example/UMC/domain/review/entity/Review.java +++ b/src/main/java/com/example/UMC/domain/review/entity/Review.java @@ -1,9 +1,9 @@ -package com.example.UMC.domain.review; +package com.example.UMC.domain.review.entity; -import com.example.UMC.domain.BaseEntity; -import com.example.UMC.domain.store.Region; -import com.example.UMC.domain.store.Store; -import com.example.UMC.domain.user.User; +import com.example.UMC.global.commmon.BaseEntity; +import com.example.UMC.domain.store.entity.Region; +import com.example.UMC.domain.store.entity.Store; +import com.example.UMC.domain.user.entity.User; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/review/entity/ReviewImage.java b/src/main/java/com/example/UMC/domain/review/entity/ReviewImage.java index 9944bf6..10737b6 100644 --- a/src/main/java/com/example/UMC/domain/review/entity/ReviewImage.java +++ b/src/main/java/com/example/UMC/domain/review/entity/ReviewImage.java @@ -1,7 +1,6 @@ -package com.example.UMC.domain.review; +package com.example.UMC.domain.review.entity; -import com.example.UMC.domain.store.Region; -import com.example.UMC.domain.user.User; +import com.example.UMC.domain.store.entity.Region; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/review/entity/ReviewReply.java b/src/main/java/com/example/UMC/domain/review/entity/ReviewReply.java index 682f990..2237ef7 100644 --- a/src/main/java/com/example/UMC/domain/review/entity/ReviewReply.java +++ b/src/main/java/com/example/UMC/domain/review/entity/ReviewReply.java @@ -1,7 +1,7 @@ -package com.example.UMC.domain.review; +package com.example.UMC.domain.review.entity; -import com.example.UMC.domain.store.Region; -import com.example.UMC.domain.user.User; +import com.example.UMC.domain.store.entity.Region; +import com.example.UMC.domain.user.entity.User; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/review/repository/ReviewRepository.java b/src/main/java/com/example/UMC/domain/review/repository/ReviewRepository.java index 1fcb7e1..ca5cc5c 100644 --- a/src/main/java/com/example/UMC/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/example/UMC/domain/review/repository/ReviewRepository.java @@ -1,2 +1,22 @@ -package com.example.UMC.domain.review.repository;public class ReviewRepository { +package com.example.UMC.domain.review.repository; + +import com.example.UMC.domain.review.entity.Review; +import com.example.UMC.domain.store.entity.Store; +import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ReviewRepository extends JpaRepository { + + + + /** + * 1. 리뷰 조회 + * 특정 가게(store)의 리뷰를 최신순으로 조회 + * (작성자(User) 엔티티까지 한 번에 가져오기) + */ + @EntityGraph(attributePaths = {"user"}) // Review의 user 필드 fetch join + List findAllByStoreOrderByCreatedAtDesc(Store store); + } diff --git a/src/main/java/com/example/UMC/domain/store/entity/Region.java b/src/main/java/com/example/UMC/domain/store/entity/Region.java index d2e87f2..f6d974d 100644 --- a/src/main/java/com/example/UMC/domain/store/entity/Region.java +++ b/src/main/java/com/example/UMC/domain/store/entity/Region.java @@ -1,4 +1,4 @@ -package com.example.UMC.domain.store; +package com.example.UMC.domain.store.entity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/store/entity/Store.java b/src/main/java/com/example/UMC/domain/store/entity/Store.java index e7cb049..2911f5c 100644 --- a/src/main/java/com/example/UMC/domain/store/entity/Store.java +++ b/src/main/java/com/example/UMC/domain/store/entity/Store.java @@ -1,9 +1,8 @@ -package com.example.UMC.domain.store; +package com.example.UMC.domain.store.entity; -import com.example.UMC.domain.BaseEntity; +import com.example.UMC.global.commmon.BaseEntity; import jakarta.persistence.*; import lombok.*; -import java.util.List; @Entity @Getter diff --git a/src/main/java/com/example/UMC/domain/user/entity/Agreement.java b/src/main/java/com/example/UMC/domain/user/entity/Agreement.java index 415a535..ab6df29 100644 --- a/src/main/java/com/example/UMC/domain/user/entity/Agreement.java +++ b/src/main/java/com/example/UMC/domain/user/entity/Agreement.java @@ -1,6 +1,6 @@ -package com.example.UMC.domain.user; +package com.example.UMC.domain.user.entity; -import com.example.UMC.domain.BaseEntity; +import com.example.UMC.global.commmon.BaseEntity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/com/example/UMC/domain/user/entity/User.java b/src/main/java/com/example/UMC/domain/user/entity/User.java index 87ee8bd..ce295f0 100644 --- a/src/main/java/com/example/UMC/domain/user/entity/User.java +++ b/src/main/java/com/example/UMC/domain/user/entity/User.java @@ -1,12 +1,13 @@ -package com.example.UMC.domain.user; - -import com.example.UMC.domain.BaseEntity; -import com.example.UMC.domain.mission.UserMission; -import com.example.UMC.domain.notification.Notification; -import com.example.UMC.domain.review.Review; -import com.example.UMC.domain.review.ReviewReply; -import com.example.UMC.domain.enums.*; -import com.example.UMC.domain.likes.UserLikeFood; +package com.example.UMC.domain.user.entity; + +import com.example.UMC.domain.enums.entity.Gender; +import com.example.UMC.domain.enums.entity.Status; +import com.example.UMC.global.commmon.BaseEntity; +import com.example.UMC.domain.mission.entity.UserMission; +import com.example.UMC.domain.notification.entity.Notification; +import com.example.UMC.domain.review.entity.Review; +import com.example.UMC.domain.review.entity.ReviewReply; +import com.example.UMC.domain.likes.entity.UserLikeFood; import jakarta.persistence.*; import lombok.*; import java.util.List; diff --git a/src/main/java/com/example/UMC/domain/user/repository/DashboardRepository.java b/src/main/java/com/example/UMC/domain/user/repository/DashboardRepository.java index 3afd460..406d1fa 100644 --- a/src/main/java/com/example/UMC/domain/user/repository/DashboardRepository.java +++ b/src/main/java/com/example/UMC/domain/user/repository/DashboardRepository.java @@ -1,2 +1,33 @@ -package com.example.UMC.domain.user.repository;public interface HomeDashboardRepository { +package com.example.UMC.domain.user.repository; + +import com.example.UMC.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface DashboardRepository extends JpaRepository { + + /** + * 4. 홈화면 대시보드 조회 + * - 최근 리뷰한 가게 지역 + 포인트 + 알람 여부 + 완료 미션 수 + */ + @Query(""" + SELECT + s.region.name, + u.point, + CASE WHEN EXISTS ( + SELECT n FROM Notification n + WHERE n.user = u AND n.isRead = false + ) THEN true ELSE false END AS alram, + (SELECT COUNT(um) + FROM UserMission um + WHERE um.user = u + AND um.status = com.example.UMC.domain.enums.entity.MissionStatus.COMPLETE) + FROM User u + JOIN Review r ON r.user = u + JOIN Store s ON r.store = s + WHERE u.id = :userId + ORDER BY r.createdAt DESC + """) + Object findDashboardInfo(@Param("userId") Long userId); } diff --git a/src/main/java/com/example/UMC/domain/user/repository/UserRepository.java b/src/main/java/com/example/UMC/domain/user/repository/UserRepository.java index 7b541f9..dc07b73 100644 --- a/src/main/java/com/example/UMC/domain/user/repository/UserRepository.java +++ b/src/main/java/com/example/UMC/domain/user/repository/UserRepository.java @@ -1,2 +1,22 @@ -package com.example.UMC.domain.user.repository;public interface UserRepository { +package com.example.UMC.domain.user.repository; + + +import com.example.UMC.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + + /** + * 2.마이페이지 조회용 — user_id로 단일 유저 조회 + * (CASE, JOIN 없이 단순 조회만) + */ + Optional findById(Long userId); + + // 기준으로 조회 (로그인/마이페이지 공용으로 활용 가능) + Optional findByEmail(String email); + + // 이름 + 이메일 같이 조건 조회 (확장형) + Optional findByNameAndEmail(String name, String email); } diff --git a/src/main/java/com/example/UMC/global/commmon/BaseEntity.java b/src/main/java/com/example/UMC/global/commmon/BaseEntity.java index a19a4a1..9ab0019 100644 --- a/src/main/java/com/example/UMC/global/commmon/BaseEntity.java +++ b/src/main/java/com/example/UMC/global/commmon/BaseEntity.java @@ -1,4 +1,4 @@ -package com.example.UMC.domain; +package com.example.UMC.global.commmon; import jakarta.persistence.Column; import jakarta.persistence.EntityListeners;