diff --git a/src/main/java/com/example/eightyage/domain/auth/entity/RefreshToken.java b/src/main/java/com/example/eightyage/domain/auth/entity/RefreshToken.java index 0c98161..fb481c2 100644 --- a/src/main/java/com/example/eightyage/domain/auth/entity/RefreshToken.java +++ b/src/main/java/com/example/eightyage/domain/auth/entity/RefreshToken.java @@ -1,5 +1,6 @@ package com.example.eightyage.domain.auth.entity; +import com.example.eightyage.domain.auth.tokenstate.TokenState; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; diff --git a/src/main/java/com/example/eightyage/domain/auth/service/TokenService.java b/src/main/java/com/example/eightyage/domain/auth/service/TokenService.java index b2c3514..ee0c61e 100644 --- a/src/main/java/com/example/eightyage/domain/auth/service/TokenService.java +++ b/src/main/java/com/example/eightyage/domain/auth/service/TokenService.java @@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import static com.example.eightyage.domain.auth.entity.TokenState.INVALIDATED; +import static com.example.eightyage.domain.auth.tokenstate.TokenState.INVALIDATED; import static com.example.eightyage.global.exception.ErrorMessage.EXPIRED_REFRESH_TOKEN; import static com.example.eightyage.global.exception.ErrorMessage.REFRESH_TOKEN_NOT_FOUND; diff --git a/src/main/java/com/example/eightyage/domain/auth/entity/TokenState.java b/src/main/java/com/example/eightyage/domain/auth/tokenstate/TokenState.java similarity index 50% rename from src/main/java/com/example/eightyage/domain/auth/entity/TokenState.java rename to src/main/java/com/example/eightyage/domain/auth/tokenstate/TokenState.java index 3ec0bd7..c2f358c 100644 --- a/src/main/java/com/example/eightyage/domain/auth/entity/TokenState.java +++ b/src/main/java/com/example/eightyage/domain/auth/tokenstate/TokenState.java @@ -1,4 +1,4 @@ -package com.example.eightyage.domain.auth.entity; +package com.example.eightyage.domain.auth.tokenstate; public enum TokenState { VALID, diff --git a/src/main/java/com/example/eightyage/domain/product/entity/Product.java b/src/main/java/com/example/eightyage/domain/product/entity/Product.java index 169b980..5f061f9 100644 --- a/src/main/java/com/example/eightyage/domain/product/entity/Product.java +++ b/src/main/java/com/example/eightyage/domain/product/entity/Product.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -37,6 +38,9 @@ public class Product extends TimeStamped { @OneToMany(mappedBy = "product") private List reviews = new ArrayList<>(); + @Temporal(TemporalType.TIMESTAMP) + private LocalDateTime deletedAt; + @Builder public Product(String name, Category category, String content, Integer price, SaleState saleState) { this.name = name; @@ -75,4 +79,8 @@ public void updateSaleState(SaleState newSaleState) { this.saleState = newSaleState; } } + + public void deleteProduct() { + this.deletedAt = LocalDateTime.now(); + } } diff --git a/src/main/java/com/example/eightyage/domain/product/repository/ProductImageRepository.java b/src/main/java/com/example/eightyage/domain/product/repository/ProductImageRepository.java index a29cc6c..a167757 100644 --- a/src/main/java/com/example/eightyage/domain/product/repository/ProductImageRepository.java +++ b/src/main/java/com/example/eightyage/domain/product/repository/ProductImageRepository.java @@ -10,6 +10,6 @@ public interface ProductImageRepository extends JpaRepository { - @Query("SELECT pi FROM ProductImage pi WHERE pi.id = :imageId AND pi.deletedAt IS NULL") + @Query("SELECT pi FROM ProductImage pi WHERE pi.id = :imageId") Optional findById(Long imageId); } diff --git a/src/main/java/com/example/eightyage/domain/product/service/ProductImageService.java b/src/main/java/com/example/eightyage/domain/product/service/ProductImageService.java index 2fb20bc..d5ed35e 100644 --- a/src/main/java/com/example/eightyage/domain/product/service/ProductImageService.java +++ b/src/main/java/com/example/eightyage/domain/product/service/ProductImageService.java @@ -68,7 +68,7 @@ public String uploadImage(Long productId, MultipartFile file) { public void deleteImage(Long imageId) { ProductImage findProductImage = findProductImageByIdOrElseThrow(imageId); - findProductImage.delete(); + productImageRepository.delete(findProductImage); } public ProductImage findProductImageByIdOrElseThrow(Long imageId){ diff --git a/src/main/java/com/example/eightyage/domain/product/service/ProductService.java b/src/main/java/com/example/eightyage/domain/product/service/ProductService.java index 9d4e986..052a4a0 100644 --- a/src/main/java/com/example/eightyage/domain/product/service/ProductService.java +++ b/src/main/java/com/example/eightyage/domain/product/service/ProductService.java @@ -138,11 +138,9 @@ public void deleteProduct(Long productId) { Product findProduct = findProductByIdOrElseThrow(productId); List findReviewList = reviewRepository.findReviewsByProductId(productId); - for (Review review : findReviewList) { - review.delete(); - } + reviewRepository.deleteAll(findReviewList); - findProduct.delete(); + findProduct.deleteProduct(); } public Product findProductByIdOrElseThrow(Long productId) { @@ -150,6 +148,4 @@ public Product findProductByIdOrElseThrow(Long productId) { () -> new NotFoundException("해당 제품이 존재하지 않습니다.") ); } - - } diff --git a/src/main/java/com/example/eightyage/domain/review/repository/ReviewRepository.java b/src/main/java/com/example/eightyage/domain/review/repository/ReviewRepository.java index 24716be..fd3bd04 100644 --- a/src/main/java/com/example/eightyage/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/example/eightyage/domain/review/repository/ReviewRepository.java @@ -17,11 +17,11 @@ @Repository public interface ReviewRepository extends JpaRepository { - @Query("SELECT r FROM Review r WHERE r.id = :reviewId AND r.deletedAt IS NULL") + @Query("SELECT r FROM Review r WHERE r.id = :reviewId") Optional findById(@Param("reviewId") Long reviewId); Page findByProductIdAndProductDeletedAtIsNull(Long productId, Pageable pageable); - @Query("SELECT r FROM Review r JOIN FETCH r.user JOIN FETCH r.product WHERE r.product.id = :productId AND r.deletedAt IS NULL") + @Query("SELECT r FROM Review r JOIN FETCH r.user JOIN FETCH r.product WHERE r.product.id = :productId") List findReviewsByProductId(@Param("productId") Long productId); } diff --git a/src/main/java/com/example/eightyage/domain/review/service/ReviewService.java b/src/main/java/com/example/eightyage/domain/review/service/ReviewService.java index 5230b08..3d025ef 100644 --- a/src/main/java/com/example/eightyage/domain/review/service/ReviewService.java +++ b/src/main/java/com/example/eightyage/domain/review/service/ReviewService.java @@ -100,11 +100,11 @@ public void deleteReview(Long userId, Long reviewId) { User findUser = userService.findUserByIdOrElseThrow(userId); Review findReview = findReviewByIdOrElseThrow(reviewId); - if(findUser.getId().equals(findReview.getUser().getId())){ - findReview.delete(); - } else { + if(!findUser.getId().equals(findReview.getUser().getId())){ throw new UnauthorizedException("리뷰를 삭제할 권한이 없습니다."); } + + reviewRepository.delete(findReview); } public Review findReviewByIdOrElseThrow(Long reviewId){ diff --git a/src/main/java/com/example/eightyage/domain/user/entity/User.java b/src/main/java/com/example/eightyage/domain/user/entity/User.java index f208901..5847eec 100644 --- a/src/main/java/com/example/eightyage/domain/user/entity/User.java +++ b/src/main/java/com/example/eightyage/domain/user/entity/User.java @@ -29,6 +29,9 @@ public class User extends TimeStamped { @Enumerated(EnumType.STRING) private UserRole userRole; + @Temporal(TemporalType.TIMESTAMP) + private LocalDateTime deletedAt; + @Builder public User(Long id, String email, String nickname, String password, UserRole userRole) { this.id = id; @@ -48,6 +51,6 @@ public static User fromAuthUser(AuthUser authUser) { } public void deleteUser() { - setDeletedAt(LocalDateTime.now()); + this.deletedAt = LocalDateTime.now(); } } diff --git a/src/main/java/com/example/eightyage/global/entity/ErrorResponse.java b/src/main/java/com/example/eightyage/global/dto/ErrorResponse.java similarity index 92% rename from src/main/java/com/example/eightyage/global/entity/ErrorResponse.java rename to src/main/java/com/example/eightyage/global/dto/ErrorResponse.java index 6d9a51d..37382de 100644 --- a/src/main/java/com/example/eightyage/global/entity/ErrorResponse.java +++ b/src/main/java/com/example/eightyage/global/dto/ErrorResponse.java @@ -1,4 +1,4 @@ -package com.example.eightyage.global.entity; +package com.example.eightyage.global.dto; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/example/eightyage/global/entity/TimeStamped.java b/src/main/java/com/example/eightyage/global/entity/TimeStamped.java index 27b911b..75063c1 100644 --- a/src/main/java/com/example/eightyage/global/entity/TimeStamped.java +++ b/src/main/java/com/example/eightyage/global/entity/TimeStamped.java @@ -23,16 +23,4 @@ public abstract class TimeStamped { @Column @Temporal(TemporalType.TIMESTAMP) private LocalDateTime modifiedAt; - - @Column - @Temporal(TemporalType.TIMESTAMP) - private LocalDateTime deletedAt; - - public void delete() { - this.deletedAt = LocalDateTime.now(); - } - - public void setDeletedAt(LocalDateTime deletedAt) { - this.deletedAt = deletedAt; - } } diff --git a/src/main/java/com/example/eightyage/global/exception/BadRequestException.java b/src/main/java/com/example/eightyage/global/exception/BadRequestException.java index e6ae476..ef8afb4 100644 --- a/src/main/java/com/example/eightyage/global/exception/BadRequestException.java +++ b/src/main/java/com/example/eightyage/global/exception/BadRequestException.java @@ -1,6 +1,6 @@ package com.example.eightyage.global.exception; -public class BadRequestException extends CustomException { +public class BadRequestException extends HandledException { public BadRequestException() { super(ErrorCode.BAD_REQUEST); diff --git a/src/main/java/com/example/eightyage/global/exception/ForbiddenException.java b/src/main/java/com/example/eightyage/global/exception/ForbiddenException.java index 3cd553e..9d500a9 100644 --- a/src/main/java/com/example/eightyage/global/exception/ForbiddenException.java +++ b/src/main/java/com/example/eightyage/global/exception/ForbiddenException.java @@ -1,6 +1,6 @@ package com.example.eightyage.global.exception; -public class ForbiddenException extends CustomException { +public class ForbiddenException extends HandledException { public ForbiddenException() { super(ErrorCode.FORBIDDEN); diff --git a/src/main/java/com/example/eightyage/global/exception/GlobalExceptionHandler.java b/src/main/java/com/example/eightyage/global/exception/GlobalExceptionHandler.java index 62af117..1afcdac 100644 --- a/src/main/java/com/example/eightyage/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/eightyage/global/exception/GlobalExceptionHandler.java @@ -1,6 +1,6 @@ package com.example.eightyage.global.exception; -import com.example.eightyage.global.entity.ErrorResponse; +import com.example.eightyage.global.dto.ErrorResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,8 +20,8 @@ @RestControllerAdvice public class GlobalExceptionHandler { - @ExceptionHandler(CustomException.class) - public ResponseEntity> invalidRequestExceptionException(CustomException ex) { + @ExceptionHandler(HandledException.class) + public ResponseEntity> invalidRequestExceptionException(HandledException ex) { HttpStatus httpStatus = ex.getHttpStatus(); return new ResponseEntity<>(ErrorResponse.of(httpStatus, ex.getMessage()), ex.getHttpStatus()); } diff --git a/src/main/java/com/example/eightyage/global/exception/CustomException.java b/src/main/java/com/example/eightyage/global/exception/HandledException.java similarity index 76% rename from src/main/java/com/example/eightyage/global/exception/CustomException.java rename to src/main/java/com/example/eightyage/global/exception/HandledException.java index 1bc3086..ae7ce25 100644 --- a/src/main/java/com/example/eightyage/global/exception/CustomException.java +++ b/src/main/java/com/example/eightyage/global/exception/HandledException.java @@ -4,20 +4,20 @@ import org.springframework.http.HttpStatus; @Getter -public class CustomException extends RuntimeException { +public class HandledException extends RuntimeException { private final HttpStatus httpStatus; private final String message; // 예외 던질시 기본 메세지 출력 - public CustomException(ErrorCode errorCode) { + public HandledException(ErrorCode errorCode) { super(errorCode.getDefaultMessage()); this.httpStatus = errorCode.getStatus(); this.message = errorCode.getDefaultMessage(); } // 예외 던질시 메세지 출력 - public CustomException(ErrorCode errorCode, String message) { + public HandledException(ErrorCode errorCode, String message) { super(message); this.httpStatus = errorCode.getStatus(); this.message = message; diff --git a/src/main/java/com/example/eightyage/global/exception/NotFoundException.java b/src/main/java/com/example/eightyage/global/exception/NotFoundException.java index 9233a87..d3a2cc9 100644 --- a/src/main/java/com/example/eightyage/global/exception/NotFoundException.java +++ b/src/main/java/com/example/eightyage/global/exception/NotFoundException.java @@ -1,6 +1,6 @@ package com.example.eightyage.global.exception; -public class NotFoundException extends CustomException { +public class NotFoundException extends HandledException { public NotFoundException() { super(ErrorCode.NOT_FOUND); } diff --git a/src/main/java/com/example/eightyage/global/exception/UnauthorizedException.java b/src/main/java/com/example/eightyage/global/exception/UnauthorizedException.java index a347954..2409f33 100644 --- a/src/main/java/com/example/eightyage/global/exception/UnauthorizedException.java +++ b/src/main/java/com/example/eightyage/global/exception/UnauthorizedException.java @@ -1,6 +1,6 @@ package com.example.eightyage.global.exception; -public class UnauthorizedException extends CustomException { +public class UnauthorizedException extends HandledException { public UnauthorizedException() { super(ErrorCode.AUTHORIZATION); diff --git a/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java b/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java index 8e9492f..584784f 100644 --- a/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java +++ b/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java @@ -17,7 +17,7 @@ import java.util.Optional; -import static com.example.eightyage.domain.auth.entity.TokenState.INVALIDATED; +import static com.example.eightyage.domain.auth.tokenstate.TokenState.INVALIDATED; import static com.example.eightyage.global.exception.ErrorMessage.EXPIRED_REFRESH_TOKEN; import static com.example.eightyage.global.exception.ErrorMessage.REFRESH_TOKEN_NOT_FOUND; import static org.junit.jupiter.api.Assertions.*; @@ -120,7 +120,7 @@ public void setUp() { RefreshToken mockRefreshToken = mock(RefreshToken.class); given(refreshTokenRepository.findByToken(any(String.class))).willReturn(Optional.of(mockRefreshToken)); - given(userService.findUserByIdOrElseThrow(mockRefreshToken.getUserId())).willReturn(user); + given(userService.findUserByIdOrElseThrow(anyLong())).willReturn(user); // when User result = tokenService.reissueToken(refreshToken);