From c03a1aa75fa3fe37de9c3bae83dace6cc09cb85a Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:09:16 +0900 Subject: [PATCH 01/14] =?UTF-8?q?[feat]=20=ED=94=BC=EB=93=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=8B=9C=20=EC=9C=A0=EC=A0=80=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20api=20(2=EA=B0=9C)=20controller=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feed/adapter/in/web/FeedQueryController.java | 16 ++++++++++++++++ .../web/response/FeedShowUserInfoResponse.java | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowUserInfoResponse.java diff --git a/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java b/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java index bb46b4d48..86a9b07da 100644 --- a/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java +++ b/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java @@ -5,12 +5,15 @@ import io.swagger.v3.oas.annotations.tags.Tag; import konkuk.thip.common.dto.BaseResponse; import konkuk.thip.common.security.annotation.UserId; +import konkuk.thip.feed.adapter.in.web.response.FeedShowUserInfoResponse; import konkuk.thip.feed.adapter.in.web.response.FeedShowMineResponse; import konkuk.thip.feed.adapter.in.web.response.FeedShowAllResponse; import konkuk.thip.feed.application.port.in.FeedShowAllUseCase; import konkuk.thip.feed.application.port.in.FeedShowMineUseCase; +import konkuk.thip.feed.application.port.in.FeedShowUserInfoUseCase; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -21,6 +24,7 @@ public class FeedQueryController { private final FeedShowAllUseCase feedShowAllUseCase; private final FeedShowMineUseCase feedShowMineUseCase; + private final FeedShowUserInfoUseCase feedShowUserInfoUseCase; @Operation( summary = "피드 전체 조회", @@ -45,4 +49,16 @@ public BaseResponse showMyFeeds( @RequestParam(value = "cursor", required = false) final String cursor) { return BaseResponse.ok(feedShowMineUseCase.showMyFeeds(userId, cursor)); } + + @GetMapping("/feeds/mine/info") + public BaseResponse showMyInfoInFeeds(@Parameter(hidden = true) @UserId final Long userId) { + return BaseResponse.ok(feedShowUserInfoUseCase.showMyInfoInFeeds(userId)); + } + + @GetMapping("/feeds/users/{userId}/info") + public BaseResponse showAnotherUserInfoInFeeds( + @Parameter(description = "피드 조회할 유저의 userId 값") @PathVariable final Long userId + ) { + return BaseResponse.ok(feedShowUserInfoUseCase.showAnotherUserInfoInFeeds(userId)); + } } diff --git a/src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowUserInfoResponse.java b/src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowUserInfoResponse.java new file mode 100644 index 000000000..f44309c46 --- /dev/null +++ b/src/main/java/konkuk/thip/feed/adapter/in/web/response/FeedShowUserInfoResponse.java @@ -0,0 +1,16 @@ +package konkuk.thip.feed.adapter.in.web.response; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record FeedShowUserInfoResponse( + String profileImageUrl, + String nickname, + String aliasName, + String aliasColor, + int followerCount, + int totalFeedCount, + List latestFollowerProfileImageUrls +) { } From e3be4e256b31f7c430a56c45cac6c7c8d3db2214 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:09:34 +0900 Subject: [PATCH 02/14] =?UTF-8?q?[feat]=20=ED=94=BC=EB=93=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=8B=9C=20=EC=9C=A0=EC=A0=80=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20api=20(2=EA=B0=9C)=20use=20case=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../port/in/FeedShowUserInfoUseCase.java | 10 +++ .../service/FeedShowUserInfoService.java | 65 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/main/java/konkuk/thip/feed/application/port/in/FeedShowUserInfoUseCase.java create mode 100644 src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java diff --git a/src/main/java/konkuk/thip/feed/application/port/in/FeedShowUserInfoUseCase.java b/src/main/java/konkuk/thip/feed/application/port/in/FeedShowUserInfoUseCase.java new file mode 100644 index 000000000..1307af07d --- /dev/null +++ b/src/main/java/konkuk/thip/feed/application/port/in/FeedShowUserInfoUseCase.java @@ -0,0 +1,10 @@ +package konkuk.thip.feed.application.port.in; + +import konkuk.thip.feed.adapter.in.web.response.FeedShowUserInfoResponse; + +public interface FeedShowUserInfoUseCase { + + FeedShowUserInfoResponse showMyInfoInFeeds(Long userId); + + FeedShowUserInfoResponse showAnotherUserInfoInFeeds(Long anotherUserId); +} diff --git a/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java b/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java new file mode 100644 index 000000000..e3a096a1f --- /dev/null +++ b/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java @@ -0,0 +1,65 @@ +package konkuk.thip.feed.application.service; + +import konkuk.thip.feed.adapter.in.web.response.FeedShowUserInfoResponse; +import konkuk.thip.feed.application.port.in.FeedShowUserInfoUseCase; +import konkuk.thip.feed.application.port.out.FeedQueryPort; +import konkuk.thip.user.application.port.out.FollowingQueryPort; +import konkuk.thip.user.application.port.out.UserCommandPort; +import konkuk.thip.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@RequiredArgsConstructor +@Service +public class FeedShowUserInfoService implements FeedShowUserInfoUseCase { + + private static final int FOLLOWER_DISPLAY_LIMIT = 5; + private final UserCommandPort userCommandPort; + private final FollowingQueryPort followingQueryPort; + private final FeedQueryPort feedQueryPort; + + @Transactional(readOnly = true) + @Override + public FeedShowUserInfoResponse showMyInfoInFeeds(Long userId) { + // 1. User 찾기 + User feedOwner = userCommandPort.findById(userId); + + // 2. 해당 유저를 팔로우 하는 유저들을 프로필 이미지 정보 구하기 + List latestFollowerProfileImageUrls = followingQueryPort.getLatestFollowerProfileImageUrlsByUserId(userId, FOLLOWER_DISPLAY_LIMIT); + + // 3. 내가 작성한 전체 피드 개수 구하기 + int allFeedCount = feedQueryPort.countAllFeedsByUserId(userId); + + return buildResponse(feedOwner, allFeedCount, latestFollowerProfileImageUrls); + } + + @Transactional(readOnly = true) + @Override + public FeedShowUserInfoResponse showAnotherUserInfoInFeeds(Long anotherUserId) { + // 1. User 찾기 + User feedOwner = userCommandPort.findById(anotherUserId); + + // 2. 해당 유저를 팔로우 하는 유저들을 프로필 이미지 정보 구하기 + List latestFollowerProfileImageUrls = followingQueryPort.getLatestFollowerProfileImageUrlsByUserId(anotherUserId, FOLLOWER_DISPLAY_LIMIT); + + // 3. 유저가 작성한 공개 피드 개수 구하기 + int publicFeedCount = feedQueryPort.countPublicFeedsByUserId(anotherUserId); + + return buildResponse(feedOwner, publicFeedCount, latestFollowerProfileImageUrls); + } + + private FeedShowUserInfoResponse buildResponse(User feedOwner, int totalFeedCount, List latestFollowerProfileImageUrls) { + return FeedShowUserInfoResponse.builder() + .profileImageUrl(feedOwner.getAlias().getImageUrl()) + .nickname(feedOwner.getNickname()) + .aliasName(feedOwner.getAlias().getValue()) + .aliasColor(feedOwner.getAlias().getColor()) + .followerCount(feedOwner.getFollowerCount()) + .totalFeedCount(totalFeedCount) + .latestFollowerProfileImageUrls(latestFollowerProfileImageUrls) + .build(); + } +} From 2f9da6d06942b0158e7c2819b80869c346c92f1f Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:12:13 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[feat]=20=EC=9C=A0=EC=A0=80=EA=B0=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=ED=95=9C=20=EA=B3=B5=EA=B0=9C=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=20=EA=B0=9C=EC=88=98=20=EB=B0=98=ED=99=98=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../out/persistence/FeedQueryPersistenceAdapter.java | 9 +++++++-- .../out/persistence/repository/FeedJpaRepository.java | 5 ++++- .../thip/feed/application/port/out/FeedQueryPort.java | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java index 9f452defb..bd6fabdd9 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/persistence/FeedQueryPersistenceAdapter.java @@ -69,8 +69,13 @@ public CursorBasedList findMyFeedsByCreatedAt(Long userId, Cursor } @Override - public int countFeedsByUserId(Long userId) { + public int countAllFeedsByUserId(Long userId) { // int 로 강제 형변환 해도 괜찮죠?? - return (int) feedJpaRepository.countFeedsByUserId(userId, StatusType.ACTIVE); + return (int) feedJpaRepository.countAllFeedsByUserId(userId, StatusType.ACTIVE); + } + + @Override + public int countPublicFeedsByUserId(Long userId) { + return (int) feedJpaRepository.countPublicFeedsByUserId(userId, StatusType.ACTIVE); } } diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedJpaRepository.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedJpaRepository.java index 6cd7ed7a1..47f671fe9 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedJpaRepository.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedJpaRepository.java @@ -9,5 +9,8 @@ public interface FeedJpaRepository extends JpaRepository, FeedQueryRepository { @Query("SELECT COUNT(f) FROM FeedJpaEntity f WHERE f.userJpaEntity.userId = :userId AND f.status = :status") - long countFeedsByUserId(@Param("userId") Long userId, @Param("status") StatusType status); + long countAllFeedsByUserId(@Param("userId") Long userId, @Param("status") StatusType status); + + @Query("SELECT COUNT(f) FROM FeedJpaEntity f WHERE f.userJpaEntity.userId = :userId AND f.isPublic = TRUE AND f.status = :status") + long countPublicFeedsByUserId(@Param("userId") Long userId, @Param("status") StatusType status); } diff --git a/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java b/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java index 658964417..126b960a6 100644 --- a/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java +++ b/src/main/java/konkuk/thip/feed/application/port/out/FeedQueryPort.java @@ -16,5 +16,7 @@ public interface FeedQueryPort { CursorBasedList findMyFeedsByCreatedAt(Long userId, Cursor cursor); - int countFeedsByUserId(Long userId); + int countAllFeedsByUserId(Long userId); + + int countPublicFeedsByUserId(Long userId); } From 0c3e12858568a340498d74b56e7dbdda9fe99cc6 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:12:54 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[feat]=20=ED=8C=94=EB=A1=9C=EC=9B=8C?= =?UTF-8?q?=EC=9D=98=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20=EC=98=81?= =?UTF-8?q?=EC=86=8D=EC=84=B1=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../out/persistence/FollowingQueryPersistenceAdapter.java | 5 +++++ .../thip/user/application/port/out/FollowingQueryPort.java | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java index e7e9bfe1b..e9b21bcaf 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java @@ -40,4 +40,9 @@ public CursorBasedList getFollowingByUserId(Long userId, String cu return CursorBasedList.of(followingDtos, size, followingDto -> followingDto.createdAt().toString()); } + + @Override + public List getLatestFollowerProfileImageUrlsByUserId(Long userId, int size) { + return followingJpaRepository.findTopFollowerProfileImageUrlsByUserIdOrderByCreatedAtDesc(userId, size); + } } diff --git a/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java b/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java index 817b552ad..a1c33b763 100644 --- a/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java +++ b/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java @@ -3,8 +3,12 @@ import konkuk.thip.common.util.CursorBasedList; import konkuk.thip.user.application.port.out.dto.UserQueryDto; +import java.util.List; + public interface FollowingQueryPort { CursorBasedList getFollowersByUserId(Long userId, String cursor, int size); CursorBasedList getFollowingByUserId(Long userId, String cursor, int size); + + List getLatestFollowerProfileImageUrlsByUserId(Long userId, int size); } From 20ba819c34d936c4189206bc03643b51d6dfb45e Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:13:18 +0900 Subject: [PATCH 05/14] =?UTF-8?q?[feat]=20=ED=8C=94=EB=A1=9C=EC=9B=8C?= =?UTF-8?q?=EC=9D=98=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94=20QueryDSL=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../following/FollowingQueryRepository.java | 2 ++ .../FollowingQueryRepositoryImpl.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java index 5bdc3d477..41d8df301 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java @@ -12,4 +12,6 @@ public interface FollowingQueryRepository { List findFollowerDtosByUserIdBeforeCreatedAt(Long userId, LocalDateTime cursor, int size); List findFollowingDtosByUserIdBeforeCreatedAt(Long userId, LocalDateTime cursor, int size); + + List findTopFollowerProfileImageUrlsByUserIdOrderByCreatedAtDesc(Long userId, int size); } diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java index ea79cf601..b20113d70 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java @@ -89,4 +89,22 @@ private List findFollowDtos(Long userId, LocalDateTime cursor, int .limit(size + 1) .fetch(); } + + @Override + public List findTopFollowerProfileImageUrlsByUserIdOrderByCreatedAtDesc(Long userId, int size) { + QFollowingJpaEntity following = QFollowingJpaEntity.followingJpaEntity; + QUserJpaEntity follower = QUserJpaEntity.userJpaEntity; // userId 를 팔로우하는 사람들(= follower) + QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; + + return jpaQueryFactory + .select(alias.imageUrl) + .from(following) + .join(following.userJpaEntity, follower) + .join(follower.aliasForUserJpaEntity, alias) + .where(following.followingUserJpaEntity.userId.eq(userId) + .and(following.status.eq(StatusType.ACTIVE))) + .orderBy(following.createdAt.desc()) + .limit(size) + .fetch(); + } } From 388635ebef1dca1fe1cf148e9abb4f8fe0bd3891 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:14:01 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[test]=20=ED=94=BC=EB=93=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=8B=9C=20=EC=9C=A0=EC=A0=80=EC=9D=98=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20api=20(2=EA=B0=9C)=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/web/FeedShowUserInfoApiTest.java | 271 ++++++++++++++++++ 1 file changed, 271 insertions(+) create mode 100644 src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java diff --git a/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java new file mode 100644 index 000000000..d833429c8 --- /dev/null +++ b/src/test/java/konkuk/thip/feed/adapter/in/web/FeedShowUserInfoApiTest.java @@ -0,0 +1,271 @@ +package konkuk.thip.feed.adapter.in.web; + +import konkuk.thip.book.adapter.out.jpa.BookJpaEntity; +import konkuk.thip.book.adapter.out.persistence.repository.BookJpaRepository; +import konkuk.thip.common.util.TestEntityFactory; +import konkuk.thip.feed.adapter.out.persistence.repository.FeedJpaRepository; +import konkuk.thip.user.adapter.out.jpa.AliasJpaEntity; +import konkuk.thip.user.adapter.out.jpa.FollowingJpaEntity; +import konkuk.thip.user.adapter.out.jpa.UserJpaEntity; +import konkuk.thip.user.adapter.out.persistence.repository.UserJpaRepository; +import konkuk.thip.user.adapter.out.persistence.repository.alias.AliasJpaRepository; +import konkuk.thip.user.adapter.out.persistence.repository.following.FollowingJpaRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@ActiveProfiles("test") +@AutoConfigureMockMvc(addFilters = false) +@DisplayName("[통합] 피드 화면에서의 유저 정보 조회 api 통합 테스트") +class FeedShowUserInfoApiTest { + + @Autowired private MockMvc mockMvc; + @Autowired private AliasJpaRepository aliasJpaRepository; + @Autowired private UserJpaRepository userJpaRepository; + @Autowired private FeedJpaRepository feedJpaRepository; + @Autowired private FollowingJpaRepository followingJpaRepository; + @Autowired private BookJpaRepository bookJpaRepository; + @Autowired private JdbcTemplate jdbcTemplate; + + @AfterEach + void tearDown() { + feedJpaRepository.deleteAllInBatch(); + followingJpaRepository.deleteAllInBatch(); + userJpaRepository.deleteAllInBatch(); + aliasJpaRepository.deleteAllInBatch(); + bookJpaRepository.deleteAllInBatch(); + } + + @Test + @DisplayName("내 피드에서의 유저 정보를 조회할 경우, 내 개인 정보, 나의 팔로워 정보, 내가 작성한 모든 피드 개수 를 반환한다.") + void feed_show_mine_info_test() throws Exception { + //given + AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); + UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); + UserJpaEntity follower2 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower2")); + FollowingJpaEntity followingJpaEntity1 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower1, me));// follower1 가 me를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity2 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower2, me));// follower2 가 me를 follow 하는 상황 + + // 팔로우 한 시각을 조정 (follower1 -> follower2 순 으로 팔로잉을 했다고 가정) + followingJpaRepository.flush(); + LocalDateTime base = LocalDateTime.now(); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(10)), followingJpaEntity1.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(1)), followingJpaEntity2.getFollowingId()); + jdbcTemplate.update( + "UPDATE users SET follower_count = ? WHERE user_id = ?", + 2, me.getUserId()); // me 의 followerCount 값을 2로 update + + // 피드 생성 및 생성일 직접 설정 + BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); // 공통 Book + feedJpaRepository.save(TestEntityFactory.createFeed(me, book, true)); // 공개글 + feedJpaRepository.save(TestEntityFactory.createFeed(me, book, true)); // 공개글 + feedJpaRepository.save(TestEntityFactory.createFeed(me, book, false)); // 비공개글 + + //when //then + mockMvc.perform(get("/feeds/mine/info") + .requestAttr("userId", me.getUserId())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.profileImageUrl", is(a0.getImageUrl()))) + .andExpect(jsonPath("$.data.nickname", is(me.getNickname()))) + .andExpect(jsonPath("$.data.aliasName", is(a0.getValue()))) + .andExpect(jsonPath("$.data.aliasColor", is(a0.getColor()))) + .andExpect(jsonPath("$.data.followerCount", is(2))) + .andExpect(jsonPath("$.data.totalFeedCount", is(3))) + // 팔로워 유저의 프로필 이미지 정렬 순서 : 팔로잉을 최신에 맺은 순 (follower2 -> follower1 순) + .andExpect(jsonPath("$.data.latestFollowerProfileImageUrls", is(List.of(a1.getImageUrl(), a0.getImageUrl())))); + } + + @Test + @DisplayName("나를 팔로우하는 사람이 많을 경우, 팔로우 맺은 일자 기준 최신순으로 최대 5명의 팔로워 프로필 이미지만을 반환한다.") + void feed_show_mine_info_follower_many_test() throws Exception { + //given + AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + UserJpaEntity me = userJpaRepository.save(TestEntityFactory.createUser(a0, "me")); + UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); + UserJpaEntity follower2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower2")); + UserJpaEntity follower3 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower3")); + UserJpaEntity follower4 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower4")); + UserJpaEntity follower5 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower5")); + UserJpaEntity follower6 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower6")); + UserJpaEntity follower7 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower7")); + FollowingJpaEntity followingJpaEntity1 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower1, me));// follower1 가 me를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity2 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower2, me));// follower2 가 me를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity3 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower3, me));// follower3 가 me를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity4 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower4, me));// follower4 가 me를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity5 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower5, me));// follower5 가 me를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity6 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower6, me));// follower6 가 me를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity7 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower7, me));// follower7 가 me를 follow 하는 상황 + + // 팔로우 한 시각을 조정 (follower1 -> follower2 -> ,,, -> follower7 순 으로 팔로잉을 했다고 가정) + followingJpaRepository.flush(); + LocalDateTime base = LocalDateTime.now(); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(30)), followingJpaEntity1.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(25)), followingJpaEntity2.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(20)), followingJpaEntity3.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(15)), followingJpaEntity4.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(10)), followingJpaEntity5.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(5)), followingJpaEntity6.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(1)), followingJpaEntity7.getFollowingId()); + jdbcTemplate.update( + "UPDATE users SET follower_count = ? WHERE user_id = ?", + 7, me.getUserId()); // me 의 followerCount 값을 7로 update + + //when //then + mockMvc.perform(get("/feeds/mine/info") + .requestAttr("userId", me.getUserId())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.followerCount", is(7))) + // 팔로워 유저의 프로필 이미지 정렬 순서 : 팔로잉을 최신에 맺은 순 (follower7 -> follower6 -> ,,, -> follower3 순) + .andExpect(jsonPath("$.data.latestFollowerProfileImageUrls", is(List.of( + a0.getImageUrl(), + a1.getImageUrl(), + a1.getImageUrl(), + a0.getImageUrl(), + a1.getImageUrl())))); + } + + @Test + @DisplayName("특정 유저 피드에서의 유저 정보를 조회할 경우, 유저 개인 정보, 유저의 팔로워 정보, 유저가 작성한 모든 '공개' 피드 개수 를 반환한다.") + void feed_show_user_info_test() throws Exception { + //given + AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + UserJpaEntity anotherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "anotherUser")); + UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); + UserJpaEntity follower2 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower2")); + FollowingJpaEntity followingJpaEntity1 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower1, anotherUser));// follower1 가 anotherUser를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity2 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower2, anotherUser));// follower2 가 anotherUser를 follow 하는 상황 + + // 팔로우 한 시각을 조정 (follower1 -> follower2 순 으로 팔로잉을 했다고 가정) + followingJpaRepository.flush(); + LocalDateTime base = LocalDateTime.now(); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(10)), followingJpaEntity1.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(1)), followingJpaEntity2.getFollowingId()); + jdbcTemplate.update( + "UPDATE users SET follower_count = ? WHERE user_id = ?", + 2, anotherUser.getUserId()); // anotherUser 의 followerCount 값을 2로 update + + // 피드 생성 및 생성일 직접 설정 + BookJpaEntity book = bookJpaRepository.save(TestEntityFactory.createBook()); // 공통 Book + feedJpaRepository.save(TestEntityFactory.createFeed(anotherUser, book, true)); // 공개글 + feedJpaRepository.save(TestEntityFactory.createFeed(anotherUser, book, true)); // 공개글 + feedJpaRepository.save(TestEntityFactory.createFeed(anotherUser, book, false)); // 비공개글 + feedJpaRepository.save(TestEntityFactory.createFeed(anotherUser, book, false)); // 비공개글 + + //when //then + mockMvc.perform(get("/feeds/users/{userId}/info", anotherUser.getUserId())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.profileImageUrl", is(a0.getImageUrl()))) + .andExpect(jsonPath("$.data.nickname", is(anotherUser.getNickname()))) + .andExpect(jsonPath("$.data.aliasName", is(a0.getValue()))) + .andExpect(jsonPath("$.data.aliasColor", is(a0.getColor()))) + .andExpect(jsonPath("$.data.followerCount", is(2))) + .andExpect(jsonPath("$.data.totalFeedCount", is(2))) // 공개 글만 + // 팔로워 유저의 프로필 이미지 정렬 순서 : 팔로잉을 최신에 맺은 순 (follower2 -> follower1 순) + .andExpect(jsonPath("$.data.latestFollowerProfileImageUrls", is(List.of(a1.getImageUrl(), a0.getImageUrl())))); + } + + @Test + @DisplayName("특정 유저를 팔로우하는 사람이 많을 경우, 팔로우 맺은 일자 기준 최신순으로 최대 5명의 팔로워 프로필 이미지만을 반환한다.") + void feed_show_user_info_follower_many_test() throws Exception { + //given + AliasJpaEntity a0 = aliasJpaRepository.save(TestEntityFactory.createScienceAlias()); + AliasJpaEntity a1 = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); + UserJpaEntity anotherUser = userJpaRepository.save(TestEntityFactory.createUser(a0, "anotherUser")); + UserJpaEntity follower1 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower1")); + UserJpaEntity follower2 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower2")); + UserJpaEntity follower3 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower3")); + UserJpaEntity follower4 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower4")); + UserJpaEntity follower5 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower5")); + UserJpaEntity follower6 = userJpaRepository.save(TestEntityFactory.createUser(a1, "follower6")); + UserJpaEntity follower7 = userJpaRepository.save(TestEntityFactory.createUser(a0, "follower7")); + FollowingJpaEntity followingJpaEntity1 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower1, anotherUser));// follower1 가 anotherUser를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity2 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower2, anotherUser));// follower2 가 anotherUser를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity3 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower3, anotherUser));// follower3 가 anotherUser를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity4 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower4, anotherUser));// follower4 가 anotherUser를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity5 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower5, anotherUser));// follower5 가 anotherUser를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity6 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower6, anotherUser));// follower6 가 anotherUser를 follow 하는 상황 + FollowingJpaEntity followingJpaEntity7 = followingJpaRepository.save(TestEntityFactory.createFollowing(follower7, anotherUser));// follower7 가 anotherUser를 follow 하는 상황 + + // 팔로우 한 시각을 조정 (follower1 -> follower2 -> ,,, -> follower7 순 으로 팔로잉을 했다고 가정) + followingJpaRepository.flush(); + LocalDateTime base = LocalDateTime.now(); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(30)), followingJpaEntity1.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(25)), followingJpaEntity2.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(20)), followingJpaEntity3.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(15)), followingJpaEntity4.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(10)), followingJpaEntity5.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(5)), followingJpaEntity6.getFollowingId()); + jdbcTemplate.update( + "UPDATE followings SET created_at = ? WHERE following_id = ?", + Timestamp.valueOf(base.minusMinutes(1)), followingJpaEntity7.getFollowingId()); + jdbcTemplate.update( + "UPDATE users SET follower_count = ? WHERE user_id = ?", + 7, anotherUser.getUserId()); // anotherUser 의 followerCount 값을 7로 update + + //when //then + mockMvc.perform(get("/feeds/users/{userId}/info", anotherUser.getUserId())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.followerCount", is(7))) + // 팔로워 유저의 프로필 이미지 정렬 순서 : 팔로잉을 최신에 맺은 순 (follower7 -> follower6 -> ,,, -> follower3 순) + .andExpect(jsonPath("$.data.latestFollowerProfileImageUrls", is(List.of( + a0.getImageUrl(), + a1.getImageUrl(), + a1.getImageUrl(), + a0.getImageUrl(), + a1.getImageUrl())))); + } +} From 782a52476c19e97721cdbb12cf42dcddf05469ce Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:14:23 +0900 Subject: [PATCH 07/14] =?UTF-8?q?[refactor]=20UserJpaEntity=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20imageUrl=20=ED=95=84=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java b/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java index a1fdd3bdf..d900b46db 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java +++ b/src/main/java/konkuk/thip/user/adapter/out/jpa/UserJpaEntity.java @@ -23,9 +23,6 @@ public class UserJpaEntity extends BaseJpaEntity { @Column(length = 60, nullable = false) private String nickname; - @Column(name = "image_url", columnDefinition = "TEXT", nullable = false) - private String imageUrl; - @Column(name = "oauth2_id", length = 50, nullable = false) private String oauth2Id; @@ -43,8 +40,7 @@ public class UserJpaEntity extends BaseJpaEntity { public void updateFrom(User user) { this.nickname = user.getNickname(); Assert.notNull(user.getAlias(), "Alias must not be null"); - this.imageUrl = user.getAlias().getImageUrl(); this.role = UserRole.from(user.getUserRole()); this.followerCount = user.getFollowerCount(); } -} \ No newline at end of file +} From a8399150625883c5442aeae9d0c25f3d6fb6d9d8 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:14:37 +0900 Subject: [PATCH 08/14] =?UTF-8?q?[refactor]=20UserMapper=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/konkuk/thip/user/adapter/out/mapper/UserMapper.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java b/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java index 1476860d9..f29e91fc9 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java +++ b/src/main/java/konkuk/thip/user/adapter/out/mapper/UserMapper.java @@ -13,7 +13,6 @@ public class UserMapper { public UserJpaEntity toJpaEntity(User user, AliasJpaEntity aliasJpaEntity) { return UserJpaEntity.builder() .nickname(user.getNickname()) - .imageUrl(user.getAlias().getImageUrl()) .role(UserRole.from(user.getUserRole())) .oauth2Id(user.getOauth2Id()) .followerCount(user.getFollowerCount()) From e31757a2ac6ed8d61dd6617fece2e3215a499af3 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:15:41 +0900 Subject: [PATCH 09/14] =?UTF-8?q?[refactor]=20UserJpaEntity=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20imageUrl=20=ED=95=84=EB=93=9C=EB=A5=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=A8=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EB=8D=95=EC=85=98=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../out/persistence/repository/FeedQueryRepositoryImpl.java | 2 +- .../out/persistence/repository/RecordQueryRepositoryImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java index 0dab54991..f2ed6cba0 100644 --- a/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/feed/adapter/out/persistence/repository/FeedQueryRepositoryImpl.java @@ -221,7 +221,7 @@ private FeedQueryDto toDto(FeedJpaEntity e, Integer priority) { .feedId(e.getPostId()) .creatorId(e.getUserJpaEntity().getUserId()) .creatorNickname(e.getUserJpaEntity().getNickname()) - .creatorProfileImageUrl(e.getUserJpaEntity().getImageUrl()) + .creatorProfileImageUrl(e.getUserJpaEntity().getAliasForUserJpaEntity().getImageUrl()) .alias(e.getUserJpaEntity().getAliasForUserJpaEntity().getValue()) .createdAt(e.getCreatedAt()) .isbn(e.getBookJpaEntity().getIsbn()) diff --git a/src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepositoryImpl.java b/src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepositoryImpl.java index d834acdb7..f7082b7ed 100644 --- a/src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/record/adapter/out/persistence/repository/RecordQueryRepositoryImpl.java @@ -203,7 +203,7 @@ private QPostQueryDto selectPostQueryDto() { pageExpr(), user.userId, user.nickname, - user.imageUrl, + user.aliasForUserJpaEntity.imageUrl, post.content, post.likeCount, post.commentCount, From 9360e0510ecc36e67ada9ef8ec17a7775b674129 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:16:15 +0900 Subject: [PATCH 10/14] =?UTF-8?q?[refactor]=20UserJpaEntity=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20imageUrl=20=ED=95=84=EB=93=9C=EB=A5=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=A8=EC=97=90=20=EB=94=B0=EB=A5=B8=20TestEntityFa?= =?UTF-8?q?ctory=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/konkuk/thip/common/util/TestEntityFactory.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java index b503523ae..6294c8811 100644 --- a/src/test/java/konkuk/thip/common/util/TestEntityFactory.java +++ b/src/test/java/konkuk/thip/common/util/TestEntityFactory.java @@ -67,7 +67,6 @@ public static CategoryJpaEntity createScienceCategory(AliasJpaEntity alias) { public static UserJpaEntity createUser(AliasJpaEntity alias) { return UserJpaEntity.builder() .nickname("테스터") - .imageUrl("https://test.img") .oauth2Id("kakao_12345678") .aliasForUserJpaEntity(alias) .role(UserRole.USER) @@ -77,7 +76,6 @@ public static UserJpaEntity createUser(AliasJpaEntity alias) { public static UserJpaEntity createUser(AliasJpaEntity alias, String nickname) { return UserJpaEntity.builder() .nickname(nickname) - .imageUrl("https://test.img") .oauth2Id("kakao_12345678") .aliasForUserJpaEntity(alias) .role(UserRole.USER) @@ -188,7 +186,7 @@ public static CommentLikeJpaEntity createCommentLike(CommentJpaEntity comment, U .build(); } - public static FollowingJpaEntity createFollowing(UserJpaEntity followerUser,UserJpaEntity followingUser) { + public static FollowingJpaEntity createFollowing(UserJpaEntity followerUser, UserJpaEntity followingUser) { return FollowingJpaEntity.builder() .userJpaEntity(followerUser) .followingUserJpaEntity(followingUser) From c778d0b8a0a6ec839328054a65cb3f168acc7f99 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:16:35 +0900 Subject: [PATCH 11/14] =?UTF-8?q?[refactor]=20UserJpaEntity=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20imageUrl=20=ED=95=84=EB=93=9C=EB=A5=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=A8=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=82=98?= =?UTF-8?q?=EB=A8=B8=EC=A7=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/in/web/BookChangeSavedControllerTest.java | 1 - .../adapter/in/web/BookDetailSearchControllerTest.java | 1 - .../in/web/BookMostSearchedBooksControllerTest.java | 1 - .../book/adapter/in/web/BookQueryControllerTest.java | 1 - .../record/adapter/in/web/RecordSearchApiTest.java | 2 -- .../thip/room/adapter/in/web/RoomCloseJoinApiTest.java | 3 --- .../thip/room/adapter/in/web/RoomCreateAPITest.java | 1 - .../room/adapter/in/web/RoomGetMemberListApiTest.java | 3 --- .../thip/room/adapter/in/web/RoomJoinApiTest.java | 2 -- .../adapter/in/web/RoomPlayingDetailViewApiTest.java | 1 - .../in/web/RoomRecruitingDetailViewApiTest.java | 1 - .../thip/room/adapter/in/web/RoomSearchApiTest.java | 1 - .../room/adapter/in/web/RoomVerifyPasswordAPITest.java | 10 +--------- .../thip/user/adapter/in/web/UserFollowApiTest.java | 2 -- .../in/web/UserVerifyNicknameControllerTest.java | 1 - .../vote/adapter/in/web/VoteCreateControllerTest.java | 1 - 16 files changed, 1 insertion(+), 31 deletions(-) diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java index 33919e4ce..64e635f16 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookChangeSavedControllerTest.java @@ -72,7 +72,6 @@ void setUp() { UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") - .imageUrl("https://avatar1.jpg") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java index 9e0bdf3fd..800966d41 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookDetailSearchControllerTest.java @@ -66,7 +66,6 @@ void setup() { UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") - .imageUrl("https://avatar1.jpg") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java index 06cead4ee..201217753 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookMostSearchedBooksControllerTest.java @@ -68,7 +68,6 @@ void setUp() { UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") - .imageUrl("https://avatar1.jpg") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); diff --git a/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java b/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java index 52794d323..4ad8f670c 100644 --- a/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java +++ b/src/test/java/konkuk/thip/book/adapter/in/web/BookQueryControllerTest.java @@ -57,7 +57,6 @@ void setUp() { UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") - .imageUrl("https://avatar1.jpg") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); diff --git a/src/test/java/konkuk/thip/record/adapter/in/web/RecordSearchApiTest.java b/src/test/java/konkuk/thip/record/adapter/in/web/RecordSearchApiTest.java index ae3b675fb..f400bbfd8 100644 --- a/src/test/java/konkuk/thip/record/adapter/in/web/RecordSearchApiTest.java +++ b/src/test/java/konkuk/thip/record/adapter/in/web/RecordSearchApiTest.java @@ -408,7 +408,6 @@ private TestData createTestData() { UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_123") .nickname("테스트사용자") - .imageUrl("http://user.img") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); @@ -526,7 +525,6 @@ private TestData createTestDataWithLockedContent() { UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_123") .nickname("테스트사용자") - .imageUrl("http://user.img") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java index a7bca2dfc..d875fae49 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCloseJoinApiTest.java @@ -61,21 +61,18 @@ void setup() { host = userJpaRepository.save(UserJpaEntity.builder() .nickname("호스트") - .imageUrl("https://test.img") .oauth2Id("kakao_12345678") .aliasForUserJpaEntity(alias) .role(UserRole.USER) .build()); member = userJpaRepository.save(UserJpaEntity.builder() .nickname("방 참여자") - .imageUrl("https://test.img") .oauth2Id("kakao_12345678") .aliasForUserJpaEntity(alias) .role(UserRole.USER) .build()); outsider = userJpaRepository.save(UserJpaEntity.builder() .nickname("방 미참여자") - .imageUrl("https://test.img") .oauth2Id("kakao_12345678") .aliasForUserJpaEntity(alias) .role(UserRole.USER) diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java index 4b2ed29d1..cde68b034 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomCreateAPITest.java @@ -78,7 +78,6 @@ private void saveUserAndCategory() { userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") - .imageUrl("https://avatar1.jpg") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java index 58617147f..4defca8f6 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomGetMemberListApiTest.java @@ -76,7 +76,6 @@ void setUp() { user1 = userJpaRepository.save(UserJpaEntity.builder() .nickname("테스터1") - .imageUrl("https://test1.img") .oauth2Id("kakao_1") .aliasForUserJpaEntity(alias) .role(UserRole.USER) @@ -85,7 +84,6 @@ void setUp() { user2 = userJpaRepository.save(UserJpaEntity.builder() .nickname("테스터2") - .imageUrl("https://test2.img") .oauth2Id("kakao_2") .aliasForUserJpaEntity(alias) .role(UserRole.USER) @@ -94,7 +92,6 @@ void setUp() { user3 = userJpaRepository.save(UserJpaEntity.builder() .nickname("테스터3") - .imageUrl("https://test3.img") .oauth2Id("kakao_3") .aliasForUserJpaEntity(alias) .role(UserRole.USER) diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java index 5df681964..b56add344 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomJoinApiTest.java @@ -95,7 +95,6 @@ private void createUsers(AliasJpaEntity alias) { host = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("user") - .imageUrl("img") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); @@ -103,7 +102,6 @@ private void createUsers(AliasJpaEntity alias) { participant = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_12345678") .nickname("user123") - .imageUrl("img") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java index b82f16912..66903ea91 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomPlayingDetailViewApiTest.java @@ -121,7 +121,6 @@ private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { List users = IntStream.rangeClosed(1, count) .mapToObj(i -> UserJpaEntity.builder() .nickname("user" + i) - .imageUrl("http://image") .oauth2Id("oauth2Id") .role(UserRole.USER) .aliasForUserJpaEntity(alias) diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java index 397531726..2f576bf08 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomRecruitingDetailViewApiTest.java @@ -136,7 +136,6 @@ private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { List users = IntStream.rangeClosed(1, count) .mapToObj(i -> UserJpaEntity.builder() .nickname("user" + i) - .imageUrl("http://image") .oauth2Id("oauth2Id") .role(UserRole.USER) .aliasForUserJpaEntity(alias) diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java index 94eccf5e4..2457e94fb 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomSearchApiTest.java @@ -135,7 +135,6 @@ private void saveUsersToRoom(RoomJpaEntity roomJpaEntity, int count) { List users = IntStream.rangeClosed(1, count) .mapToObj(i -> UserJpaEntity.builder() .nickname("user" + i) - .imageUrl("http://image") .oauth2Id("oauth2Id") .role(UserRole.USER) .aliasForUserJpaEntity(alias) diff --git a/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java b/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java index 9e9c35a2c..be74d0b20 100644 --- a/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java +++ b/src/test/java/konkuk/thip/room/adapter/in/web/RoomVerifyPasswordAPITest.java @@ -72,15 +72,7 @@ class RoomVerifyPasswordAPITest { void setUp() { AliasJpaEntity alias = aliasJpaRepository.save(TestEntityFactory.createLiteratureAlias()); - - UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() - .oauth2Id("kakao_432708231") - .nickname("User1") - .imageUrl("https://avatar1.jpg") - .role(UserRole.USER) - .aliasForUserJpaEntity(alias) - .build()); - + UserJpaEntity user = userJpaRepository.save(TestEntityFactory.createUser(alias, "User1")); BookJpaEntity book = bookJpaRepository.save(BookJpaEntity.builder() .isbn("1234567890123") .title("테스트책") diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java index f4dba60cb..ff555ce42 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserFollowApiTest.java @@ -58,7 +58,6 @@ void changeFollowingState_follow_then_unfollow() throws Exception { UserJpaEntity followingUser = userJpaRepository.save(UserJpaEntity.builder() .nickname("user100") - .imageUrl("http://image") .oauth2Id("oauth2_user100") .role(UserRole.USER) .aliasForUserJpaEntity(alias) @@ -66,7 +65,6 @@ void changeFollowingState_follow_then_unfollow() throws Exception { UserJpaEntity target = userJpaRepository.save(UserJpaEntity.builder() .nickname("user200") - .imageUrl("http://image") .oauth2Id("oauth2_user200") .role(UserRole.USER) .aliasForUserJpaEntity(alias) diff --git a/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java b/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java index 2be04fb61..151922234 100644 --- a/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java +++ b/src/test/java/konkuk/thip/user/adapter/in/web/UserVerifyNicknameControllerTest.java @@ -81,7 +81,6 @@ void verify_nickname_false() throws Exception { UserJpaEntity userJpaEntity = UserJpaEntity.builder() .nickname("테스트유저") - .imageUrl("http://image.url") .role(USER) .oauth2Id("kakao_12345678") .aliasForUserJpaEntity(aliasJpaEntity) diff --git a/src/test/java/konkuk/thip/vote/adapter/in/web/VoteCreateControllerTest.java b/src/test/java/konkuk/thip/vote/adapter/in/web/VoteCreateControllerTest.java index 879edb48a..e911248c1 100644 --- a/src/test/java/konkuk/thip/vote/adapter/in/web/VoteCreateControllerTest.java +++ b/src/test/java/konkuk/thip/vote/adapter/in/web/VoteCreateControllerTest.java @@ -95,7 +95,6 @@ private void saveUserAndRoom() { UserJpaEntity user = userJpaRepository.save(UserJpaEntity.builder() .oauth2Id("kakao_432708231") .nickname("User1") - .imageUrl("https://avatar1.jpg") .role(UserRole.USER) .aliasForUserJpaEntity(alias) .build()); From 05fc9cb98e269c29f42f1b989cd743c31706f284 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:40:10 +0900 Subject: [PATCH 12/14] =?UTF-8?q?[refactor]=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가독성을 위해 메서드 네이밍 길이 축소 --- .../feed/application/service/FeedShowUserInfoService.java | 4 ++-- .../out/persistence/FollowingQueryPersistenceAdapter.java | 4 ++-- .../repository/following/FollowingQueryRepository.java | 2 +- .../repository/following/FollowingQueryRepositoryImpl.java | 2 +- .../thip/user/application/port/out/FollowingQueryPort.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java b/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java index e3a096a1f..b6ca08ba0 100644 --- a/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java +++ b/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java @@ -28,7 +28,7 @@ public FeedShowUserInfoResponse showMyInfoInFeeds(Long userId) { User feedOwner = userCommandPort.findById(userId); // 2. 해당 유저를 팔로우 하는 유저들을 프로필 이미지 정보 구하기 - List latestFollowerProfileImageUrls = followingQueryPort.getLatestFollowerProfileImageUrlsByUserId(userId, FOLLOWER_DISPLAY_LIMIT); + List latestFollowerProfileImageUrls = followingQueryPort.getLatestFollowerImageUrls(userId, FOLLOWER_DISPLAY_LIMIT); // 3. 내가 작성한 전체 피드 개수 구하기 int allFeedCount = feedQueryPort.countAllFeedsByUserId(userId); @@ -43,7 +43,7 @@ public FeedShowUserInfoResponse showAnotherUserInfoInFeeds(Long anotherUserId) { User feedOwner = userCommandPort.findById(anotherUserId); // 2. 해당 유저를 팔로우 하는 유저들을 프로필 이미지 정보 구하기 - List latestFollowerProfileImageUrls = followingQueryPort.getLatestFollowerProfileImageUrlsByUserId(anotherUserId, FOLLOWER_DISPLAY_LIMIT); + List latestFollowerProfileImageUrls = followingQueryPort.getLatestFollowerImageUrls(anotherUserId, FOLLOWER_DISPLAY_LIMIT); // 3. 유저가 작성한 공개 피드 개수 구하기 int publicFeedCount = feedQueryPort.countPublicFeedsByUserId(anotherUserId); diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java index e9b21bcaf..f95524965 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/FollowingQueryPersistenceAdapter.java @@ -42,7 +42,7 @@ public CursorBasedList getFollowingByUserId(Long userId, String cu } @Override - public List getLatestFollowerProfileImageUrlsByUserId(Long userId, int size) { - return followingJpaRepository.findTopFollowerProfileImageUrlsByUserIdOrderByCreatedAtDesc(userId, size); + public List getLatestFollowerImageUrls(Long userId, int size) { + return followingJpaRepository.findLatestFollowerImageUrls(userId, size); } } diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java index 41d8df301..71b196fb2 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepository.java @@ -13,5 +13,5 @@ public interface FollowingQueryRepository { List findFollowerDtosByUserIdBeforeCreatedAt(Long userId, LocalDateTime cursor, int size); List findFollowingDtosByUserIdBeforeCreatedAt(Long userId, LocalDateTime cursor, int size); - List findTopFollowerProfileImageUrlsByUserIdOrderByCreatedAtDesc(Long userId, int size); + List findLatestFollowerImageUrls(Long userId, int size); } diff --git a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java index b20113d70..b8fcdb707 100644 --- a/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java +++ b/src/main/java/konkuk/thip/user/adapter/out/persistence/repository/following/FollowingQueryRepositoryImpl.java @@ -91,7 +91,7 @@ private List findFollowDtos(Long userId, LocalDateTime cursor, int } @Override - public List findTopFollowerProfileImageUrlsByUserIdOrderByCreatedAtDesc(Long userId, int size) { + public List findLatestFollowerImageUrls(Long userId, int size) { QFollowingJpaEntity following = QFollowingJpaEntity.followingJpaEntity; QUserJpaEntity follower = QUserJpaEntity.userJpaEntity; // userId 를 팔로우하는 사람들(= follower) QAliasJpaEntity alias = QAliasJpaEntity.aliasJpaEntity; diff --git a/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java b/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java index a1c33b763..a6b227d84 100644 --- a/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java +++ b/src/main/java/konkuk/thip/user/application/port/out/FollowingQueryPort.java @@ -9,6 +9,6 @@ public interface FollowingQueryPort { CursorBasedList getFollowersByUserId(Long userId, String cursor, int size); CursorBasedList getFollowingByUserId(Long userId, String cursor, int size); - List getLatestFollowerProfileImageUrlsByUserId(Long userId, int size); + List getLatestFollowerImageUrls(Long userId, int size); } From 92d2c23a0baf3c2fcef198ec2696e89ed3b6441a Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Thu, 31 Jul 2025 18:42:07 +0900 Subject: [PATCH 13/14] =?UTF-8?q?[feat]=20api=20=EC=84=A4=EB=AA=85?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20?= =?UTF-8?q?operation=20=EC=B6=94=EA=B0=80=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/feed/adapter/in/web/FeedQueryController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java b/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java index 86a9b07da..f2ad36cd2 100644 --- a/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java +++ b/src/main/java/konkuk/thip/feed/adapter/in/web/FeedQueryController.java @@ -50,11 +50,19 @@ public BaseResponse showMyFeeds( return BaseResponse.ok(feedShowMineUseCase.showMyFeeds(userId, cursor)); } + @Operation( + summary = "내 피드 조회의 상단 화면 구성", + description = "사용자의 정보, 사용자의 팔로워 정보, 사용자가 작성한 전체 피드 개수를 조회합니다." + ) @GetMapping("/feeds/mine/info") public BaseResponse showMyInfoInFeeds(@Parameter(hidden = true) @UserId final Long userId) { return BaseResponse.ok(feedShowUserInfoUseCase.showMyInfoInFeeds(userId)); } + @Operation( + summary = "특정 유저 피드 조회의 상단 화면 구성", + description = "사용자의 정보, 사용자의 팔로워 정보, 사용자가 작성한 공개 피드 개수를 조회합니다." + ) @GetMapping("/feeds/users/{userId}/info") public BaseResponse showAnotherUserInfoInFeeds( @Parameter(description = "피드 조회할 유저의 userId 값") @PathVariable final Long userId From 333e001235713db5a61062f823ebf832e9f49d83 Mon Sep 17 00:00:00 2001 From: seongjunnoh Date: Fri, 1 Aug 2025 01:15:01 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[refactor]=20response=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EC=B1=85=EC=9E=84=EC=9D=84=20mapper=EA=B0=80=20?= =?UTF-8?q?=EC=88=98=ED=96=89=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#115)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/mapper/FeedQueryMapper.java | 12 ++++++++++++ .../service/FeedShowUserInfoService.java | 18 ++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java b/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java index 3871a7b22..8edfea1fa 100644 --- a/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java +++ b/src/main/java/konkuk/thip/feed/application/mapper/FeedQueryMapper.java @@ -3,11 +3,14 @@ import konkuk.thip.common.util.DateUtil; import konkuk.thip.feed.adapter.in.web.response.FeedShowAllResponse; import konkuk.thip.feed.adapter.in.web.response.FeedShowMineResponse; +import konkuk.thip.feed.adapter.in.web.response.FeedShowUserInfoResponse; import konkuk.thip.feed.application.port.out.dto.FeedQueryDto; +import konkuk.thip.user.domain.User; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; +import java.util.List; import java.util.Set; @Mapper( @@ -34,4 +37,13 @@ FeedShowAllResponse.FeedDto toFeedShowAllResponse( expression = "java(DateUtil.formatBeforeTime(dto.createdAt()))" ) FeedShowMineResponse.FeedDto toFeedShowMineResponse(FeedQueryDto dto); + + @Mapping(target = "profileImageUrl", source = "feedOwner.alias.imageUrl") + @Mapping(target = "nickname", source = "feedOwner.nickname") + @Mapping(target = "aliasName", source = "feedOwner.alias.value") + @Mapping(target = "aliasColor", source = "feedOwner.alias.color") + @Mapping(target = "followerCount", source = "feedOwner.followerCount") + @Mapping(target = "totalFeedCount", source = "totalFeedCount") + @Mapping(target = "latestFollowerProfileImageUrls", source = "latestFollowerProfileImageUrls") + FeedShowUserInfoResponse toFeedShowUserInfoResponse(User feedOwner, int totalFeedCount, List latestFollowerProfileImageUrls); } diff --git a/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java b/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java index b6ca08ba0..7c26a67f9 100644 --- a/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java +++ b/src/main/java/konkuk/thip/feed/application/service/FeedShowUserInfoService.java @@ -1,6 +1,7 @@ package konkuk.thip.feed.application.service; import konkuk.thip.feed.adapter.in.web.response.FeedShowUserInfoResponse; +import konkuk.thip.feed.application.mapper.FeedQueryMapper; import konkuk.thip.feed.application.port.in.FeedShowUserInfoUseCase; import konkuk.thip.feed.application.port.out.FeedQueryPort; import konkuk.thip.user.application.port.out.FollowingQueryPort; @@ -20,6 +21,7 @@ public class FeedShowUserInfoService implements FeedShowUserInfoUseCase { private final UserCommandPort userCommandPort; private final FollowingQueryPort followingQueryPort; private final FeedQueryPort feedQueryPort; + private final FeedQueryMapper feedQueryMapper; @Transactional(readOnly = true) @Override @@ -33,7 +35,7 @@ public FeedShowUserInfoResponse showMyInfoInFeeds(Long userId) { // 3. 내가 작성한 전체 피드 개수 구하기 int allFeedCount = feedQueryPort.countAllFeedsByUserId(userId); - return buildResponse(feedOwner, allFeedCount, latestFollowerProfileImageUrls); + return feedQueryMapper.toFeedShowUserInfoResponse(feedOwner, allFeedCount, latestFollowerProfileImageUrls); } @Transactional(readOnly = true) @@ -48,18 +50,6 @@ public FeedShowUserInfoResponse showAnotherUserInfoInFeeds(Long anotherUserId) { // 3. 유저가 작성한 공개 피드 개수 구하기 int publicFeedCount = feedQueryPort.countPublicFeedsByUserId(anotherUserId); - return buildResponse(feedOwner, publicFeedCount, latestFollowerProfileImageUrls); - } - - private FeedShowUserInfoResponse buildResponse(User feedOwner, int totalFeedCount, List latestFollowerProfileImageUrls) { - return FeedShowUserInfoResponse.builder() - .profileImageUrl(feedOwner.getAlias().getImageUrl()) - .nickname(feedOwner.getNickname()) - .aliasName(feedOwner.getAlias().getValue()) - .aliasColor(feedOwner.getAlias().getColor()) - .followerCount(feedOwner.getFollowerCount()) - .totalFeedCount(totalFeedCount) - .latestFollowerProfileImageUrls(latestFollowerProfileImageUrls) - .build(); + return feedQueryMapper.toFeedShowUserInfoResponse(feedOwner, publicFeedCount, latestFollowerProfileImageUrls); } }