패스트캠퍼스
패스트캠퍼스 환급챌린지 26일차 : 9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online 강의 후기
이태우(1990년)
2025. 3. 30. 22:36
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
공부 시작 시각 인증

수강 인증 사진

PostRepository.java
package org.fastcampus.post.application.Interfaces;
import org.fastcampus.post.domain.*;
public interface PostRepository {
Post save(Post post);
Post findById(Long id);
}
JpaPostRepository.java
package org.fastcampus.post.repository.jpa;
import org.fastcampus.post.repository.entity.post.*;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
public interface JpaPostRepository extends JpaRepository<PostEntity, Long> {
@Modifying
@Query(value = "UPDATE PostEntity p "
+ "SET p.content = :#{#post.getContent()}, "
+ "p.state = :#{#post.getState()}, "
+ "p.updDt = now() "
+ "WHERE p.id = :#{#post.getId()}")
void updatePostEntity(PostEntity post);
@Modifying
@Query(value = "UPDATE PostEntity p "
+ "SET p.likeCount = :#{#post.getLikeCount()}, "
+ "p.updDt = now() "
+ "WHERE p.id = :#{#post.getId()}")
void updatePostLikeCount(PostEntity post);
}
PostRepositoryImpl.java
package org.fastcampus.post.repository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.fastcampus.post.application.Interfaces.PostRepository;
import org.fastcampus.post.domain.*;
import org.fastcampus.post.repository.entity.post.*;
import org.fastcampus.post.repository.jpa.JpaPostRepository;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class PostRepositoryImpl implements PostRepository {
private final JpaPostRepository jpaPostRepository;
@Override
@Transactional
public Post save(Post post) {
PostEntity postEntity = new PostEntity(post);
if (postEntity.getId() != null) {
jpaPostRepository.updatePostEntity(postEntity);
return postEntity.toPost();
}
postEntity = jpaPostRepository.save(postEntity);
return postEntity.toPost();
}
@Override
public Post findById(Long id) {
PostEntity postEntity = jpaPostRepository.findById(id).orElseThrow();
return postEntity.toPost();
}
}
PostService.java
package org.fastcampus.post.application;
import org.fastcampus.post.application.Interfaces.LikeRepository;
import org.fastcampus.post.application.Interfaces.PostRepository;
import org.fastcampus.post.application.dto.CreatePostRequestDto;
import org.fastcampus.post.application.dto.LikeRequestDto;
import org.fastcampus.post.application.dto.UpdatePostRequestDto;
import org.fastcampus.post.domain.*;
import org.fastcampus.user.application.UserService;
import org.fastcampus.user.domain.User;
import org.springframework.stereotype.Service;
@Service
public class PostService {
private final UserService userService;
private final PostRepository postRepository;
private final LikeRepository likeRepository;
public PostService(UserService userService, PostRepository postRepository, LikeRepository likeRepository) {
this.userService = userService;
this.postRepository = postRepository;
this.likeRepository = likeRepository;
}
public Post getPost(Long id) {
return postRepository.findById(id);
}
public Post createPost(CreatePostRequestDto dto) {
User author = userService.getUser(dto.userId());
Post post = Post.createPost(null, author, dto.content(), dto.state());
return postRepository.save(post);
}
public Post updatePost(Long postId, UpdatePostRequestDto dto) {
Post post = getPost(postId);
User user = userService.getUser(dto.userId());
post.updatePost(user, dto.content(), dto.state());
return postRepository.save(post);
}
public void likePost(LikeRequestDto dto) {
Post post = getPost(dto.targetId());
User user = userService.getUser(dto.userId());
if (likeRepository.checkLike(post, user)) {
return;
}
post.like(user);
likeRepository.like(post, user);
}
public void unlikePost(LikeRequestDto dto) {
Post post = getPost(dto.targetId());
User user = userService.getUser(dto.userId());
if (likeRepository.checkLike(post, user)) {
post.unlike();
likeRepository.unlike(post, user);
}
}
}
PostController.java
package org.fastcampus.post.ui;
import lombok.RequiredArgsConstructor;
import org.fastcampus.common.ui.*;
import org.fastcampus.post.application.PostService;
import org.fastcampus.post.application.dto.CreatePostRequestDto;
import org.fastcampus.post.application.dto.LikeRequestDto;
import org.fastcampus.post.application.dto.UpdatePostRequestDto;
import org.fastcampus.post.domain.*;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/post")
@RequiredArgsConstructor
public class PostController {
private final PostService postService;
@PostMapping
public Response<Long> createPost(@RequestBody CreatePostRequestDto dto) {
Post post = postService.createPost(dto);
return Response.OK(post.getId());
}
@PatchMapping("/{postId}")
public Response<Long> updatePost(@PathVariable(name = "postId") Long postId, @RequestBody UpdatePostRequestDto dto) {
Post post = postService.updatePost(postId, dto);
return Response.OK(post.getId());
}
@PostMapping("/like")
public Response<Void> likePost(@RequestBody LikeRequestDto dto) {
postService.likePost(dto);
return Response.OK(null);
}
@PostMapping("/unlike")
public Response<Void> unlikePost(@RequestBody LikeRequestDto dto) {
postService.unlikePost(dto);
return Response.OK(null);
}
}
CommentRepository.java
package org.fastcampus.post.application.Interfaces;
import org.fastcampus.post.domain.comment.*;
public interface CommentRepository {
Comment save(Comment comment);
Comment findById(Long id);
}
JpaCommentRepository.java
package org.fastcampus.post.repository.jpa;
import org.fastcampus.post.repository.entity.comment.*;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
public interface JpaCommentRepository extends JpaRepository<CommentEntity, Long> {
@Modifying
@Query(value = "UPDATE CommentEntity c "
+ "SET c.content = :#{#comment.getContent()}, "
+ "c.updDt = now() "
+ "WHERE c.id = :#{#comment.getId()}")
void updateCommentEntity(CommentEntity comment);
@Modifying
@Query(value = "UPDATE CommentEntity c "
+ "SET c.likeCount = :#{#comment.getLikeCount()}, "
+ "c.updDt = now() "
+ "WHERE c.id = :#{#comment.getId()}")
void updateCommentLikeCount(CommentEntity comment);
}
CommentRepositoryImpl.java
package org.fastcampus.post.repository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.fastcampus.post.application.Interfaces.CommentRepository;
import org.fastcampus.post.domain.comment.*;
import org.fastcampus.post.repository.entity.comment.*;
import org.fastcampus.post.repository.jpa.JpaCommentRepository;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class CommentRepositoryImpl implements CommentRepository {
private final JpaCommentRepository jpaCommentRepository;
@Override
@Transactional
public Comment save(Comment comment) {
CommentEntity commentEntity = new CommentEntity(comment);
if (comment.getId() != null) {
jpaCommentRepository.updateCommentEntity(commentEntity);
return comment;
}
commentEntity = jpaCommentRepository.save(commentEntity);
return commentEntity.toComment();
}
@Override
public Comment findById(Long id) {
CommentEntity commentEntity = jpaCommentRepository.findById(id).orElseThrow();
return commentEntity.toComment();
}
}
CommentService.java
package org.fastcampus.post.application;
import org.fastcampus.post.application.Interfaces.CommentRepository;
import org.fastcampus.post.application.Interfaces.LikeRepository;
import org.fastcampus.post.application.dto.CreateCommentRequestDto;
import org.fastcampus.post.application.dto.LikeRequestDto;
import org.fastcampus.post.application.dto.UpdateCommentRequestDto;
import org.fastcampus.post.domain.Post;
import org.fastcampus.post.domain.comment.*;
import org.fastcampus.user.application.UserService;
import org.fastcampus.user.domain.User;
import org.springframework.stereotype.Service;
@Service
public class CommentService {
private final UserService userService;
private final PostService postService;
private final CommentRepository commentRepository;
private final LikeRepository likeRepository;
public CommentService(UserService userService, PostService postService,
CommentRepository commentRepository, LikeRepository likeRepository) {
this.userService = userService;
this.postService = postService;
this.commentRepository = commentRepository;
this.likeRepository = likeRepository;
}
public Comment getComment(Long id) {
return commentRepository.findById(id);
}
public Comment createComment(CreateCommentRequestDto dto) {
Post post = postService.getPost(dto.postId());
User user = userService.getUser(dto.userId());
Comment comment = Comment.createComment(post, user, dto.content());
return commentRepository.save(comment);
}
public Comment updateComment(Long commentId, UpdateCommentRequestDto dto) {
Comment comment = getComment(commentId);
User user = userService.getUser(dto.userId());
comment.updateComment(user, dto.content());
return commentRepository.save(comment);
}
public void likeComment(LikeRequestDto dto) {
Comment comment = getComment(dto.targetId());
User user = userService.getUser(dto.userId());
if (likeRepository.checkLike(comment, user)) {
return;
}
comment.like(user);
likeRepository.like(comment, user);
}
public void unlikeComment(LikeRequestDto dto) {
Comment comment = getComment(dto.targetId());
User user = userService.getUser(dto.userId());
if (likeRepository.checkLike(comment, user)) {
comment.unlike();
likeRepository.unlike(comment, user);
}
}
}
CommentController.java
package org.fastcampus.post.ui;
import lombok.RequiredArgsConstructor;
import org.fastcampus.common.ui.*;
import org.fastcampus.post.application.CommentService;
import org.fastcampus.post.application.dto.CreateCommentRequestDto;
import org.fastcampus.post.application.dto.LikeRequestDto;
import org.fastcampus.post.application.dto.UpdateCommentRequestDto;
import org.fastcampus.post.domain.comment.*;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/comment")
@RequiredArgsConstructor
public class CommentController {
private final CommentService commentService;
@PostMapping
public Response<Long> createComment(@RequestBody CreateCommentRequestDto dto) {
Comment comment = commentService.createComment(dto);
return Response.OK(comment.getId());
}
@PatchMapping("/{commentId}")
public Response<Long> updateComment(@PathVariable(name = "commentId") Long commentId,
@RequestBody UpdateCommentRequestDto dto) {
Comment comment = commentService.updateComment(commentId, dto);
return Response.OK(comment.getId());
}
@PostMapping("/like")
public Response<Void> likeComment(@RequestBody LikeRequestDto dto) {
commentService.likeComment(dto);
return Response.OK(null);
}
@PostMapping("/unlike")
public Response<Void> unlikeComment(@RequestBody LikeRequestDto dto) {
commentService.unlikeComment(dto);
return Response.OK(null);
}
}
LikeRepositoryImpl.java
package org.fastcampus.post.repository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.fastcampus.post.application.Interfaces.LikeRepository;
import org.fastcampus.post.domain.Post;
import org.fastcampus.post.domain.comment.*;
import org.fastcampus.post.repository.entity.comment.*;
import org.fastcampus.post.repository.entity.like.*;
import org.fastcampus.post.repository.entity.post.PostEntity;
import org.fastcampus.post.repository.jpa.*;
import org.fastcampus.user.domain.User;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class LikeRepositoryImpl implements LikeRepository {
@PersistenceContext
private final EntityManager entityManager;
private final JpaPostRepository jpaPostRepository;
private final JpaCommentRepository jpaCommentRepository;
private final JpaLikeRepository jpaLikeRepository;
@Override
public boolean checkLike(Post post, User user) {
LikeEntity likeEntity = new LikeEntity(post, user);
return jpaLikeRepository.existsById(likeEntity.getId());
}
@Override
@Transactional
public void like(Post post, User user) {
LikeEntity likeEntity = new LikeEntity(post, user);
entityManager.persist(likeEntity);
jpaPostRepository.updatePostLikeCount(new PostEntity(post));
}
@Override
@Transactional
public void unlike(Post post, User user) {
LikeEntity likeEntity = new LikeEntity(post, user);
jpaLikeRepository.deleteById(likeEntity.getId());
jpaPostRepository.updatePostLikeCount(new PostEntity(post));
}
@Override
public boolean checkLike(Comment comment, User user) {
LikeEntity likeEntity = new LikeEntity(comment, user);
return jpaLikeRepository.existsById(likeEntity.getId());
}
@Override
@Transactional
public void like(Comment comment, User user) {
LikeEntity likeEntity = new LikeEntity(comment, user);
entityManager.persist(likeEntity);
jpaCommentRepository.updateCommentLikeCount(new CommentEntity(comment));
}
@Override
@Transactional
public void unlike(Comment comment, User user) {
LikeEntity likeEntity = new LikeEntity(comment, user);
jpaLikeRepository.deleteById(likeEntity.getId());
jpaCommentRepository.updateCommentLikeCount(new CommentEntity(comment));
}
}
학습 인증샷

학습 종료 시각 인증
