From a093165991c36c79c20d7366c1733935640ad959 Mon Sep 17 00:00:00 2001 From: wlsh44 Date: Mon, 25 Aug 2025 12:24:19 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20result=20api=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/votes.adoc | 2 +- ...teStatusReader.java => VoteResultReader.java} | 14 +++++++------- .../com/chooz/vote/application/VoteService.java | 10 +++++----- .../chooz/vote/application/VoteValidator.java | 2 +- .../chooz/vote/presentation/VoteController.java | 9 ++++----- ...atusResponse.java => VoteResultResponse.java} | 2 +- .../chooz/vote/application/VoteServiceTest.java | 16 +++++----------- .../vote/application/VoteValidatorTest.java | 4 ++-- .../vote/presentation/VoteControllerTest.java | 12 ++++++------ 9 files changed, 32 insertions(+), 39 deletions(-) rename src/main/java/com/chooz/vote/application/{VoteStatusReader.java => VoteResultReader.java} (77%) rename src/main/java/com/chooz/vote/presentation/dto/{VoteStatusResponse.java => VoteResultResponse.java} (82%) diff --git a/src/docs/asciidoc/votes.adoc b/src/docs/asciidoc/votes.adoc index ef84e737..206c3093 100644 --- a/src/docs/asciidoc/votes.adoc +++ b/src/docs/asciidoc/votes.adoc @@ -4,7 +4,7 @@ [[투표-현황-조회]] === `GET` 투표 현황 조회 -operation::vote-controller-test/find-vote-status[snippets='http-request,curl-request,request-headers,path-parameters,http-response,response-fields'] +operation::vote-controller-test/find-vote-result[snippets='http-request,curl-request,request-headers,path-parameters,http-response,response-fields'] [[투표]] === `POST` 투표 diff --git a/src/main/java/com/chooz/vote/application/VoteStatusReader.java b/src/main/java/com/chooz/vote/application/VoteResultReader.java similarity index 77% rename from src/main/java/com/chooz/vote/application/VoteStatusReader.java rename to src/main/java/com/chooz/vote/application/VoteResultReader.java index cdb299a1..7c6462d1 100644 --- a/src/main/java/com/chooz/vote/application/VoteStatusReader.java +++ b/src/main/java/com/chooz/vote/application/VoteResultReader.java @@ -3,7 +3,7 @@ import com.chooz.post.domain.PollChoice; import com.chooz.post.domain.Post; import com.chooz.vote.domain.Vote; -import com.chooz.vote.presentation.dto.VoteStatusResponse; +import com.chooz.vote.presentation.dto.VoteResultResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -14,16 +14,16 @@ @Component @RequiredArgsConstructor -public class VoteStatusReader { +public class VoteResultReader { private final RatioCalculator ratioCalculator; - public List getVoteStatus(List totalVoteList, Post post) { + public List getVoteResult(List totalVoteList, Post post) { int totalVoteCount = totalVoteList.size(); Map pollChoiceVoteCountMap = getPollChoiceVoteCountMap(totalVoteList, post); return pollChoiceVoteCountMap.entrySet().stream() - .map(entry -> getPollChoiceStatusResponse(entry, totalVoteCount)) - .sorted(Comparator.comparingLong(VoteStatusResponse::voteCount).reversed()) + .map(entry -> getVoteResultResponse(entry, totalVoteCount)) + .sorted(Comparator.comparingLong(VoteResultResponse::voteCount).reversed()) .toList(); } @@ -37,11 +37,11 @@ private Map getPollChoiceVoteCountMap(List totalVoteList )); } - private VoteStatusResponse getPollChoiceStatusResponse(Map.Entry entry, int totalVoteCount) { + private VoteResultResponse getVoteResultResponse(Map.Entry entry, int totalVoteCount) { PollChoice pollChoice = entry.getKey(); Long voteCount = entry.getValue(); String ratio = ratioCalculator.calculate(totalVoteCount, voteCount); - return new VoteStatusResponse( + return new VoteResultResponse( pollChoice.getId(), pollChoice.getTitle(), pollChoice.getImageUrl(), diff --git a/src/main/java/com/chooz/vote/application/VoteService.java b/src/main/java/com/chooz/vote/application/VoteService.java index 99fcd278..f32e393e 100644 --- a/src/main/java/com/chooz/vote/application/VoteService.java +++ b/src/main/java/com/chooz/vote/application/VoteService.java @@ -7,7 +7,7 @@ import com.chooz.post.domain.PostRepository; import com.chooz.vote.domain.Vote; import com.chooz.vote.domain.VoteRepository; -import com.chooz.vote.presentation.dto.VoteStatusResponse; +import com.chooz.vote.presentation.dto.VoteResultResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,7 +23,7 @@ public class VoteService { private final PostRepository postRepository; private final EventPublisher eventPublisher; private final VoteValidator voteValidator; - private final VoteStatusReader voteStatusReader; + private final VoteResultReader voteResultReader; private final VoteWriter voteWriter; @Transactional @@ -40,12 +40,12 @@ public List vote(Long voterId, Long postId, List pollChoiceIds) { return voteIds; } - public List findVoteStatus(Long userId, Long postId) { + public List findVoteResult(Long userId, Long postId) { Post post = postRepository.findByIdFetchPollChoices(postId) .orElseThrow(() -> new BadRequestException(ErrorCode.POST_NOT_FOUND)); List totalVoteList = voteRepository.findAllByPostId(postId); - voteValidator.validateVoteStatusAccess(userId, post, totalVoteList); + voteValidator.validateVoteResultAccess(userId, post, totalVoteList); - return voteStatusReader.getVoteStatus(totalVoteList, post); + return voteResultReader.getVoteResult(totalVoteList, post); } } diff --git a/src/main/java/com/chooz/vote/application/VoteValidator.java b/src/main/java/com/chooz/vote/application/VoteValidator.java index 7b961c90..718b796a 100644 --- a/src/main/java/com/chooz/vote/application/VoteValidator.java +++ b/src/main/java/com/chooz/vote/application/VoteValidator.java @@ -74,7 +74,7 @@ private void validatePollChoiceId(Post post, List pollChoiceIds) { } } - public void validateVoteStatusAccess(Long userId, Post post, List totalVoteList) { + public void validateVoteResultAccess(Long userId, Post post, List totalVoteList) { if (post.isClosed()) { return; } diff --git a/src/main/java/com/chooz/vote/presentation/VoteController.java b/src/main/java/com/chooz/vote/presentation/VoteController.java index 279bc5ad..a3c7a433 100644 --- a/src/main/java/com/chooz/vote/presentation/VoteController.java +++ b/src/main/java/com/chooz/vote/presentation/VoteController.java @@ -1,14 +1,13 @@ package com.chooz.vote.presentation; import com.chooz.auth.domain.UserInfo; -import com.chooz.vote.presentation.dto.VoteStatusResponse; +import com.chooz.vote.presentation.dto.VoteResultResponse; import com.chooz.vote.application.VoteService; import com.chooz.vote.presentation.dto.VoteRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -32,11 +31,11 @@ public ResponseEntity vote( return ResponseEntity.ok().build(); } - @GetMapping("/posts/{postId}/votes/status") - public ResponseEntity> findVoteStatus( + @GetMapping("/posts/{postId}/votes/result") + public ResponseEntity> findVoteResult( @PathVariable("postId") Long postId, @AuthenticationPrincipal UserInfo userInfo ) { - return ResponseEntity.ok(voteService.findVoteStatus(userInfo.userId(), postId)); + return ResponseEntity.ok(voteService.findVoteResult(userInfo.userId(), postId)); } } diff --git a/src/main/java/com/chooz/vote/presentation/dto/VoteStatusResponse.java b/src/main/java/com/chooz/vote/presentation/dto/VoteResultResponse.java similarity index 82% rename from src/main/java/com/chooz/vote/presentation/dto/VoteStatusResponse.java rename to src/main/java/com/chooz/vote/presentation/dto/VoteResultResponse.java index 9f34ef75..883acc15 100644 --- a/src/main/java/com/chooz/vote/presentation/dto/VoteStatusResponse.java +++ b/src/main/java/com/chooz/vote/presentation/dto/VoteResultResponse.java @@ -1,6 +1,6 @@ package com.chooz.vote.presentation.dto; -public record VoteStatusResponse( +public record VoteResultResponse( Long id, String title, String imageUrl, diff --git a/src/test/java/com/chooz/vote/application/VoteServiceTest.java b/src/test/java/com/chooz/vote/application/VoteServiceTest.java index ec4540d8..6c198337 100644 --- a/src/test/java/com/chooz/vote/application/VoteServiceTest.java +++ b/src/test/java/com/chooz/vote/application/VoteServiceTest.java @@ -12,19 +12,13 @@ import com.chooz.user.domain.UserRepository; import com.chooz.vote.domain.Vote; import com.chooz.vote.domain.VoteRepository; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.context.bean.override.mockito.MockitoBean; -import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; -import java.time.Clock; -import java.time.LocalDateTime; import java.util.List; -import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.*; @@ -293,7 +287,7 @@ void multipleVote_cancelAllChoices() { @Test @DisplayName("투표 현황 조회") - void findVoteStatus() { + void findVoteResult() { //given User user = userRepository.save(UserFixture.createDefaultUser()); Post post = postRepository.save(PostFixture.createDefaultPost(user.getId())); @@ -301,7 +295,7 @@ void findVoteStatus() { voteRepository.save(VoteFixture.createDefaultVote(user.getId(), post.getId(), post.getPollChoices().get(voteIndex).getId())); //when - var response = voteService.findVoteStatus(user.getId(), post.getId()); + var response = voteService.findVoteResult(user.getId(), post.getId()); //then assertAll( @@ -328,7 +322,7 @@ void findVoteStatus_voteUser() { voteRepository.save(VoteFixture.createDefaultVote(voter.getId(), post.getId(), post.getPollChoices().getFirst().getId())); //when - var response = voteService.findVoteStatus(voter.getId(), post.getId()); + var response = voteService.findVoteResult(voter.getId(), post.getId()); //then assertThat(response).isNotNull(); @@ -336,13 +330,13 @@ void findVoteStatus_voteUser() { @Test @DisplayName("투표 현황 조회 - 작성자 아니고 투표 안 한 사람인 경우") - void findVoteStatus_notAuthorAndVoter() { + void findVoteResult_notAuthorAndVoter() { //given User user = userRepository.save(UserFixture.createDefaultUser()); Post post = postRepository.save(PostFixture.createDefaultPost(user.getId())); //when - assertThatThrownBy(() -> voteService.findVoteStatus(2L, post.getId())) + assertThatThrownBy(() -> voteService.findVoteResult(2L, post.getId())) .isInstanceOf(BadRequestException.class) .hasMessage(ErrorCode.ACCESS_DENIED_VOTE_STATUS.getMessage()); } diff --git a/src/test/java/com/chooz/vote/application/VoteValidatorTest.java b/src/test/java/com/chooz/vote/application/VoteValidatorTest.java index 011a94a2..b558a430 100644 --- a/src/test/java/com/chooz/vote/application/VoteValidatorTest.java +++ b/src/test/java/com/chooz/vote/application/VoteValidatorTest.java @@ -153,14 +153,14 @@ void validatePollChoiceId_invalidChoiceId() { @Test @DisplayName("validateVoteStatusAccess - 작성자가 아니고 투표하지 않은 사용자는 투표 현황 조회 불가") - void validateVoteStatusAccess_notAuthorAndNotVoter() { + void validateVoteResultAccess_notAuthorAndNotVoter() { // given Long userId = 999L; Post post = PostFixture.createDefaultPost(1L); // 작성자 ID: 1L List votes = new ArrayList<>(); // when & then - assertThatThrownBy(() -> voteValidator.validateVoteStatusAccess(userId, post, votes)) + assertThatThrownBy(() -> voteValidator.validateVoteResultAccess(userId, post, votes)) .isInstanceOf(BadRequestException.class) .hasMessage(ErrorCode.ACCESS_DENIED_VOTE_STATUS.getMessage()); } diff --git a/src/test/java/com/chooz/vote/presentation/VoteControllerTest.java b/src/test/java/com/chooz/vote/presentation/VoteControllerTest.java index 1f2ce59b..0ed01b2e 100644 --- a/src/test/java/com/chooz/vote/presentation/VoteControllerTest.java +++ b/src/test/java/com/chooz/vote/presentation/VoteControllerTest.java @@ -1,6 +1,6 @@ package com.chooz.vote.presentation; -import com.chooz.vote.presentation.dto.VoteStatusResponse; +import com.chooz.vote.presentation.dto.VoteResultResponse; import com.chooz.support.RestDocsTest; import com.chooz.support.WithMockUserInfo; import com.chooz.vote.presentation.dto.VoteRequest; @@ -61,17 +61,17 @@ void vote() throws Exception { @Test @WithMockUserInfo @DisplayName("게시글 투표 상태 조회") - void findVoteStatus() throws Exception { + void findVoteResult() throws Exception { //given var response = List.of( - new VoteStatusResponse(1L, "title1", "http://example.com/image/1", 2, "66.7"), - new VoteStatusResponse(2L, "title2", "http://example.com/image/2", 1, "33.3") + new VoteResultResponse(1L, "title1", "http://example.com/image/1", 2, "66.7"), + new VoteResultResponse(2L, "title2", "http://example.com/image/2", 1, "33.3") ); - given(voteService.findVoteStatus(1L, 1L)) + given(voteService.findVoteResult(1L, 1L)) .willReturn(response); //when then - mockMvc.perform(RestDocumentationRequestBuilders.get("/posts/{postId}/votes/status", 1) + mockMvc.perform(RestDocumentationRequestBuilders.get("/posts/{postId}/votes/result", 1) .header(HttpHeaders.AUTHORIZATION, "Bearer token")) .andExpect(status().isOk()) .andExpect(content().json(objectMapper.writeValueAsString(response)))