diff --git a/src/main/java/com/mpnp/baechelin/bookmark/controller/FolderController.java b/src/main/java/com/mpnp/baechelin/bookmark/controller/FolderController.java index 12daed1..8f11798 100644 --- a/src/main/java/com/mpnp/baechelin/bookmark/controller/FolderController.java +++ b/src/main/java/com/mpnp/baechelin/bookmark/controller/FolderController.java @@ -19,6 +19,7 @@ import org.springframework.security.core.userdetails.User; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; @RequiredArgsConstructor @@ -30,7 +31,7 @@ public class FolderController { /** 폴더 신규 생성 */ @PostMapping("/folder") - public SuccessResponse folder (@RequestBody FolderRequestDto folderRequestDto, + public SuccessResponse folder (@RequestBody @Valid FolderRequestDto folderRequestDto, @AuthenticationPrincipal User user){ if(user==null){ throw new CustomException(ErrorCode.NO_USER_FOUND); diff --git a/src/main/java/com/mpnp/baechelin/bookmark/domain/Folder.java b/src/main/java/com/mpnp/baechelin/bookmark/domain/Folder.java index 432e588..eab4f45 100644 --- a/src/main/java/com/mpnp/baechelin/bookmark/domain/Folder.java +++ b/src/main/java/com/mpnp/baechelin/bookmark/domain/Folder.java @@ -6,8 +6,10 @@ import com.mpnp.baechelin.user.domain.User; import com.mpnp.baechelin.util.TimeStamped; import lombok.*; +import org.hibernate.validator.constraints.Length; import javax.persistence.*; +import javax.validation.constraints.NotBlank; import java.util.ArrayList; import java.util.List; @@ -28,6 +30,8 @@ public class Folder extends TimeStamped { private User userId; @Column(nullable = false) + @Length(max = 15, message = "15자 이하로 입력해 주세요") + @NotBlank(message = "빈 칸을 입력하지 마세요") private String folderName; @JsonIgnore diff --git a/src/main/java/com/mpnp/baechelin/bookmark/dto/FolderRequestDto.java b/src/main/java/com/mpnp/baechelin/bookmark/dto/FolderRequestDto.java index 9cb7ffc..58952bd 100644 --- a/src/main/java/com/mpnp/baechelin/bookmark/dto/FolderRequestDto.java +++ b/src/main/java/com/mpnp/baechelin/bookmark/dto/FolderRequestDto.java @@ -5,12 +5,19 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; @Getter @NoArgsConstructor @AllArgsConstructor @Builder +@Valid public class FolderRequestDto { - + @Length(max = 15, message = "15자 이하로 입력해 주세요") + @NotBlank(message = "빈 칸을 입력하지 마세요") private String folderName; } diff --git a/src/main/java/com/mpnp/baechelin/exception/BeanValidationException.java b/src/main/java/com/mpnp/baechelin/exception/BeanValidationException.java index 770f895..43ba619 100644 --- a/src/main/java/com/mpnp/baechelin/exception/BeanValidationException.java +++ b/src/main/java/com/mpnp/baechelin/exception/BeanValidationException.java @@ -1,13 +1,18 @@ package com.mpnp.baechelin.exception; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.validation.ConstraintViolationException; +import java.util.List; @RestControllerAdvice +@Slf4j public class BeanValidationException { // Bean Validation ExceptionHandler @ExceptionHandler(ConstraintViolationException.class) diff --git a/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java b/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java index 968a6c6..5179d9b 100644 --- a/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java +++ b/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java @@ -31,7 +31,7 @@ public enum ErrorCode { NO_USER_FOUND(500, "E-NUF", "유저가 존재하지 않습니다."), NO_REVIEW_FOUND(500, "E-NRF", "리뷰가 존재하지 않습니다."), BAD_IMAGE_INPUT(400, "E-BII", "올바르지 않은 이미지 형식입니다"), - IMAGE_SIZE_EXCESS(400, "E-ISE", "이미지 크기(3MB)를 초과했습니다.") + IMAGE_SIZE_EXCESS(400, "E-ISE", "이미지 크기(3MB)를 초과했습니다."), ; private final int status; diff --git a/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java b/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java index 3b5d7e8..6d84817 100644 --- a/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java +++ b/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java @@ -8,6 +8,7 @@ import javax.validation.ConstraintViolationException; import java.time.LocalDateTime; +import java.util.Map; @Getter @Builder diff --git a/src/main/java/com/mpnp/baechelin/review/controller/ReviewController.java b/src/main/java/com/mpnp/baechelin/review/controller/ReviewController.java index 4572279..ecffa35 100644 --- a/src/main/java/com/mpnp/baechelin/review/controller/ReviewController.java +++ b/src/main/java/com/mpnp/baechelin/review/controller/ReviewController.java @@ -3,19 +3,13 @@ import com.mpnp.baechelin.common.SuccessResponse; import com.mpnp.baechelin.exception.CustomException; import com.mpnp.baechelin.exception.ErrorCode; -import com.mpnp.baechelin.review.domain.Review; +import com.mpnp.baechelin.exception.ErrorResponse; import com.mpnp.baechelin.review.dto.PageInfoResponseDto; import com.mpnp.baechelin.review.dto.ReviewMainResponseDto; import com.mpnp.baechelin.review.dto.ReviewRequestDto; -import com.mpnp.baechelin.review.dto.ReviewResponseDto; -import com.mpnp.baechelin.review.repository.ReviewQueryRepository; -import com.mpnp.baechelin.review.repository.ReviewRepository; import com.mpnp.baechelin.review.service.ReviewService; -import com.mpnp.baechelin.store.domain.Store; -import com.mpnp.baechelin.store.repository.StoreRepository; import lombok.RequiredArgsConstructor; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.data.domain.Page; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableDefault; @@ -23,17 +17,20 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.User; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.annotation.MultipartConfig; +import javax.validation.Valid; import java.io.IOException; import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; @RestController @RequiredArgsConstructor +@Slf4j public class ReviewController { private final ReviewService reviewService; @@ -64,27 +61,29 @@ public ResponseEntity getStoreReview(@PathVariable int stor * 리뷰 작성 */ @PostMapping("/review") - public SuccessResponse review(@ModelAttribute ReviewRequestDto reviewRequestDto, + public ResponseEntity review(@ModelAttribute @Valid ReviewRequestDto reviewRequestDto, + BindingResult bindingResult, @AuthenticationPrincipal User user) throws IOException { if (user == null) { throw new CustomException(ErrorCode.ACCESS_DENIED); } reviewService.review(reviewRequestDto, user.getUsername()); - return new SuccessResponse("리뷰 등록 성공"); + return ResponseEntity.ok("리뷰 등록 성공"); } /** * 리뷰 수정 */ @PatchMapping("/review/{reviewId}") - public SuccessResponse reviewUpdate(@ModelAttribute ReviewRequestDto reviewRequestDto, - @AuthenticationPrincipal User user, - @PathVariable int reviewId) { + public ResponseEntity reviewUpdate(@ModelAttribute @Valid ReviewRequestDto reviewRequestDto, + BindingResult bindingResult, + @AuthenticationPrincipal User user, + @PathVariable int reviewId) { if (user == null) { throw new CustomException(ErrorCode.ACCESS_DENIED); } reviewService.reviewUpdate(reviewRequestDto, user.getUsername(), reviewId); - return new SuccessResponse("리뷰 수정 성공"); + return ResponseEntity.ok("리뷰 수정 성공"); } @@ -103,14 +102,14 @@ public SuccessResponse reviewUpdate(@ModelAttribute ReviewRequestDto reviewReque * 리뷰 삭제 */ @DeleteMapping("/review/{reviewId}") - public SuccessResponse reviewDelete(@AuthenticationPrincipal User user, + public ResponseEntity reviewDelete(@AuthenticationPrincipal User user, @PathVariable int reviewId) { if (user == null) { throw new CustomException(ErrorCode.ACCESS_DENIED); } reviewService.reviewDelete(user.getUsername(), reviewId); - return new SuccessResponse("리뷰 삭제 완료"); + return ResponseEntity.ok("리뷰 삭제 성공"); } // 반경 넓히기 diff --git a/src/main/java/com/mpnp/baechelin/review/domain/Review.java b/src/main/java/com/mpnp/baechelin/review/domain/Review.java index 976c1af..8355836 100644 --- a/src/main/java/com/mpnp/baechelin/review/domain/Review.java +++ b/src/main/java/com/mpnp/baechelin/review/domain/Review.java @@ -6,8 +6,10 @@ import com.mpnp.baechelin.user.domain.User; import com.mpnp.baechelin.util.TimeStamped; import lombok.*; +import org.hibernate.validator.constraints.Length; import javax.persistence.*; +import javax.validation.constraints.NotBlank; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -26,6 +28,8 @@ public class Review extends TimeStamped { private int id; //평가(댓글)내용 + @NotBlank(message = "내용을 입력해주세요") + @Length(min = 20, max = 200, message = "20자 이상, 200자 이하로 작성해주세요") @Column(nullable = false) private String content; diff --git a/src/main/java/com/mpnp/baechelin/review/dto/ReviewRequestDto.java b/src/main/java/com/mpnp/baechelin/review/dto/ReviewRequestDto.java index 4641cb0..f04d5ba 100644 --- a/src/main/java/com/mpnp/baechelin/review/dto/ReviewRequestDto.java +++ b/src/main/java/com/mpnp/baechelin/review/dto/ReviewRequestDto.java @@ -1,7 +1,11 @@ package com.mpnp.baechelin.review.dto; +import com.mpnp.baechelin.exception.CustomException; +import com.mpnp.baechelin.exception.ErrorCode; import lombok.*; import org.hibernate.validator.constraints.Length; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; import org.springframework.web.multipart.MultipartFile; @@ -12,21 +16,20 @@ import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; import java.util.List; +import java.util.Optional; -@Getter @Setter +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor @Builder -@Valid public class ReviewRequestDto { //review 테이블 컬럼 - private long storeId; //업장 아이디 - @NotBlank(message = "내용을 입력해주세요") - @Length(min = 20, max = 200, message = "20자 이상, 200자 이하로 작성해주세요") - private String content; //리뷰 코멘트 - private double point; //별점 - private List tagList; //태그 + private long storeId; //업장 아이디 + private String content; //리뷰 코멘트 + private double point; //별점 + private List tagList; //태그 private List imageFile; //리뷰 이미지 사진 public List Tags() { diff --git a/src/main/java/com/mpnp/baechelin/review/service/ReviewService.java b/src/main/java/com/mpnp/baechelin/review/service/ReviewService.java index 7290b7f..ccde028 100644 --- a/src/main/java/com/mpnp/baechelin/review/service/ReviewService.java +++ b/src/main/java/com/mpnp/baechelin/review/service/ReviewService.java @@ -24,6 +24,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.validation.BindingResult; import org.springframework.web.multipart.MultipartFile; import javax.transaction.Transactional; @@ -51,11 +52,9 @@ public class ReviewService { * 리뷰 작성 */ public void review(ReviewRequestDto reviewRequestDto, String socialId) throws IOException { - - - for(String tag: reviewRequestDto.getTagList()){ - for(String tagsList: reviewRequestDto.Tags()){ - if(tag != tagsList){ + for (String tag : reviewRequestDto.getTagList()) { + for (String tagsList : reviewRequestDto.Tags()) { + if (tag != tagsList) { new Exception("해당 태그명으로 리뷰 등록할 수 없습니다"); } }