diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c212289..e2e9f96 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -15,10 +15,10 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Set up JDK 21 + - name: Set up JDK 17 uses: actions/setup-java@v4 with: - java-version: '21' + java-version: '17' distribution: 'temurin' cache: 'gradle' diff --git a/src/main/java/org/example/story/domain/blog/repository/BlogRepository.java b/src/main/java/org/example/story/domain/blog/repository/BlogRepository.java index 239a9b3..e4a50fc 100644 --- a/src/main/java/org/example/story/domain/blog/repository/BlogRepository.java +++ b/src/main/java/org/example/story/domain/blog/repository/BlogRepository.java @@ -12,17 +12,7 @@ @Repository public interface BlogRepository extends JpaRepository { - Optional findByIdAndUserId(Long id, Long userId); - - @Modifying - @Transactional - @Query("UPDATE BlogJpaEntity b SET b.comment = b.comment + 1 WHERE b.id = :blogId") - void incrementComment(Long blogId); - - @Modifying - @Transactional - @Query("UPDATE BlogJpaEntity b SET b.comment = b.comment - 1 WHERE b.id = :blogId") - void decrementComment(Long blogId); + Optional findByIdAndUser_Id(Long id, Long userId); @Query(""" select b from BlogJpaEntity b diff --git a/src/main/java/org/example/story/domain/blog/service/BlogCommentService.java b/src/main/java/org/example/story/domain/blog/service/BlogCommentService.java index 84485eb..38f542f 100644 --- a/src/main/java/org/example/story/domain/blog/service/BlogCommentService.java +++ b/src/main/java/org/example/story/domain/blog/service/BlogCommentService.java @@ -39,8 +39,8 @@ public BlogCommentResponse createComment(Long userId, BlogCommentRequest request .content(request.content()) .createdAt(Instant.now()) .build(); - blogCommentRepository.save(comment); blog.increaseComment(); + blogCommentRepository.save(comment); return new BlogCommentResponse( comment.getId(), comment.getBlog().getId(), @@ -60,8 +60,8 @@ public void deleteComment(Long userId, Long blogId, Long commentId) { if (!comment.getUser().getId().equals(userId)) { throw new ExpectedException(HttpStatus.FORBIDDEN, "댓글을 삭제할 권한이 없습니다."); } - blogCommentRepository.delete(comment); blog.decreaseComment(); + blogCommentRepository.delete(comment); } public BlogCommentListResponse getComments(Long blogId) { diff --git a/src/main/java/org/example/story/domain/blog/service/BlogQueryService.java b/src/main/java/org/example/story/domain/blog/service/BlogQueryService.java index 3d1cc2b..481e8a8 100644 --- a/src/main/java/org/example/story/domain/blog/service/BlogQueryService.java +++ b/src/main/java/org/example/story/domain/blog/service/BlogQueryService.java @@ -16,7 +16,7 @@ public class BlogQueryService { private final BlogRepository blogRepository; public BlogResponse getForEdit(Long userId, Long blogId){ - BlogJpaEntity blog = blogRepository.findByIdAndUserId(blogId, userId) + BlogJpaEntity blog = blogRepository.findByIdAndUser_Id(blogId, userId) .orElseThrow(() -> new ExpectedException(HttpStatus.NOT_FOUND, "존재하지 않는 블로그입니다.")); return new BlogResponse( blog.getId(), diff --git a/src/main/java/org/example/story/domain/blog/service/BlogService.java b/src/main/java/org/example/story/domain/blog/service/BlogService.java index fe9d1d6..b1400a6 100644 --- a/src/main/java/org/example/story/domain/blog/service/BlogService.java +++ b/src/main/java/org/example/story/domain/blog/service/BlogService.java @@ -70,7 +70,7 @@ public BlogResponse write(Long userId, BlogRequest request) { public BlogResponse edit(Long userId, Long blogId, BlogRequest request) { - BlogJpaEntity blog = blogRepository.findByIdAndUserId(blogId, userId) + BlogJpaEntity blog = blogRepository.findByIdAndUser_Id(blogId, userId) .orElseThrow(() -> new ExpectedException(HttpStatus.NOT_FOUND, "존재하지 않는 블로그입니다.")); blog.update(request.title(), request.content(), request.introduce(), request.thumbnail()); @@ -94,17 +94,18 @@ public BlogResponse edit(Long userId, Long blogId, BlogRequest request) { @Transactional public void delete(Long userId, Long blogId) { List images = - blogImageRepository.findByBlogId(blogId); + blogImageRepository.findByBlog_Id(blogId); - for (BlogImageJpaEntity img : images) { - imageService.deleteImage(img.getImageUrl()); - } - - BlogJpaEntity blog = blogRepository.findByIdAndUserId(blogId, userId) + BlogJpaEntity blog = blogRepository.findByIdAndUser_Id(blogId, userId) .orElseThrow(() -> new ExpectedException(HttpStatus.NOT_FOUND, "존재하지 않는 블로그입니다.")); if (blog.getThumbnail() != null && !blog.getThumbnail().isBlank()) { imageService.deleteImage(blog.getThumbnail()); } + + for (BlogImageJpaEntity img : images) { + imageService.deleteImage(img.getImageUrl()); + } + blogRepository.delete(blog); } @@ -190,7 +191,7 @@ public void deleteBlogImage(Long userId,Long imageId) { public List getBlogImages(Long blogId) { List images = - blogImageRepository.findByBlogId(blogId); + blogImageRepository.findByBlog_Id(blogId); return images.stream() .map(img -> new ImageResponse( diff --git a/src/main/java/org/example/story/domain/image/repository/BlogImageRepository.java b/src/main/java/org/example/story/domain/image/repository/BlogImageRepository.java index fa9e973..14ec05e 100644 --- a/src/main/java/org/example/story/domain/image/repository/BlogImageRepository.java +++ b/src/main/java/org/example/story/domain/image/repository/BlogImageRepository.java @@ -8,6 +8,6 @@ @Repository public interface BlogImageRepository extends JpaRepository { - List findByBlogId(Long blogId); + List findByBlog_Id(Long blogId); } diff --git a/src/main/java/org/example/story/domain/image/repository/PortfolioImageRepository.java b/src/main/java/org/example/story/domain/image/repository/PortfolioImageRepository.java index d481088..3759f72 100644 --- a/src/main/java/org/example/story/domain/image/repository/PortfolioImageRepository.java +++ b/src/main/java/org/example/story/domain/image/repository/PortfolioImageRepository.java @@ -8,6 +8,6 @@ @Repository public interface PortfolioImageRepository extends JpaRepository { - List findByPortfolioId(Long portfolioId); + List findByPortfolio_Id(Long portfolioId); } diff --git a/src/main/java/org/example/story/domain/image/service/ImageService.java b/src/main/java/org/example/story/domain/image/service/ImageService.java index 7af43f6..1b7de9f 100644 --- a/src/main/java/org/example/story/domain/image/service/ImageService.java +++ b/src/main/java/org/example/story/domain/image/service/ImageService.java @@ -25,13 +25,13 @@ public class ImageService { private final MinioClient minioClient; - @Value("${minio.bucket}") + @Value("${spring.minio.bucket}") private String bucket; - @Value("${minio.endpoint}") + @Value("${spring.minio.endpoint}") private String endpoint; - @Value("${minio.presigned-url-duration-minutes}") + @Value("${spring.minio.presigned-url-duration-minutes}") private long presignedUrlDuration; private static final String THUMBNAIL_DIRECTORY = "thumbnail/"; diff --git a/src/main/java/org/example/story/domain/portfolio/repository/PortfolioRepository.java b/src/main/java/org/example/story/domain/portfolio/repository/PortfolioRepository.java index 0e47712..a6cf288 100644 --- a/src/main/java/org/example/story/domain/portfolio/repository/PortfolioRepository.java +++ b/src/main/java/org/example/story/domain/portfolio/repository/PortfolioRepository.java @@ -13,17 +13,7 @@ @Repository public interface PortfolioRepository extends JpaRepository { - Optional findByIdAndUserId(Long id, Long userId); - - @Modifying - @Transactional - @Query("UPDATE PortfolioJpaEntity p SET p.comment = p.comment + 1 WHERE p.id = :portfolioId") - void incrementComment(Long portfolioId); - - @Modifying - @Transactional - @Query("UPDATE PortfolioJpaEntity p SET p.comment = p.comment - 1 WHERE p.id = :portfolioId") - void decrementComment(Long portfolioId); + Optional findByIdAndUser_Id(Long id, Long userId); @Query(""" select p from PortfolioJpaEntity p diff --git a/src/main/java/org/example/story/domain/portfolio/service/PortfolioCommentService.java b/src/main/java/org/example/story/domain/portfolio/service/PortfolioCommentService.java index a4b37a8..2a545c9 100644 --- a/src/main/java/org/example/story/domain/portfolio/service/PortfolioCommentService.java +++ b/src/main/java/org/example/story/domain/portfolio/service/PortfolioCommentService.java @@ -42,8 +42,8 @@ public PortfolioCommentResponse createComment(Long userId, PortfolioCommentReque .content(request.content()) .createdAt(Instant.now()) .build(); - portfolioCommentRepository.save(comment); portfolio.increaseComment(); + portfolioCommentRepository.save(comment); return new PortfolioCommentResponse( comment.getId(), comment.getPortfolio().getId(), @@ -63,9 +63,8 @@ public void deleteComment(Long userId, Long portfolioId, Long commentId) { if (!comment.getUser().getId().equals(userId)) { throw new ExpectedException(HttpStatus.FORBIDDEN, "댓글을 삭제할 권한이 없습니다."); } - portfolioCommentRepository.delete(comment); portfolio.decreaseComment(); - + portfolioCommentRepository.delete(comment); } public PortfolioCommentListResponse getComments(Long portfolioId) { diff --git a/src/main/java/org/example/story/domain/portfolio/service/PortfolioQueryService.java b/src/main/java/org/example/story/domain/portfolio/service/PortfolioQueryService.java index 301a8b9..2e585ae 100644 --- a/src/main/java/org/example/story/domain/portfolio/service/PortfolioQueryService.java +++ b/src/main/java/org/example/story/domain/portfolio/service/PortfolioQueryService.java @@ -17,7 +17,7 @@ public class PortfolioQueryService { private final PortfolioRepository portfolioRepository; public PortfolioResponse getForEdit(Long userId, Long portfolioId){ - PortfolioJpaEntity portfolio = portfolioRepository.findByIdAndUserId(portfolioId, userId) + PortfolioJpaEntity portfolio = portfolioRepository.findByIdAndUser_Id(portfolioId, userId) .orElseThrow(() -> new ExpectedException(HttpStatus.NOT_FOUND, "존재하지 않는 포트폴리오입니다.")); return new PortfolioResponse( portfolio.getId(), diff --git a/src/main/java/org/example/story/domain/portfolio/service/PortfolioService.java b/src/main/java/org/example/story/domain/portfolio/service/PortfolioService.java index 3c72add..38d39ab 100644 --- a/src/main/java/org/example/story/domain/portfolio/service/PortfolioService.java +++ b/src/main/java/org/example/story/domain/portfolio/service/PortfolioService.java @@ -68,7 +68,7 @@ public PortfolioResponse write(Long userId, PortfolioRequest request) { public PortfolioResponse edit(Long userId, Long portfolioId, PortfolioRequest request) { - PortfolioJpaEntity portfolio = portfolioRepository.findByIdAndUserId(portfolioId, userId) + PortfolioJpaEntity portfolio = portfolioRepository.findByIdAndUser_Id(portfolioId, userId) .orElseThrow(() -> new ExpectedException(HttpStatus.NOT_FOUND, "존재하지 않는 포트폴리오입니다.")); portfolio.update(request.title(),request.content(),request.introduce()); @@ -92,12 +92,12 @@ public PortfolioResponse edit(Long userId, Long portfolioId, PortfolioRequest re public void delete(Long userId, Long portfolioId) { List images = - portfolioImageRepository.findByPortfolioId(portfolioId); + portfolioImageRepository.findByPortfolio_Id(portfolioId); for (PortfolioImageJpaEntity img : images) { imageService.deleteImage(img.getImageUrl()); } - PortfolioJpaEntity portfolio = portfolioRepository.findByIdAndUserId(portfolioId, userId) + PortfolioJpaEntity portfolio = portfolioRepository.findByIdAndUser_Id(portfolioId, userId) .orElseThrow(() -> new ExpectedException(HttpStatus.NOT_FOUND, "존재하지 않는 포트폴리오입니다.")); portfolioRepository.delete(portfolio); @@ -209,7 +209,7 @@ public void deletePortfolioImage(Long userId, Long imageId) { public List getPortfolioImages(Long portfolioId) { List images = - portfolioImageRepository.findByPortfolioId(portfolioId); + portfolioImageRepository.findByPortfolio_Id(portfolioId); return images.stream() .map(img -> new ImageResponse( diff --git a/src/main/java/org/example/story/domain/user/service/GetAccountTokenService.java b/src/main/java/org/example/story/domain/user/service/GetAccountTokenService.java index b39776c..fbf700e 100644 --- a/src/main/java/org/example/story/domain/user/service/GetAccountTokenService.java +++ b/src/main/java/org/example/story/domain/user/service/GetAccountTokenService.java @@ -25,7 +25,7 @@ public TokenResDto execute(String email) { .orElseGet(() -> userRepository.save( UserJpaEntity.builder() .email(email) - .role("VERIFIED") + .role("UNVERIFIED") .build() )); return new TokenResDto( diff --git a/src/main/java/org/example/story/domain/user/service/SendEmailService.java b/src/main/java/org/example/story/domain/user/service/SendEmailService.java index 13f9815..0568d31 100644 --- a/src/main/java/org/example/story/domain/user/service/SendEmailService.java +++ b/src/main/java/org/example/story/domain/user/service/SendEmailService.java @@ -40,7 +40,7 @@ public void execute( null ), 10L ); - String verifyUrl = url + "/api/v1/auth/verify?token=" + token; + String verifyUrl = url + "?token=" + token; try { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); diff --git a/src/main/java/org/example/story/global/config/MinioConfig.java b/src/main/java/org/example/story/global/config/MinioConfig.java index ccec1c2..95b4dec 100644 --- a/src/main/java/org/example/story/global/config/MinioConfig.java +++ b/src/main/java/org/example/story/global/config/MinioConfig.java @@ -10,9 +10,9 @@ public class MinioConfig { @Bean public MinioClient minioClient( - @Value("${minio.endpoint}") String endpoint, - @Value("${minio.access-key}") String accessKey, - @Value("${minio.secret-key}") String secretKey + @Value("${spring.minio.endpoint}") String endpoint, + @Value("${spring.minio.access-key}") String accessKey, + @Value("${spring.minio.secret-key}") String secretKey ) { return MinioClient.builder() .endpoint(endpoint) diff --git a/src/main/java/org/example/story/global/security/jwt/JwtHeaderFilter.java b/src/main/java/org/example/story/global/security/jwt/JwtHeaderFilter.java index f17db79..8fd9b67 100644 --- a/src/main/java/org/example/story/global/security/jwt/JwtHeaderFilter.java +++ b/src/main/java/org/example/story/global/security/jwt/JwtHeaderFilter.java @@ -76,4 +76,31 @@ protected void doFilterInternal(HttpServletRequest request, } filterChain.doFilter(request, response); } + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) { + String uri = request.getRequestURI(); + + if (uri.startsWith("/api/v1/auth/sign") + || uri.startsWith("/api/v1/auth/login") + || uri.startsWith("/api/v1/auth/verify") + || uri.startsWith("/api/v1/auth/google") + || uri.startsWith("/api/v1/auth/kakao")) { + return true; + } else if (request.getMethod().equals("GET") && ( + uri.startsWith("/api/v1/main/") + || uri.startsWith("/api/v1/profile/") + || uri.startsWith("/api/v1/portfolio/view/") + || uri.startsWith("/api/v1/portfolio/comment/") + || uri.startsWith("/api/v1/blog/view/") + || uri.startsWith("/api/v1/blog/comment/"))) { + return true; + } + + if(request.getMethod().equals("OPTIONS")) { + return true; + } + + return false; + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 433f9dc..e2633ae 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -28,6 +28,7 @@ spring: access-key: ${MINIO_ACCESS_KEY} secret-key: ${MINIO_SECRET_KEY} bucket: story-images + presigned-url-duration-minutes: 10 task: execution: pool: