diff --git a/src/main/java/com/example/UMC/domain/mission/controller/MissionController.java b/src/main/java/com/example/UMC/domain/mission/controller/MissionController.java index e78b452..785764c 100644 --- a/src/main/java/com/example/UMC/domain/mission/controller/MissionController.java +++ b/src/main/java/com/example/UMC/domain/mission/controller/MissionController.java @@ -1,14 +1,24 @@ package com.example.UMC.domain.mission.controller; import com.example.UMC.domain.mission.dto.response.MissionChallengeResponse; +import com.example.UMC.domain.mission.dto.response.StoreMissionResponse; +import com.example.UMC.domain.mission.dto.response.UserMissionInProgressResponse; import com.example.UMC.domain.mission.service.MissionService; +import com.example.UMC.global.annotation.ValidPage; +import com.example.UMC.global.apiPayload.ApiResponse; +import com.example.UMC.global.apiPayload.code.GeneralSucessCode; +import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequiredArgsConstructor @RequestMapping("/api/my/missions") +@Validated public class MissionController { private final MissionService missionService; @@ -25,4 +35,30 @@ public ResponseEntity challengeMission( MissionChallengeResponse response = missionService.challengeMission(userId, missionId); return ResponseEntity.ok(response); } + + @GetMapping("/stores/{storeId}") + @Operation(summary = "특정 가게의 미션 목록 조회") + public ApiResponse> getStoreMissions( + @PathVariable Long storeId, + @RequestParam(defaultValue = "1") @ValidPage Integer page + ) { + int pageIndex = page - 1; + return ApiResponse.onSucess( + GeneralSucessCode.OK, + missionService.getStoreMissions(storeId, pageIndex) + ); + } + + @GetMapping("/me/in-progress") + @Operation(summary = "내가 진행중인 미션 조회") + public ApiResponse> getUserInProgress( + @RequestParam Long userId, + @RequestParam(defaultValue = "1") @ValidPage Integer page + ) { + int pageIndex = page - 1; + return ApiResponse.onSucess( + GeneralSucessCode.OK, + missionService.getUserInProgress(userId, pageIndex) + ); + } } diff --git a/src/main/java/com/example/UMC/domain/mission/converter/MissionConverter.java b/src/main/java/com/example/UMC/domain/mission/converter/MissionConverter.java new file mode 100644 index 0000000..f77c3fe --- /dev/null +++ b/src/main/java/com/example/UMC/domain/mission/converter/MissionConverter.java @@ -0,0 +1,37 @@ +package com.example.UMC.domain.mission.converter; + +import com.example.UMC.domain.mission.dto.response.StoreMissionResponse; +import com.example.UMC.domain.mission.dto.response.UserMissionInProgressResponse; +import com.example.UMC.domain.mission.entity.Mission; +import com.example.UMC.domain.mission.entity.UserMission; +import org.springframework.stereotype.Component; +import org.springframework.data.domain.Page; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class MissionConverter { + + public List toStoreMissionList(Page missions) { + return missions.getContent().stream() + .map(m -> StoreMissionResponse.builder() + .missionId(m.getId()) + .title(m.getTitle()) + .minSpend(m.getMinSpend()) + .point(m.getPoint()) + .build()) + .collect(Collectors.toList()); + } + + public List toUserMissionList(Page missions) { + return missions.getContent().stream() + .map(um -> UserMissionInProgressResponse.builder() + .userMissionId(um.getId()) + .missionTitle(um.getMission().getTitle()) + .status(um.getStatus()) + .build()) + .collect(Collectors.toList()); + } +} + diff --git a/src/main/java/com/example/UMC/domain/mission/dto/response/StoreMissionResponse.java b/src/main/java/com/example/UMC/domain/mission/dto/response/StoreMissionResponse.java new file mode 100644 index 0000000..01999c4 --- /dev/null +++ b/src/main/java/com/example/UMC/domain/mission/dto/response/StoreMissionResponse.java @@ -0,0 +1,14 @@ +package com.example.UMC.domain.mission.dto.response; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class StoreMissionResponse { + private Long missionId; + private String title; + private Integer minSpend; + private Integer point; +} + diff --git a/src/main/java/com/example/UMC/domain/mission/dto/response/UserMissionInProgressResponse.java b/src/main/java/com/example/UMC/domain/mission/dto/response/UserMissionInProgressResponse.java new file mode 100644 index 0000000..6a3dbed --- /dev/null +++ b/src/main/java/com/example/UMC/domain/mission/dto/response/UserMissionInProgressResponse.java @@ -0,0 +1,14 @@ +package com.example.UMC.domain.mission.dto.response; + +import com.example.UMC.domain.enums.entity.MissionStatus; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class UserMissionInProgressResponse { + private Long userMissionId; + private String missionTitle; + private MissionStatus status; +} + 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 230eeb2..60a87fc 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 @@ -23,4 +23,7 @@ public interface MissionRepository extends JpaRepository { ORDER BY m.endsAt ASC """) Page findAllByRegion(@Param("region") Region region, Pageable pageable); + + // 문제 2: 특정 가게의 미션 목록 + Page findByStoreId(Long storeId, 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 6dd470c..e83bfab 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,6 +1,7 @@ package com.example.UMC.domain.mission.repository; +import com.example.UMC.domain.enums.entity.MissionStatus; import com.example.UMC.domain.mission.entity.UserMission; import com.example.UMC.domain.user.entity.User; import org.springframework.data.domain.Page; @@ -25,5 +26,8 @@ public interface UserMissionRepository extends JpaRepository ORDER BY um.completedAt DESC """) Page findAllByUser(@Param("user") User user, Pageable pageable); + + // 문제 3: 내가 진행 중인 미션 목록 + Page findByUserIdAndStatus(Long userId, MissionStatus status, Pageable pageable); } diff --git a/src/main/java/com/example/UMC/domain/mission/service/MissionService.java b/src/main/java/com/example/UMC/domain/mission/service/MissionService.java index 0945487..632006b 100644 --- a/src/main/java/com/example/UMC/domain/mission/service/MissionService.java +++ b/src/main/java/com/example/UMC/domain/mission/service/MissionService.java @@ -1,7 +1,10 @@ package com.example.UMC.domain.mission.service; import com.example.UMC.domain.enums.entity.MissionStatus; +import com.example.UMC.domain.mission.converter.MissionConverter; import com.example.UMC.domain.mission.dto.response.MissionChallengeResponse; +import com.example.UMC.domain.mission.dto.response.StoreMissionResponse; +import com.example.UMC.domain.mission.dto.response.UserMissionInProgressResponse; import com.example.UMC.domain.mission.entity.Mission; import com.example.UMC.domain.mission.entity.UserMission; import com.example.UMC.domain.mission.exception.MissionException; @@ -13,10 +16,13 @@ import com.example.UMC.domain.user.exception.code.UserErrorCode; import com.example.UMC.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.List; @Service @RequiredArgsConstructor @@ -24,6 +30,7 @@ public class MissionService { private final MissionRepository missionRepository; private final UserRepository userRepository; private final UserMissionRepository userMissionRepository; + private final MissionConverter converter; /** * 미션 도전하기 API @@ -72,4 +79,16 @@ public MissionChallengeResponse challengeMission(Long userId, Long missionId) { .status(saved.getStatus()) .build(); } + + public List getStoreMissions(Long storeId, int pageIndex) { + Pageable pageable = PageRequest.of(pageIndex, 10); + return converter.toStoreMissionList(missionRepository.findByStoreId(storeId, pageable)); + } + + public List getUserInProgress(Long userId, int pageIndex) { + Pageable pageable = PageRequest.of(pageIndex, 10); + return converter.toUserMissionList( + userMissionRepository.findByUserIdAndStatus(userId, MissionStatus.PROCESS, pageable) + ); + } } \ No newline at end of file diff --git a/src/main/java/com/example/UMC/domain/review/controller/ReviewController.java b/src/main/java/com/example/UMC/domain/review/controller/ReviewController.java index 0aed354..8b76be3 100644 --- a/src/main/java/com/example/UMC/domain/review/controller/ReviewController.java +++ b/src/main/java/com/example/UMC/domain/review/controller/ReviewController.java @@ -1,21 +1,30 @@ package com.example.UMC.domain.review.controller; import com.example.UMC.domain.review.dto.request.ReviewCreateRequest; +import com.example.UMC.domain.review.dto.response.MyReviewResponse; import com.example.UMC.domain.review.dto.response.ReviewResponse; import com.example.UMC.domain.review.entity.Review; import com.example.UMC.domain.review.repository.ReviewQueryRepository; import com.example.UMC.domain.review.service.ReviewService; +import com.example.UMC.global.annotation.ValidPage; +import com.example.UMC.global.apiPayload.ApiResponse; +import com.example.UMC.global.apiPayload.code.GeneralSucessCode; +import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequiredArgsConstructor -@RequestMapping("/api/stores") +@RequestMapping("/api/reviews") +@Validated public class ReviewController { private final ReviewQueryRepository reviewQueryRepository; @@ -25,7 +34,7 @@ public class ReviewController { * [POST] /api/stores/{storeId}/reviews * 가게에 리뷰 작성 API */ - @PostMapping("/{storeId}/reviews") + @PostMapping("/stores/{storeId}") public ResponseEntity createReview( @RequestHeader("X-USER-ID") Long userId, @PathVariable Long storeId, @@ -40,7 +49,7 @@ public ResponseEntity createReview( * 현재 이코드는 무한순회가 도는중 유저 - 리뷰 가 양방향 매핑이라 그래서 entity구조 그대로 하고 무한순회 안돌게 * DTO사용이 필요해 보임. */ - @GetMapping + @GetMapping("/stores/test") public Page getReviews( @RequestParam(required = false) Long storeId, @RequestParam(required = false) String storeName, @@ -53,5 +62,17 @@ public Page getReviews( Pageable pageable = PageRequest.of(page, size); return reviewQueryRepository.findReviews(storeId, storeName, regionId, star, pageable); } + + @GetMapping("/me") + @Operation(summary = "내가 작성한 리뷰 목록 조회") + public ApiResponse> getMyReviews( + @RequestParam Long userId, + @RequestParam(defaultValue = "1") @ValidPage Integer page + ) { + int pageIndex = page - 1; + List result = reviewService.getMyReviews(userId, pageIndex); + + return ApiResponse.onSucess(GeneralSucessCode.OK, result); + } } diff --git a/src/main/java/com/example/UMC/domain/review/converter/ReviewConverter.java b/src/main/java/com/example/UMC/domain/review/converter/ReviewConverter.java new file mode 100644 index 0000000..d052a81 --- /dev/null +++ b/src/main/java/com/example/UMC/domain/review/converter/ReviewConverter.java @@ -0,0 +1,28 @@ +package com.example.UMC.domain.review.converter; + +import com.example.UMC.domain.review.dto.response.MyReviewResponse; +import com.example.UMC.domain.review.entity.Review; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class ReviewConverter { + + public List toMyReviews(Page reviewPage) { + + return reviewPage.getContent() + .stream() + .map(r -> MyReviewResponse.builder() + .reviewId(r.getId()) + .rating(r.getRating()) + .content(r.getContent()) + .storeName(r.getStore().getName()) + .createdAt(r.getCreatedAt()) + .build()) + .collect(Collectors.toList()); + } +} + diff --git a/src/main/java/com/example/UMC/domain/review/dto/response/MyReviewResponse.java b/src/main/java/com/example/UMC/domain/review/dto/response/MyReviewResponse.java new file mode 100644 index 0000000..8daaa91 --- /dev/null +++ b/src/main/java/com/example/UMC/domain/review/dto/response/MyReviewResponse.java @@ -0,0 +1,16 @@ +package com.example.UMC.domain.review.dto.response; + +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDateTime; + +@Getter +@Builder +public class MyReviewResponse { + private Long reviewId; + private Integer rating; + private String content; + private String storeName; + private LocalDateTime createdAt; +} 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 6e3a507..ee0099a 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 @@ -2,9 +2,10 @@ import com.example.UMC.domain.review.entity.Review; import com.example.UMC.domain.store.entity.Store; +import org.springframework.data.domain.Page; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; - +import org.springframework.data.domain.Pageable; import java.util.List; public interface ReviewRepository extends JpaRepository, ReviewQueryRepository { @@ -19,4 +20,6 @@ public interface ReviewRepository extends JpaRepository, ReviewQue @EntityGraph(attributePaths = {"user"}) // Review의 user 필드 fetch join List findAllByStoreOrderByCreatedAtDesc(Store store); + // 문제 1: 내가 작성한 리뷰 목록 + Page findByUserId(Long userId, Pageable pageable); } diff --git a/src/main/java/com/example/UMC/domain/review/repository/ReviewQueryRepositoryImpl.java b/src/main/java/com/example/UMC/domain/review/repository/ReviewRepositoryImpl.java similarity index 97% rename from src/main/java/com/example/UMC/domain/review/repository/ReviewQueryRepositoryImpl.java rename to src/main/java/com/example/UMC/domain/review/repository/ReviewRepositoryImpl.java index 59894ce..11cf899 100644 --- a/src/main/java/com/example/UMC/domain/review/repository/ReviewQueryRepositoryImpl.java +++ b/src/main/java/com/example/UMC/domain/review/repository/ReviewRepositoryImpl.java @@ -19,7 +19,7 @@ @Repository @Primary //컨트롤러 테스트 용도로 잠시 붙힘 @RequiredArgsConstructor -public class ReviewQueryRepositoryImpl implements ReviewQueryRepository { +public class ReviewRepositoryImpl implements ReviewQueryRepository { private final JPAQueryFactory queryFactory; diff --git a/src/main/java/com/example/UMC/domain/review/service/ReviewService.java b/src/main/java/com/example/UMC/domain/review/service/ReviewService.java index 814adaa..e5f9464 100644 --- a/src/main/java/com/example/UMC/domain/review/service/ReviewService.java +++ b/src/main/java/com/example/UMC/domain/review/service/ReviewService.java @@ -1,6 +1,8 @@ package com.example.UMC.domain.review.service; +import com.example.UMC.domain.review.converter.ReviewConverter; import com.example.UMC.domain.review.dto.request.ReviewCreateRequest; +import com.example.UMC.domain.review.dto.response.MyReviewResponse; import com.example.UMC.domain.review.dto.response.ReviewResponse; import com.example.UMC.domain.review.entity.Review; import com.example.UMC.domain.review.repository.ReviewRepository; @@ -14,14 +16,18 @@ import com.example.UMC.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.data.domain.*; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @RequiredArgsConstructor public class ReviewService { private final ReviewRepository reviewRepository; private final UserRepository userRepository; private final StoreRepository storeRepository; + private final ReviewConverter converter; @Transactional public ReviewResponse createReview(Long userId, Long storeId, ReviewCreateRequest request) { @@ -54,4 +60,12 @@ public ReviewResponse createReview(Long userId, Long storeId, ReviewCreateReques saved.getContent() ); } + + public List getMyReviews(Long userId, int pageIndex) { + + Pageable pageable = PageRequest.of(pageIndex, 10, Sort.by("createdAt").descending()); + Page result = reviewRepository.findByUserId(userId, pageable); + + return converter.toMyReviews((Page) result); + } } diff --git a/src/main/java/com/example/UMC/global/annotation/PageValidator.java b/src/main/java/com/example/UMC/global/annotation/PageValidator.java new file mode 100644 index 0000000..469fee1 --- /dev/null +++ b/src/main/java/com/example/UMC/global/annotation/PageValidator.java @@ -0,0 +1,14 @@ +package com.example.UMC.global.annotation; + +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +public class PageValidator implements ConstraintValidator { + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + if (value == null) return false; // 반드시 포함하도록 + return value > 0; // 1 이상만 OK + } +} + diff --git a/src/main/java/com/example/UMC/global/annotation/ValidPage.java b/src/main/java/com/example/UMC/global/annotation/ValidPage.java new file mode 100644 index 0000000..0973ee0 --- /dev/null +++ b/src/main/java/com/example/UMC/global/annotation/ValidPage.java @@ -0,0 +1,16 @@ +package com.example.UMC.global.annotation; + +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.*; + +@Target({ ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint(validatedBy = PageValidator.class) +public @interface ValidPage { + String message() default "page must be greater than 0"; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index beaba1f..1dd099b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,19 +1,25 @@ spring: application: - name: "UMC9th" # "umc9th" + name: "UMC9th" + charset: UTF-8 datasource: - driver-class-name: com.mysql.cj.jdbc.Driver # MySQL JDBC ???? ??? ?? - url: ${DB_URL} # jdbc:mysql://localhost:3306/{???????} - username: ${DB_USER} # MySQL ?? ?? - password: ${DB_PW} # MySQL ???? + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${DB_URL} + username: ${DB_USER} + password: ${DB_PW} jpa: - database: mysql # ??? ?????? ?? ?? (MySQL) - database-platform: org.hibernate.dialect.MySQLDialect # Hibernate?? ??? MySQL ??(dialect) ?? - show-sql: true # ??? SQL ??? ??? ???? ?? ?? + database: mysql + database-platform: org.hibernate.dialect.MySQLDialect + show-sql: true hibernate: - ddl-auto: update # ?????? ?? ? ?????? ???? ??? ?? + ddl-auto: update properties: hibernate: - format_sql: true # ???? SQL ??? ?? ?? ??? \ No newline at end of file + format_sql: true + + sql: + init: + mode: always + encoding: UTF-8 diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql new file mode 100644 index 0000000..270faf1 --- /dev/null +++ b/src/main/resources/data.sql @@ -0,0 +1,73 @@ +DELETE FROM user_misson; +DELETE FROM review; +DELETE FROM misson; +DELETE FROM store; +DELETE FROM user; +DELETE FROM resion; + + +-- ========================= +-- REGION +-- ========================= +INSERT INTO resion (resion_id, resion_name) +VALUES (1, '서울'), (2, '부산'), (3, '대구'); + +-- ========================= +-- STORE (각 지역마다 상점 연결) +-- ========================= +INSERT INTO store (store_id, resion_id, name, address, food_category, created_at, updated_at) +VALUES +(1, 1, '마라탕천국 강남점', '서울 강남구 어딘가', '중식', NOW(), NOW()), +(2, 1, '반이학생마라탕마라반', '서울 중구 어딘가', '중식', NOW(), NOW()), +(3, 2, '부산마라탕 전문점', '부산 해운대구 어딘가', '중식', NOW(), NOW()), +(4, 3, '대구마라탕', '대구 중구 어딘가', '중식', NOW(), NOW()); + +-- ========================= +-- USERS +-- ========================= +INSERT INTO user (user_id, name, gender, email, phone_number, birth, address, status, privacy_agree, id, password, point, created_at, updated_at) +VALUES +(1, '김세진', 'M', 'sejin@example.com', '01012341234', '2001-01-01', '서울', 'ACTIVE', true, 'sejin01', 'pw1', 100, NOW(), NOW()), +(2, '홍길동', 'M', 'hong@example.com', '01055556666', '1995-05-05', '부산', 'ACTIVE', true, 'hong01', 'pw2', 50, NOW(), NOW()); + +-- ========================= +-- MISSION (각 가게별 10개씩 → 페이징 테스트용) +-- ========================= +INSERT INTO misson (misson_id, title, description, min_spend, point, starts_at, ends_at, store_id, resion_id) +VALUES +(1, '10,000원 이상 먹기', '가게에서 1만원 이상 주문', 10000, 500, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(2, '2인 방문', '2명 이상 방문 시 도전 가능', NULL, 300, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(3, '마라탕 먹기', '마라탕 아무거나 시키기', 8000, 200, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(4, '꿔바로우 주문', '꿔바로우 먹기', 12000, 400, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(5, '마라샹궈 먹기', '마라샹궈 아무거나 시키기', 15000, 600, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(6, '음료 주문', '음료 1개 필수', NULL, 100, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(7, '공기밥 추가', '공기밥 추가하기', NULL, 50, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(8, '사리 2개 추가', '사리 2개 넣기', 2000, 150, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(9, '마라탕 찍먹하기', '마라탕 찍먹 인증', NULL, 80, NOW(), NOW() + INTERVAL 7 DAY, 1, 1), +(10, '순한맛 마라탕 먹기', '순한맛 인증', NULL, 70, NOW(), NOW() + INTERVAL 7 DAY, 1, 1); + +-- ========================= +-- USER_MISSION 진행 중 목록용 +-- ========================= +INSERT INTO user_misson (user_misson_id, verrification_code, status, challenge_at, completed_at, user_id, misson_id, resion_id) +VALUES +(1, 'ABC123', 'PROCESS', NOW(), NULL, 1, 1, 1), +(2, 'XYZ999', 'PROCESS', NOW(), NULL, 1, 2, 1), +(3, 'HELLO22', 'COMPLETE', NOW(), NOW(), 1, 3, 1), -- completed → 조회 제외됨 +(4, 'GGGG55', 'PROCESS', NOW(), NULL, 2, 4, 1); + +-- ========================= +-- REVIEW (내가 작성한 리뷰 10개 만들기 → 페이징 정확) +-- ========================= +INSERT INTO review (review_id, rating, content, reply, user_id, store_id, resion_id, created_at, updated_at) +VALUES +(1, 5, '맛있어요!', NULL, 1, 2, 1, NOW(), NOW()), +(2, 4, '진짜 맛있다', NULL, 1, 2, 1, NOW(), NOW()), +(3, 3, '보통이었음', NULL, 1, 2, 1, NOW(), NOW()), +(4, 5, '매콤하니 좋음', NULL, 1, 2, 1, NOW(), NOW()), +(5, 4, '또 올게요', NULL, 1, 2, 1, NOW(), NOW()), +(6, 5, '오늘도 만족!', NULL, 1, 2, 1, NOW(), NOW()), +(7, 3, '나쁘지 않아요', NULL, 1, 2, 1, NOW(), NOW()), +(8, 4, '양 많음', NULL, 1, 2, 1, NOW(), NOW()), +(9, 5, '맛있게 잘 먹음', NULL, 1, 2, 1, NOW(), NOW()), +(10, 2, '너무 짜요', NULL, 1, 2, 1, NOW(), NOW());