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

수강 인증 사진


UserQueueRedisRepository.java
package org.fastcampus.post.repository.post_queue;
import java.util.List;
import org.fastcampus.post.repository.entity.post.PostEntity;
public interface UserQueueRedisRepository {
void publishPostToFollowingUserList(PostEntity postEntity, List<Long> userIdList);
void publishPostListToFollowerUser(List<PostEntity> postEntities, Long userId);
void deletePostToUserQueue(Long userId, Long targetUserId);
}
UserPostQueueCommandRepositoryImpl.java
package org.fastcampus.post.repository.post_queue;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.fastcampus.post.repository.entity.post.PostEntity;
import org.fastcampus.post.repository.jpa.JpaPostRepository;
import org.fastcampus.user.repository.entity.UserEntity;
import org.fastcampus.user.repository.jpa.JpaUserRelationRepository;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class UserPostQueueCommandRepositoryImpl implements UserPostQueueCommandRepository {
private final JpaPostRepository jpaPostRepository;
private final JpaUserRelationRepository jpaUserRelationRepository;
private final UserQueueRedisRepository queueRepository;
public void publishPost(PostEntity postEntity) {
UserEntity authorEntity = postEntity.getAuthor();
List<Long> followerIds = jpaUserRelationRepository.findFollowers(authorEntity.getId());
queueRepository.publishPostToFollowingUserList(postEntity, followerIds);
}
public void saveFollowPost(Long userId, Long targetId) {
List<PostEntity> postEntities = jpaPostRepository.findAllPostIdsByAuthorId(targetId);
queueRepository.publishPostListToFollowerUser(postEntities, userId);
}
public void deleteUnfollowPost(Long userId, Long targetId) {
queueRepository.deletePostToUserQueue(userId, targetId);
}
}
JpaPostRepository.java
package org.fastcampus.post.repository.jpa;
import java.util.List;
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> {
@Query("SELECT p FROM PostEntity p WHERE p.author.id = :authorId")
List<PostEntity> findAllPostIdsByAuthorId(Long authorId);
@Modifying
@Query(value = "UPDATE PostEntity p"
+ " SET p.content = :#{#post.getContent()},"
+ " p.state = :#{#post.getState()},"
+ " p.updDt = now()"
+ " WHERE p.id = :#{#post.id}")
void updatePostEntity(PostEntity post);
@Modifying
@Query(value = "UPDATE PostEntity p"
+ " SET p.likeCount = p.likeCount + :likeCount,"
+ " p.updDt = now()"
+ " WHERE p.id = :postId")
void updatePostLikeCount(Long postId, Integer likeCount);
@Modifying
@Query(value ="UPDATE PostEntity p"
+ " SET p.commentCount = p.commentCount + 1,"
+ " p.updDt = now()"
+ " WHERE p.id = :id")
void increaseCommentCount(Long id);
}
FakeUserQueueRedisRepository.java
package org.fastcampus.post.repository;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.fastcampus.post.repository.entity.post.*;
import org.fastcampus.post.repository.post_queue.*;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Repository;
@Repository
@Profile("test")
public class FakeUserQueueRedisRepository implements UserQueueRedisRepository {
private final Map<Long, Set<PostEntity>> queue = new HashMap<>();
@Override
public void publishPostToFollowingUserList(PostEntity postEntity, List<Long> userIdList) {
for (Long userId: userIdList) {
if (queue.containsKey(userId)) {
queue.get(userId).add(postEntity);
} else {
queue.put(userId, new HashSet<>(List.of(postEntity)));
}
}
}
@Override
public void publishPostListToFollowerUser(List<PostEntity> postEntities, Long userId) {
if (queue.containsKey(userId)) {
queue.get(userId).addAll(postEntities);
} else {
queue.put(userId, new HashSet<>(postEntities));
}
}
@Override
public void deletePostToUserQueue(Long userId, Long targetUserId) {
if (queue.containsKey(userId)) {
queue.get(userId).removeIf(post -> post.getAuthor().getId().equals(targetUserId));
}
}
public List<PostEntity> getPostListByUserId(Long userId) {
return List.copyOf(queue.get(userId));
}
}
FakeUserPostQueryRepository.java
package org.fastcampus.post.repository;
import java.util.ArrayList;
import java.util.List;
import org.fastcampus.post.application.dto.*;
import org.fastcampus.post.repository.entity.post.*;
import org.fastcampus.post.repository.post_queue.*;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Repository;
@Repository
@Profile("test")
public class FakeUserPostQueryRepository implements UserPostQueueQueryRepository {
private final FakeUserQueueRedisRepository fakeUserQueueRedisRepository;
public FakeUserPostQueryRepository(FakeUserQueueRedisRepository fakeUserQueueRedisRepository) {
this.fakeUserQueueRedisRepository = fakeUserQueueRedisRepository;
}
@Override
public List<GetPostContentResponseDto> getContentResponse(Long userId, Long lastContentId) {
List<PostEntity> postEntities = fakeUserQueueRedisRepository.getPostListByUserId(userId);
List<GetPostContentResponseDto> result = new ArrayList<>();
for (PostEntity postEntity: postEntities) {
GetPostContentResponseDto res = GetPostContentResponseDto.builder()
.id(postEntity.getId())
.build();
result.add(res);
}
return result;
}
}
FeedController.java
package org.fastcampus.post.ui;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.fastcampus.common.ui.*;
import org.fastcampus.post.application.dto.GetPostContentResponseDto;
import org.fastcampus.post.repository.post_queue.UserPostQueueQueryRepository;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/feed")
@RequiredArgsConstructor
public class FeedController {
private final UserPostQueueQueryRepository userPostQueueQueryRepository;
@GetMapping("/{userId}")
public Response<List<GetPostContentResponseDto>> getPostFeedList(@PathVariable(name = "userId") Long userId, Long lastContentId) {
List<GetPostContentResponseDto> contentResponse = userPostQueueQueryRepository.getContentResponse(userId, lastContentId);
return Response.OK(contentResponse);
}
}
학습 인증샷

공부 종료 시각 인증
