diff --git a/build.gradle.kts b/build.gradle.kts index 630e38b9..ae159356 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,6 +29,7 @@ dependencies { implementation ("io.netty:netty-resolver-dns-native-macos:4.1.70.Final:osx-aarch_64") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-web") + implementation ("org.springframework.boot:spring-boot-starter-validation") compileOnly("org.projectlombok:lombok") developmentOnly("org.springframework.boot:spring-boot-devtools") runtimeOnly("com.h2database:h2") diff --git a/src/main/java/jeje/work/aeatbe/controller/ArticleController.java b/src/main/java/jeje/work/aeatbe/controller/ArticleController.java index e4769c25..aaee0b45 100644 --- a/src/main/java/jeje/work/aeatbe/controller/ArticleController.java +++ b/src/main/java/jeje/work/aeatbe/controller/ArticleController.java @@ -1,5 +1,6 @@ package jeje.work.aeatbe.controller; +import jakarta.validation.Valid; import jeje.work.aeatbe.dto.article.ArticleDTO; import jeje.work.aeatbe.dto.article.ArticleResponseDTO; import jeje.work.aeatbe.service.ArticleService; @@ -26,7 +27,7 @@ public class ArticleController { * @return 생성된 칼럼의 DTO와 상태 코드 201 (Created) */ @PostMapping - public ResponseEntity createArticle(@RequestBody ArticleDTO articleDTO) { + public ResponseEntity createArticle(@RequestBody @Valid ArticleDTO articleDTO) { ArticleDTO createdArticle = articleService.createArticle(articleDTO); return ResponseEntity.status(HttpStatus.CREATED).body(createdArticle); } @@ -71,7 +72,7 @@ public ResponseEntity getArticleById(@PathVariable Long id) * @return 업데이트된 칼럼의 DTO와 상태 코드 200 (OK) */ @PatchMapping("/{id}") - public ResponseEntity updateArticle(@PathVariable Long id, @RequestBody ArticleDTO articleDTO) { + public ResponseEntity updateArticle(@PathVariable Long id, @RequestBody @Valid ArticleDTO articleDTO) { ArticleDTO updatedArticle = articleService.updateArticle(id, articleDTO); return ResponseEntity.ok(updatedArticle); } diff --git a/src/main/java/jeje/work/aeatbe/controller/ProductController.java b/src/main/java/jeje/work/aeatbe/controller/ProductController.java index 9d8bc6a8..7a4702a7 100644 --- a/src/main/java/jeje/work/aeatbe/controller/ProductController.java +++ b/src/main/java/jeje/work/aeatbe/controller/ProductController.java @@ -1,6 +1,7 @@ package jeje.work.aeatbe.controller; +import jakarta.validation.Valid; import jeje.work.aeatbe.dto.product.ProductDTO; import jeje.work.aeatbe.dto.product.ProductResponseDTO; import jeje.work.aeatbe.service.ProductService; @@ -79,7 +80,7 @@ public ResponseEntity getProductsById(@PathVariable Long id) */ @PostMapping public ResponseEntity postProducts( - @RequestBody ProductDTO productDTO, + @RequestBody @Valid ProductDTO productDTO, @RequestParam List allergies, @RequestParam List freeFroms // ,@LoginUser Long userId @@ -100,7 +101,7 @@ public ResponseEntity postProducts( */ @PatchMapping("/{id}") public ResponseEntity updateProducts(@PathVariable Long id, - @RequestBody ProductDTO productDTO, + @RequestBody @Valid ProductDTO productDTO, @RequestParam List allergies, @RequestParam List freeFroms // ,@LoginUser Long userId diff --git a/src/main/java/jeje/work/aeatbe/controller/ReviewController.java b/src/main/java/jeje/work/aeatbe/controller/ReviewController.java index 4064f6ff..2f748c53 100644 --- a/src/main/java/jeje/work/aeatbe/controller/ReviewController.java +++ b/src/main/java/jeje/work/aeatbe/controller/ReviewController.java @@ -1,5 +1,6 @@ package jeje.work.aeatbe.controller; +import jakarta.validation.Valid; import jeje.work.aeatbe.annotation.LoginUser; import jeje.work.aeatbe.dto.review.ReviewRequestDTO; import jeje.work.aeatbe.dto.review.ReviewResponseDTO; @@ -62,7 +63,7 @@ public ResponseEntity getReivewsByUser(@LoginUser LoginUserInfo loginUserInfo * @return 201 created 응답 코드 */ @PostMapping - public ResponseEntity postReviews(@RequestBody ReviewRequestDTO reviewDTO, + public ResponseEntity postReviews(@RequestBody @Valid ReviewRequestDTO reviewDTO, @LoginUser LoginUserInfo loginUserInfo) { reviewService.createReview(reviewDTO, loginUserInfo.userId()); return ResponseEntity.status(HttpStatus.CREATED).build(); @@ -79,7 +80,7 @@ public ResponseEntity postReviews(@RequestBody ReviewRequestDTO reviewDTO, */ @PatchMapping("/{id}") public ResponseEntity updateReviews(@PathVariable Long id, - @RequestBody ReviewRequestDTO reviewDTO, + @RequestBody @Valid ReviewRequestDTO reviewDTO, @LoginUser LoginUserInfo loginUserInfo) { reviewService.updateReviews(id, reviewDTO, loginUserInfo.userId()); return ResponseEntity.ok().build(); diff --git a/src/main/java/jeje/work/aeatbe/controller/UserController.java b/src/main/java/jeje/work/aeatbe/controller/UserController.java index b27d090e..159e238f 100644 --- a/src/main/java/jeje/work/aeatbe/controller/UserController.java +++ b/src/main/java/jeje/work/aeatbe/controller/UserController.java @@ -1,5 +1,6 @@ package jeje.work.aeatbe.controller; +import jakarta.validation.Valid; import jeje.work.aeatbe.annotation.LoginUser; import jeje.work.aeatbe.dto.user.LoginUserInfo; import jeje.work.aeatbe.dto.user.UserInfoResponseDTO; @@ -36,7 +37,7 @@ public ResponseEntity getUserInfo(@LoginUser LoginUserInfo * @return 업데이트 된 정보 */ @PatchMapping("/info/update") - public ResponseEntity updateUserInfo(@RequestBody UserInfoUpdateReqeustDTO userInfoUpdateReqeustDto, + public ResponseEntity updateUserInfo(@RequestBody @Valid UserInfoUpdateReqeustDTO userInfoUpdateReqeustDto, @LoginUser LoginUserInfo loginUserInfo) { userService.updateUserInfo(userInfoUpdateReqeustDto, loginUserInfo.userId()); UserInfoResponseDTO userInfoResponseDto = userService.getUserInfo(loginUserInfo.userId()); diff --git a/src/main/java/jeje/work/aeatbe/dto/allergyCategory/AllergyCategoryDTO.java b/src/main/java/jeje/work/aeatbe/dto/allergyCategory/AllergyCategoryDTO.java index 666671c7..e6d00828 100644 --- a/src/main/java/jeje/work/aeatbe/dto/allergyCategory/AllergyCategoryDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/allergyCategory/AllergyCategoryDTO.java @@ -1,5 +1,7 @@ package jeje.work.aeatbe.dto.allergyCategory; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; /** @@ -12,6 +14,8 @@ @Builder public record AllergyCategoryDTO( Long id, + @NotNull(message = "입력값이 존재해야 합니다.") + @Size(max = 25, message = "알러지 타입이 25자를 초과할 수 없습니다.") String allergyType ) { } diff --git a/src/main/java/jeje/work/aeatbe/dto/article/ArticleDTO.java b/src/main/java/jeje/work/aeatbe/dto/article/ArticleDTO.java index 0fb303e6..e5375b9d 100644 --- a/src/main/java/jeje/work/aeatbe/dto/article/ArticleDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/article/ArticleDTO.java @@ -1,19 +1,29 @@ package jeje.work.aeatbe.dto.article; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; import java.sql.Timestamp; +import org.hibernate.validator.constraints.URL; @Builder public record ArticleDTO( Long id, + @NotNull(message = "제목이 존재해야 합니다.") + @Size(max = 100, message = "제목이 100자를 초과할 수 없습니다.") String title, String subTitle, Timestamp date, + @NotNull(message = "저자가 존재해야 합니다.") + @Size(max = 50, message = "저자의 이름이 50자를 초과할 수 없습니다.") String author, + @Size(max = 100, message = "태그 내용이 100자를 초과할 수 없습니다.") String tags, + @NotNull(message = "내용이 존재해야 합니다.") String content, int likes, + @URL(message = "유효하지 않는 URL 형식입니다.") String thumbnailUrl ) { diff --git a/src/main/java/jeje/work/aeatbe/dto/article/ArticleResponseDTO.java b/src/main/java/jeje/work/aeatbe/dto/article/ArticleResponseDTO.java index 6c746f1a..66e75985 100644 --- a/src/main/java/jeje/work/aeatbe/dto/article/ArticleResponseDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/article/ArticleResponseDTO.java @@ -1,9 +1,12 @@ package jeje.work.aeatbe.dto.article; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; import java.sql.Timestamp; import java.util.List; +import org.hibernate.validator.constraints.URL; /** * 특정 칼럼 반환할 때 사용하는 형식입니다. @@ -11,7 +14,10 @@ @Builder public record ArticleResponseDTO( Long id, + @NotNull(message = "제목이 존재해야 합니다.") + @Size(max = 100, message = "제목이 100자를 초과할 수 없습니다.") String title, + @URL(message = "유효하지 않는 URL 형식입니다.") String imgurl, Timestamp createdAt, String auth, diff --git a/src/main/java/jeje/work/aeatbe/dto/freeFromCategory/FreeFromCategoryDTO.java b/src/main/java/jeje/work/aeatbe/dto/freeFromCategory/FreeFromCategoryDTO.java index 9e30505d..53c25a7e 100644 --- a/src/main/java/jeje/work/aeatbe/dto/freeFromCategory/FreeFromCategoryDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/freeFromCategory/FreeFromCategoryDTO.java @@ -1,10 +1,14 @@ package jeje.work.aeatbe.dto.freeFromCategory; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; @Builder public record FreeFromCategoryDTO( Long id, + @NotNull(message = "입력값이 존재해야 합니다.") + @Size(max = 25, message = "프리프롬 타입은 25자를 초과할 수 없습니다.") String freeFromType ) { } diff --git a/src/main/java/jeje/work/aeatbe/dto/product/ProductDTO.java b/src/main/java/jeje/work/aeatbe/dto/product/ProductDTO.java index 9f59565a..99311adc 100644 --- a/src/main/java/jeje/work/aeatbe/dto/product/ProductDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/product/ProductDTO.java @@ -4,9 +4,12 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; import java.util.List; +import org.hibernate.validator.constraints.URL; @Builder @JsonIgnoreProperties(ignoreUnknown = true) @@ -16,17 +19,26 @@ public record ProductDTO( @JsonProperty("allergy") @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) List allergy, @JsonProperty("nutrient") String nutritionalInfo, // 영양성분 + @URL(message = "유효하지 않는 URL 형식입니다.") @JsonProperty("imgurl1") String productImageUrl, // 상품 이미지 + @URL(message = "유효하지 않는 URL 형식입니다.") @JsonProperty("imgurl2") String metaImageUrl, // 상품 상세 설명 이미지 + @Size(max = 200, message = "제품 유형명이 200자를 초과할 수 없습니다.") @JsonProperty("prdkind") String typeName, // 제품 종류(유형명) + @Size(max = 200, message = "제조사 이름이 200자를 초과할 수 없습니다.") @JsonProperty("manufacture") String manufacturer, // 제조사 String seller, // todo: 판매 링크(추후에 사용 될 예정) + @Size(max = 100, message = "용량이 100을 초과할 수 없습니다.") @JsonProperty("capacity") String capacity, // 용량 + @NotNull(message = "상품명이 존재해야 합니다.") + @Size(max = 50, message = "상품명은 50자를 초과할 수 없습니다.") @JsonProperty("prdlstNm") String productName, // 상품명 + @Size(min = 0, message = "원재료 이름이 존재해야 합니다.") @JsonProperty("rawmtrl") String ingredients, // 원재료 Long price, // 가격(추후에 사용 될 예정) @JsonProperty("barcode") String productBarcode, // 상품 바코드(현재 미사용중) String tag, + @Size(max = 20, message = "상품 판매처 이름은 20자 이상이어야 합니다.") String mallName // 상품 판매처 이름 ) { } diff --git a/src/main/java/jeje/work/aeatbe/dto/product/ProductResponseDTO.java b/src/main/java/jeje/work/aeatbe/dto/product/ProductResponseDTO.java index 3fc9877f..c30e59ca 100644 --- a/src/main/java/jeje/work/aeatbe/dto/product/ProductResponseDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/product/ProductResponseDTO.java @@ -1,14 +1,20 @@ package jeje.work.aeatbe.dto.product; +import jakarta.validation.constraints.Size; import lombok.Builder; +import org.hibernate.validator.constraints.URL; @Builder public record ProductResponseDTO( Long id, String name, + @Size(min = 0, message = "가격이 0원 이상이어야 합니다.") Long price, + @URL(message = "유효하지 않는 URL 형식입니다.") String imgUrl, + @Size(min = 0, max = 5, message = "평점이 0점이상, 5점이하여야 합니다.") Double rating, + @URL(message = "유효하지 않는 URL 형식입니다.") String ProductUrl, String description, String[] freeFrom, diff --git a/src/main/java/jeje/work/aeatbe/dto/review/ReviewDTO.java b/src/main/java/jeje/work/aeatbe/dto/review/ReviewDTO.java index 2bcfecff..2dce3b73 100644 --- a/src/main/java/jeje/work/aeatbe/dto/review/ReviewDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/review/ReviewDTO.java @@ -1,15 +1,21 @@ package jeje.work.aeatbe.dto.review; import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import java.time.LocalDateTime; import lombok.Builder; @Builder public record ReviewDTO( Long id, + @Size(min = 0, max = 5, message = "평점이 0점이상, 5점이하여야 합니다.") + @NotNull(message = "평점을 입력해주셔야 합니다.") Long rate, String content, + @NotNull(message = "입력값이 존재해야 합니다.") Long userId, + @NotNull(message = "입력값이 존재해야 합니다.") Long productId, LocalDateTime date, @Nullable diff --git a/src/main/java/jeje/work/aeatbe/dto/review/ReviewRequestDTO.java b/src/main/java/jeje/work/aeatbe/dto/review/ReviewRequestDTO.java index a5eb6a34..37a9ed7e 100644 --- a/src/main/java/jeje/work/aeatbe/dto/review/ReviewRequestDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/review/ReviewRequestDTO.java @@ -1,11 +1,16 @@ package jeje.work.aeatbe.dto.review; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.Builder; @Builder public record ReviewRequestDTO( + @Size(min = 0, max = 5, message = "평점이 0점이상, 5점이하여야 합니다.") + @NotNull(message = "평점을 입력해주셔야 합니다.") Long rate, String content, + @NotNull(message = "입력값이 존재해야 합니다.") Long productId ) { } diff --git a/src/main/java/jeje/work/aeatbe/dto/review/ReviewResponseDTO.java b/src/main/java/jeje/work/aeatbe/dto/review/ReviewResponseDTO.java index 481f56b6..4d9590c9 100644 --- a/src/main/java/jeje/work/aeatbe/dto/review/ReviewResponseDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/review/ReviewResponseDTO.java @@ -1,16 +1,23 @@ package jeje.work.aeatbe.dto.review; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import java.time.LocalDateTime; import jeje.work.aeatbe.dto.user.UserInfoResponseDTO; import lombok.Builder; +import org.hibernate.validator.constraints.URL; @Builder public record ReviewResponseDTO( Long id, + @Size(min = 0, max = 5, message = "평점이 0점이상, 5점이하여야 합니다.") + @NotNull(message = "평점을 입력해주셔야 합니다.") Long rate, String content, UserInfoResponseDTO user, + @NotNull(message = "입력값이 존재해야 합니다.") Long productId, + @URL(message = "유효하지 않는 URL 형식입니다.") String productImgUrl, String productName, LocalDateTime date diff --git a/src/main/java/jeje/work/aeatbe/dto/user/UserAllergyDTO.java b/src/main/java/jeje/work/aeatbe/dto/user/UserAllergyDTO.java deleted file mode 100644 index 9231b575..00000000 --- a/src/main/java/jeje/work/aeatbe/dto/user/UserAllergyDTO.java +++ /dev/null @@ -1,12 +0,0 @@ -package jeje.work.aeatbe.dto.user; - - -import lombok.Builder; - -@Builder -public record UserAllergyDTO( - Long id, - Long UserId, - Long allergyId -) { -} \ No newline at end of file diff --git a/src/main/java/jeje/work/aeatbe/dto/user/UserDTO.java b/src/main/java/jeje/work/aeatbe/dto/user/UserDTO.java deleted file mode 100644 index 2a9b5dbb..00000000 --- a/src/main/java/jeje/work/aeatbe/dto/user/UserDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package jeje.work.aeatbe.dto.user; - -import lombok.Builder; - - -@Builder -public record UserDTO( - Long id, - String userId, - String allergies -) { - -} \ No newline at end of file diff --git a/src/main/java/jeje/work/aeatbe/dto/user/UserFreeFromDTO.java b/src/main/java/jeje/work/aeatbe/dto/user/UserFreeFromDTO.java deleted file mode 100644 index 63f75d94..00000000 --- a/src/main/java/jeje/work/aeatbe/dto/user/UserFreeFromDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package jeje.work.aeatbe.dto.user; - -import lombok.Builder; - -@Builder -public record UserFreeFromDTO( - Long id, - Long userId, - Long freeFromId -) { -} \ No newline at end of file diff --git a/src/main/java/jeje/work/aeatbe/dto/user/UserInfoResponseDTO.java b/src/main/java/jeje/work/aeatbe/dto/user/UserInfoResponseDTO.java index 627ac2a9..c2faaaa1 100644 --- a/src/main/java/jeje/work/aeatbe/dto/user/UserInfoResponseDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/user/UserInfoResponseDTO.java @@ -1,13 +1,17 @@ package jeje.work.aeatbe.dto.user; +import jakarta.validation.constraints.Size; import lombok.Builder; import java.util.List; +import org.hibernate.validator.constraints.URL; @Builder public record UserInfoResponseDTO( Long id, + @Size(max = 15, message = "유저이름이 15자를 초과할 수 없습니다.") String userName, + @URL(message = "유효하지 않는 URL 형식입니다.") String userImageUrl, List allergies, List freefrom diff --git a/src/main/java/jeje/work/aeatbe/dto/user/UserInfoUpdateReqeustDTO.java b/src/main/java/jeje/work/aeatbe/dto/user/UserInfoUpdateReqeustDTO.java index 6fe2e7e8..646c5e34 100644 --- a/src/main/java/jeje/work/aeatbe/dto/user/UserInfoUpdateReqeustDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/user/UserInfoUpdateReqeustDTO.java @@ -1,12 +1,16 @@ package jeje.work.aeatbe.dto.user; +import jakarta.validation.constraints.Size; import lombok.Builder; import java.util.List; +import org.hibernate.validator.constraints.URL; @Builder public record UserInfoUpdateReqeustDTO( + @Size(max = 15, message = "유저 이름이 15자를 초과할 수 없습니다.") String userName, + @URL(message = "유효하지 않는 URL 형식입니다.") String userImageUrl, List allergies, List freefrom diff --git a/src/main/java/jeje/work/aeatbe/dto/wishlist/WishProductDTO.java b/src/main/java/jeje/work/aeatbe/dto/wishlist/WishProductDTO.java index fe89cedf..c07b4ab7 100644 --- a/src/main/java/jeje/work/aeatbe/dto/wishlist/WishProductDTO.java +++ b/src/main/java/jeje/work/aeatbe/dto/wishlist/WishProductDTO.java @@ -1,12 +1,16 @@ package jeje.work.aeatbe.dto.wishlist; +import jakarta.validation.constraints.NotNull; import lombok.Builder; +import org.hibernate.validator.constraints.URL; @Builder public record WishProductDTO( Long id, + @NotNull(message = "이름이 존재해야 합니다.") String name, Long price, + @URL(message = "유효하지 않는 URL 형식입니다.") String imgurl, String tag ) {