From ad322d2360c8c5f44d5b636cf323d40623ea1cb1 Mon Sep 17 00:00:00 2001 From: dani820 Date: Sun, 8 Sep 2024 20:08:02 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EB=8F=85=EC=84=9C=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 컨트롤러 로직 작성 및 테스트 코드 작성 --- .../adapter/in/web/PostController.java | 20 ++++ .../adapter/in/web/dto/PostMapper.java | 30 +++++ .../in/web/dto/response/BookResponse.java | 9 ++ .../in/web/dto/response/ContentResponse.java | 13 ++ .../in/web/dto/response/MemberResponse.java | 7 ++ .../web/dto/response/PostDetailsResponse.java | 8 ++ .../adapter/in/web/PostControllerTest.java | 113 ++++++++++++++++++ 7 files changed, 200 insertions(+) create mode 100644 src/main/java/com/inmybook/adapter/in/web/dto/response/BookResponse.java create mode 100644 src/main/java/com/inmybook/adapter/in/web/dto/response/ContentResponse.java create mode 100644 src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java create mode 100644 src/main/java/com/inmybook/adapter/in/web/dto/response/PostDetailsResponse.java create mode 100644 src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java diff --git a/src/main/java/com/inmybook/adapter/in/web/PostController.java b/src/main/java/com/inmybook/adapter/in/web/PostController.java index 4701f44..a967cb7 100644 --- a/src/main/java/com/inmybook/adapter/in/web/PostController.java +++ b/src/main/java/com/inmybook/adapter/in/web/PostController.java @@ -3,6 +3,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; @@ -10,8 +12,12 @@ import com.inmybook.adapter.in.web.dto.PostMapper; import com.inmybook.adapter.in.web.dto.RegisterPostInput; +import com.inmybook.adapter.in.web.dto.response.PostDetailsResponse; +import com.inmybook.application.port.in.ReadPostInput; +import com.inmybook.application.port.in.ReadPostUseCase; import com.inmybook.application.port.in.RegisterPostCommand; import com.inmybook.application.port.in.RegisterPostUseCase; +import com.inmybook.application.service.PostDetailsOutput; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -24,6 +30,7 @@ public class PostController { private final RegisterPostUseCase registerPostUseCase; + private final ReadPostUseCase readPostUseCase; private final PostMapper postMapper; @Operation(summary = "독서록 게시글 등록", description = "사용자는 독서록 게시글을 등록할 수 있다.") @@ -41,4 +48,17 @@ public ResponseEntity registerPost(@RequestPart RegisterPostInput regist return new ResponseEntity<>(path, HttpStatus.CREATED); } + @Operation(summary = "독서록 책 정보 조회", description = "사용자는 독서록 게시글을 조회할 수 있다.") + @ApiResponse( + responseCode = "200", description = "독서록 게시글 조회 성공" + ) + @GetMapping(value = "/posts/{postId}") + public ResponseEntity getContent(@PathVariable String postId) { + ReadPostInput readPostInput = new ReadPostInput(postId); + PostDetailsOutput postDetailsOutput = readPostUseCase.findPostById(readPostInput); + + PostDetailsResponse postDetailsResponse = postMapper.createReadPostDetailsResponse(postDetailsOutput); + + return new ResponseEntity<>(postDetailsResponse, HttpStatus.OK); + } } diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java index affb405..2658fd5 100644 --- a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java +++ b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java @@ -3,7 +3,11 @@ import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import com.inmybook.adapter.in.web.dto.response.ContentResponse; +import com.inmybook.adapter.in.web.dto.response.MemberResponse; +import com.inmybook.adapter.in.web.dto.response.PostDetailsResponse; import com.inmybook.application.port.in.RegisterPostCommand; +import com.inmybook.application.service.PostDetailsOutput; @Component public class PostMapper { @@ -26,4 +30,30 @@ public RegisterPostCommand createRegisterPostCommand(RegisterPostInput registerP return registerPostCommand; } + + public PostDetailsResponse createReadPostDetailsResponse(PostDetailsOutput postDetailsOutput) { + ContentResponse contentResponse = new ContentResponse( + postDetailsOutput.contentDetailsOutput().title(), + postDetailsOutput.contentDetailsOutput().content(), + postDetailsOutput.contentDetailsOutput().fromDate(), + postDetailsOutput.contentDetailsOutput().toDate(), + postDetailsOutput.contentDetailsOutput().rating(), + postDetailsOutput.contentDetailsOutput().likeCount(), + postDetailsOutput.contentDetailsOutput().bookmarkCount(), + postDetailsOutput.contentDetailsOutput().isPublic() + ); + + MemberResponse memberResponse = new MemberResponse( + postDetailsOutput.memberDetailsOutput().memberNo(), + postDetailsOutput.memberDetailsOutput().nickname() + ); + + PostDetailsResponse postDetailsResponse = new PostDetailsResponse( + postDetailsOutput.postId(), + contentResponse, + memberResponse + ); + + return postDetailsResponse; + } } diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/response/BookResponse.java b/src/main/java/com/inmybook/adapter/in/web/dto/response/BookResponse.java new file mode 100644 index 0000000..ca75f20 --- /dev/null +++ b/src/main/java/com/inmybook/adapter/in/web/dto/response/BookResponse.java @@ -0,0 +1,9 @@ +package com.inmybook.adapter.in.web.dto.response; + +public record BookResponse( + String isbnNo, + String bookName, + String author, + String publisher +) { +} diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/response/ContentResponse.java b/src/main/java/com/inmybook/adapter/in/web/dto/response/ContentResponse.java new file mode 100644 index 0000000..2947489 --- /dev/null +++ b/src/main/java/com/inmybook/adapter/in/web/dto/response/ContentResponse.java @@ -0,0 +1,13 @@ +package com.inmybook.adapter.in.web.dto.response; + +public record ContentResponse( + String title, + String content, + String fromDate, + String toDate, + double rating, + int likeCount, + int bookmarkCount, + String isPublic +) { +} diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java b/src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java new file mode 100644 index 0000000..1957920 --- /dev/null +++ b/src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java @@ -0,0 +1,7 @@ +package com.inmybook.adapter.in.web.dto.response; + +public record MemberResponse( + Long memberNo, + String nickname +) { +} diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/response/PostDetailsResponse.java b/src/main/java/com/inmybook/adapter/in/web/dto/response/PostDetailsResponse.java new file mode 100644 index 0000000..669f588 --- /dev/null +++ b/src/main/java/com/inmybook/adapter/in/web/dto/response/PostDetailsResponse.java @@ -0,0 +1,8 @@ +package com.inmybook.adapter.in.web.dto.response; + +public record PostDetailsResponse( + String postId, + ContentResponse contentResponse, + MemberResponse memberResponse +) { +} diff --git a/src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java b/src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java new file mode 100644 index 0000000..f0cee97 --- /dev/null +++ b/src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java @@ -0,0 +1,113 @@ +package com.inmybook.adapter.in.web; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.inmybook.adapter.in.web.dto.PostMapper; +import com.inmybook.adapter.in.web.dto.response.PostDetailsResponse; +import com.inmybook.application.port.in.ReadPostInput; +import com.inmybook.application.port.in.ReadPostUseCase; +import com.inmybook.application.service.ContentDetailsOutput; +import com.inmybook.application.service.MemberDetailsOutput; +import com.inmybook.application.service.PostDetailsOutput; + +@ExtendWith(MockitoExtension.class) +class PostControllerTest { + + @InjectMocks + PostController postController; + @Mock + ReadPostUseCase readPostUseCase; + @Mock + PostMapper postMapper; + + private MockMvc mockMvc; + private ObjectMapper objectMapper = new ObjectMapper(); + + @BeforeEach + public void init() { + mockMvc = MockMvcBuilders.standaloneSetup(postController).build(); + } + + @Test + @DisplayName("사용자는 독서록 게시글을 조회할 수 있다.") + void readPost() throws Exception { + PostDetailsOutput mockPostDetailsOutput = getPostDetailsOutput(); + PostDetailsResponse mockPostDetailsResponse = getPostDetailsResponse(mockPostDetailsOutput); + String postId = mockPostDetailsOutput.postId(); + when(readPostUseCase.findPostById(new ReadPostInput(postId))).thenReturn(mockPostDetailsOutput); + when(postMapper.createReadPostDetailsResponse(mockPostDetailsOutput)).thenReturn(mockPostDetailsResponse); + + ResultActions resultActions = mockMvc.perform(get("/posts/{postId}", postId) + .contentType(MediaType.APPLICATION_JSON) + .characterEncoding("utf-8") + .content(postId) + ); + + MvcResult mvcResult = resultActions.andExpect(status().isOk()).andReturn(); + + PostDetailsResponse postDetailsResponse = objectMapper.readValue(mvcResult.getResponse().getContentAsString( + StandardCharsets.UTF_8), PostDetailsResponse.class); + + assertThat(postDetailsResponse.postId()).isEqualTo(postId); + assertThat(postDetailsResponse.contentResponse().title()).isEqualTo("HTTP 완벽 가이드 독서록"); + } + + private PostDetailsResponse getPostDetailsResponse(PostDetailsOutput postDetailsOutput) { + PostMapper postMapper = new PostMapper(); + return postMapper.createReadPostDetailsResponse(postDetailsOutput); + } + + private PostDetailsOutput getPostDetailsOutput() { + String postId = getUuid(); + + ContentDetailsOutput contentDetailsOutput = new ContentDetailsOutput( + "HTTP 완벽 가이드 독서록", + "유익합니다.", + "2024-07-14", + "2024-07-21", + 4.5, + 0, + 0, + "Y" + ); + + MemberDetailsOutput memberDetailsOutput = new MemberDetailsOutput( + 0L, + "dani820", + "dani820" + ); + + PostDetailsOutput postDetailsOutput = new PostDetailsOutput( + postId, + contentDetailsOutput, + memberDetailsOutput + ); + + return postDetailsOutput; + } + + private String getUuid() { + return UUID.randomUUID().toString(); + } + +} \ No newline at end of file From 9c0adeae7a2e4a4524137cc086bd9a8234032f21 Mon Sep 17 00:00:00 2001 From: dani820 Date: Sat, 14 Sep 2024 16:50:37 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20PostMapper=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=20static=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/inmybook/adapter/in/web/PostController.java | 2 +- src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/inmybook/adapter/in/web/PostController.java b/src/main/java/com/inmybook/adapter/in/web/PostController.java index a967cb7..1d07711 100644 --- a/src/main/java/com/inmybook/adapter/in/web/PostController.java +++ b/src/main/java/com/inmybook/adapter/in/web/PostController.java @@ -31,7 +31,7 @@ public class PostController { private final RegisterPostUseCase registerPostUseCase; private final ReadPostUseCase readPostUseCase; - private final PostMapper postMapper; + private static final PostMapper postMapper = new PostMapper(); @Operation(summary = "독서록 게시글 등록", description = "사용자는 독서록 게시글을 등록할 수 있다.") @ApiResponse( diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java index 2658fd5..107c2a1 100644 --- a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java +++ b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java @@ -1,6 +1,5 @@ package com.inmybook.adapter.in.web.dto; -import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import com.inmybook.adapter.in.web.dto.response.ContentResponse; @@ -9,7 +8,6 @@ import com.inmybook.application.port.in.RegisterPostCommand; import com.inmybook.application.service.PostDetailsOutput; -@Component public class PostMapper { public RegisterPostCommand createRegisterPostCommand(RegisterPostInput registerPostInput, MultipartFile multipartFile) { From 41e12de6b4756ef5bb074f87e92fe42970e90e7f Mon Sep 17 00:00:00 2001 From: dani820 Date: Sat, 14 Sep 2024 16:38:00 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=EB=8F=85=EC=84=9C=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=EC=9D=BC,=20=EC=A2=85=EB=A3=8C=EC=9D=BC=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fromDate -> readingStartDate toDate -> readingEndDate --- .../com/inmybook/adapter/in/web/dto/ContentRequest.java | 4 ++-- .../java/com/inmybook/adapter/in/web/dto/PostMapper.java | 8 ++++---- .../inmybook/application/port/in/RegisterPostCommand.java | 4 ++-- .../application/service/ContentDetailsOutput.java | 4 ++-- .../com/inmybook/application/service/ReadPostService.java | 4 ++-- src/main/java/com/inmybook/domain/post/Content.java | 4 ++-- src/main/java/com/inmybook/domain/post/PostFactory.java | 4 ++-- .../inmybook/application/service/ReadPostServiceTest.java | 4 ++-- .../application/service/RegisterPostServiceTest.java | 8 ++++---- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/ContentRequest.java b/src/main/java/com/inmybook/adapter/in/web/dto/ContentRequest.java index 6277957..ae5248f 100644 --- a/src/main/java/com/inmybook/adapter/in/web/dto/ContentRequest.java +++ b/src/main/java/com/inmybook/adapter/in/web/dto/ContentRequest.java @@ -3,8 +3,8 @@ public record ContentRequest( String title, String content, - String fromDate, - String toDate, + String readingStartDate, + String readingEndDate, double rating, String isPublic ) { diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java index 107c2a1..a451544 100644 --- a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java +++ b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java @@ -18,8 +18,8 @@ public RegisterPostCommand createRegisterPostCommand(RegisterPostInput registerP .publisher(registerPostInput.book().publisher()) .title(registerPostInput.content().title()) .content(registerPostInput.content().content()) - .fromDate(registerPostInput.content().fromDate()) - .toDate(registerPostInput.content().toDate()) + .readingStartDate(registerPostInput.content().readingStartDate()) + .readingEndDate(registerPostInput.content().readingEndDate()) .rating(registerPostInput.content().rating()) .isPublic(registerPostInput.content().isPublic()) .memberId(registerPostInput.member().memberId()) @@ -33,8 +33,8 @@ public PostDetailsResponse createReadPostDetailsResponse(PostDetailsOutput postD ContentResponse contentResponse = new ContentResponse( postDetailsOutput.contentDetailsOutput().title(), postDetailsOutput.contentDetailsOutput().content(), - postDetailsOutput.contentDetailsOutput().fromDate(), - postDetailsOutput.contentDetailsOutput().toDate(), + postDetailsOutput.contentDetailsOutput().readingStartDate(), + postDetailsOutput.contentDetailsOutput().readingEndDate(), postDetailsOutput.contentDetailsOutput().rating(), postDetailsOutput.contentDetailsOutput().likeCount(), postDetailsOutput.contentDetailsOutput().bookmarkCount(), diff --git a/src/main/java/com/inmybook/application/port/in/RegisterPostCommand.java b/src/main/java/com/inmybook/application/port/in/RegisterPostCommand.java index 1689448..02e83d4 100644 --- a/src/main/java/com/inmybook/application/port/in/RegisterPostCommand.java +++ b/src/main/java/com/inmybook/application/port/in/RegisterPostCommand.java @@ -16,8 +16,8 @@ public record RegisterPostCommand( @NotNull String title, String content, - String fromDate, - String toDate, + String readingStartDate, + String readingEndDate, double rating, String isPublic, @NotNull diff --git a/src/main/java/com/inmybook/application/service/ContentDetailsOutput.java b/src/main/java/com/inmybook/application/service/ContentDetailsOutput.java index 4bef3ac..2421c45 100644 --- a/src/main/java/com/inmybook/application/service/ContentDetailsOutput.java +++ b/src/main/java/com/inmybook/application/service/ContentDetailsOutput.java @@ -6,8 +6,8 @@ public record ContentDetailsOutput( String title, String content, - String fromDate, - String toDate, + String readingStartDate, + String readingEndDate, double rating, int likeCount, int bookmarkCount, diff --git a/src/main/java/com/inmybook/application/service/ReadPostService.java b/src/main/java/com/inmybook/application/service/ReadPostService.java index c951dd4..6416630 100644 --- a/src/main/java/com/inmybook/application/service/ReadPostService.java +++ b/src/main/java/com/inmybook/application/service/ReadPostService.java @@ -21,8 +21,8 @@ public PostDetailsOutput findPostById(ReadPostInput readPostInput) { ContentDetailsOutput contentDetailsOutput = ContentDetailsOutput.builder() .title(post.getContent().getTitle()) .content(post.getContent().getContent()) - .fromDate(post.getContent().getFromDate()) - .toDate(post.getContent().getToDate()) + .readingStartDate(post.getContent().getReadingStartDate()) + .readingEndDate(post.getContent().getReadingEndDate()) .rating(post.getContent().getRating()) .likeCount(post.getContent().getLikeCount()) .bookmarkCount(post.getContent().getBookmarkCount()) diff --git a/src/main/java/com/inmybook/domain/post/Content.java b/src/main/java/com/inmybook/domain/post/Content.java index 0427e9b..0f1ecc4 100644 --- a/src/main/java/com/inmybook/domain/post/Content.java +++ b/src/main/java/com/inmybook/domain/post/Content.java @@ -8,8 +8,8 @@ public class Content { private String title; private String content; - private String fromDate; - private String toDate; + private String readingStartDate; + private String readingEndDate; @Builder.Default private double rating = 0; @Builder.Default diff --git a/src/main/java/com/inmybook/domain/post/PostFactory.java b/src/main/java/com/inmybook/domain/post/PostFactory.java index bb3ecfb..2ec2227 100644 --- a/src/main/java/com/inmybook/domain/post/PostFactory.java +++ b/src/main/java/com/inmybook/domain/post/PostFactory.java @@ -34,8 +34,8 @@ public Post createPost(RegisterPostCommand registerPostCommand) { Content content = Content.builder() .title(registerPostCommand.title()) .content(registerPostCommand.content()) - .fromDate(registerPostCommand.fromDate()) - .toDate(registerPostCommand.toDate()) + .readingStartDate(registerPostCommand.readingStartDate()) + .readingEndDate(registerPostCommand.readingEndDate()) .rating(registerPostCommand.rating()) .likeCount(0) .bookmarkCount(0) diff --git a/src/test/java/com/inmybook/application/service/ReadPostServiceTest.java b/src/test/java/com/inmybook/application/service/ReadPostServiceTest.java index e1ccada..1eb68dc 100644 --- a/src/test/java/com/inmybook/application/service/ReadPostServiceTest.java +++ b/src/test/java/com/inmybook/application/service/ReadPostServiceTest.java @@ -35,8 +35,8 @@ void readPost() { Content content = Content.builder() .title("HTTP 완벽 가이드 독서록") .content("유익합니다.") - .fromDate("2024-07-14") - .toDate("2024-07-21") + .readingStartDate("2024-07-14") + .readingEndDate("2024-07-21") .rating(4.5) .likeCount(0) .bookmarkCount(0) diff --git a/src/test/java/com/inmybook/application/service/RegisterPostServiceTest.java b/src/test/java/com/inmybook/application/service/RegisterPostServiceTest.java index f7a7beb..31ff578 100644 --- a/src/test/java/com/inmybook/application/service/RegisterPostServiceTest.java +++ b/src/test/java/com/inmybook/application/service/RegisterPostServiceTest.java @@ -44,8 +44,8 @@ void registerPostWithUploadImgTest() { .publisher("인사이트") .title("HTTP 완벽 가이드 독서록") .content("유익합니다.") - .fromDate("2024-07-14") - .toDate("2024-07-21") + .readingStartDate("2024-07-14") + .readingEndDate("2024-07-21") .rating(4.5) .isPublic("Y") .memberId("dani820") @@ -76,8 +76,8 @@ void registerPostWithoutUploadImgTest() { .publisher("인사이트") .title("HTTP 완벽 가이드 독서록") .content("유익합니다.") - .fromDate("2024-07-14") - .toDate("2024-07-21") + .readingStartDate("2024-07-14") + .readingEndDate("2024-07-21") .rating(4.5) .isPublic("Y") .memberId("dani820") From 4aa3e279e5285143b00b900cc57683ac00a64309 Mon Sep 17 00:00:00 2001 From: dani820 Date: Wed, 18 Sep 2024 23:57:20 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20PostMapper=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=82=B4=20=ED=95=A8=EC=88=98=20static=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PostMapper 클래스 내 함수들을 static으로 변경하여 불필요한 객체 생성 없이 간단히 접근 가능하도록 수정 - 조회 기능 Controller 테스트 코드 내에서 PostMapper 함수 모킹한 부분 수정(mockStatic 사용) --- .../adapter/in/web/PostController.java | 8 ++-- .../adapter/in/web/dto/PostMapper.java | 13 +++--- .../adapter/in/web/PostControllerTest.java | 42 ++++++++++--------- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/inmybook/adapter/in/web/PostController.java b/src/main/java/com/inmybook/adapter/in/web/PostController.java index 1d07711..617f47b 100644 --- a/src/main/java/com/inmybook/adapter/in/web/PostController.java +++ b/src/main/java/com/inmybook/adapter/in/web/PostController.java @@ -1,5 +1,7 @@ package com.inmybook.adapter.in.web; +import static com.inmybook.adapter.in.web.dto.PostMapper.*; + import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -10,7 +12,6 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import com.inmybook.adapter.in.web.dto.PostMapper; import com.inmybook.adapter.in.web.dto.RegisterPostInput; import com.inmybook.adapter.in.web.dto.response.PostDetailsResponse; import com.inmybook.application.port.in.ReadPostInput; @@ -31,7 +32,6 @@ public class PostController { private final RegisterPostUseCase registerPostUseCase; private final ReadPostUseCase readPostUseCase; - private static final PostMapper postMapper = new PostMapper(); @Operation(summary = "독서록 게시글 등록", description = "사용자는 독서록 게시글을 등록할 수 있다.") @ApiResponse( @@ -41,7 +41,7 @@ public class PostController { public ResponseEntity registerPost(@RequestPart RegisterPostInput registerPostInput, @RequestPart(value = "uploadImg", required = false) MultipartFile multipartFile) { - RegisterPostCommand registerPostCommand = postMapper.createRegisterPostCommand(registerPostInput, + RegisterPostCommand registerPostCommand = createRegisterPostCommand(registerPostInput, multipartFile); String path = registerPostUseCase.registerPost(registerPostCommand); @@ -57,7 +57,7 @@ public ResponseEntity getContent(@PathVariable String postI ReadPostInput readPostInput = new ReadPostInput(postId); PostDetailsOutput postDetailsOutput = readPostUseCase.findPostById(readPostInput); - PostDetailsResponse postDetailsResponse = postMapper.createReadPostDetailsResponse(postDetailsOutput); + PostDetailsResponse postDetailsResponse = createReadPostDetailsResponse(postDetailsOutput); return new ResponseEntity<>(postDetailsResponse, HttpStatus.OK); } diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java index a451544..a5295a9 100644 --- a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java +++ b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java @@ -9,9 +9,10 @@ import com.inmybook.application.service.PostDetailsOutput; public class PostMapper { - public RegisterPostCommand createRegisterPostCommand(RegisterPostInput registerPostInput, + public static RegisterPostCommand createRegisterPostCommand(RegisterPostInput registerPostInput, MultipartFile multipartFile) { - RegisterPostCommand registerPostCommand = RegisterPostCommand.builder() + + return RegisterPostCommand.builder() .isbnNo(registerPostInput.book().isbnNo()) .bookName(registerPostInput.book().bookName()) .author(registerPostInput.book().author()) @@ -25,11 +26,9 @@ public RegisterPostCommand createRegisterPostCommand(RegisterPostInput registerP .memberId(registerPostInput.member().memberId()) .thumbnailImg(multipartFile) .build(); - - return registerPostCommand; } - public PostDetailsResponse createReadPostDetailsResponse(PostDetailsOutput postDetailsOutput) { + public static PostDetailsResponse createReadPostDetailsResponse(PostDetailsOutput postDetailsOutput) { ContentResponse contentResponse = new ContentResponse( postDetailsOutput.contentDetailsOutput().title(), postDetailsOutput.contentDetailsOutput().content(), @@ -46,12 +45,10 @@ public PostDetailsResponse createReadPostDetailsResponse(PostDetailsOutput postD postDetailsOutput.memberDetailsOutput().nickname() ); - PostDetailsResponse postDetailsResponse = new PostDetailsResponse( + return new PostDetailsResponse( postDetailsOutput.postId(), contentResponse, memberResponse ); - - return postDetailsResponse; } } diff --git a/src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java b/src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java index f0cee97..2586797 100644 --- a/src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java +++ b/src/test/java/com/inmybook/adapter/in/web/PostControllerTest.java @@ -1,5 +1,6 @@ package com.inmybook.adapter.in.web; +import static com.inmybook.adapter.in.web.dto.PostMapper.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -14,6 +15,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; @@ -37,11 +39,9 @@ class PostControllerTest { PostController postController; @Mock ReadPostUseCase readPostUseCase; - @Mock - PostMapper postMapper; private MockMvc mockMvc; - private ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = new ObjectMapper(); @BeforeEach public void init() { @@ -54,27 +54,31 @@ void readPost() throws Exception { PostDetailsOutput mockPostDetailsOutput = getPostDetailsOutput(); PostDetailsResponse mockPostDetailsResponse = getPostDetailsResponse(mockPostDetailsOutput); String postId = mockPostDetailsOutput.postId(); - when(readPostUseCase.findPostById(new ReadPostInput(postId))).thenReturn(mockPostDetailsOutput); - when(postMapper.createReadPostDetailsResponse(mockPostDetailsOutput)).thenReturn(mockPostDetailsResponse); - ResultActions resultActions = mockMvc.perform(get("/posts/{postId}", postId) - .contentType(MediaType.APPLICATION_JSON) - .characterEncoding("utf-8") - .content(postId) - ); + try (MockedStatic mockPostMapper = mockStatic(PostMapper.class)) { + when(readPostUseCase.findPostById(new ReadPostInput(postId))).thenReturn(mockPostDetailsOutput); + mockPostMapper.when(() -> createReadPostDetailsResponse(mockPostDetailsOutput)).thenReturn( + mockPostDetailsResponse); + + ResultActions resultActions = mockMvc.perform(get("/posts/{postId}", postId) + .contentType(MediaType.APPLICATION_JSON) + .characterEncoding("utf-8") + .content(postId) + ); - MvcResult mvcResult = resultActions.andExpect(status().isOk()).andReturn(); + MvcResult mvcResult = resultActions.andExpect(status().isOk()).andReturn(); - PostDetailsResponse postDetailsResponse = objectMapper.readValue(mvcResult.getResponse().getContentAsString( - StandardCharsets.UTF_8), PostDetailsResponse.class); + PostDetailsResponse postDetailsResponse = objectMapper.readValue(mvcResult.getResponse().getContentAsString( + StandardCharsets.UTF_8), PostDetailsResponse.class); + + assertThat(postDetailsResponse.postId()).isEqualTo(postId); + assertThat(postDetailsResponse.contentResponse().title()).isEqualTo("HTTP 완벽 가이드 독서록"); + } - assertThat(postDetailsResponse.postId()).isEqualTo(postId); - assertThat(postDetailsResponse.contentResponse().title()).isEqualTo("HTTP 완벽 가이드 독서록"); } private PostDetailsResponse getPostDetailsResponse(PostDetailsOutput postDetailsOutput) { - PostMapper postMapper = new PostMapper(); - return postMapper.createReadPostDetailsResponse(postDetailsOutput); + return createReadPostDetailsResponse(postDetailsOutput); } private PostDetailsOutput getPostDetailsOutput() { @@ -97,13 +101,11 @@ private PostDetailsOutput getPostDetailsOutput() { "dani820" ); - PostDetailsOutput postDetailsOutput = new PostDetailsOutput( + return new PostDetailsOutput( postId, contentDetailsOutput, memberDetailsOutput ); - - return postDetailsOutput; } private String getUuid() { From cc0a5dd9c09013130035d3f2ae9b860f1e6e8fe4 Mon Sep 17 00:00:00 2001 From: dani820 Date: Thu, 19 Sep 2024 23:48:02 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20Member=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=82=B4=20memberNo=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java | 2 +- .../inmybook/adapter/in/web/dto/response/MemberResponse.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java index a5295a9..af2c916 100644 --- a/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java +++ b/src/main/java/com/inmybook/adapter/in/web/dto/PostMapper.java @@ -41,7 +41,7 @@ public static PostDetailsResponse createReadPostDetailsResponse(PostDetailsOutpu ); MemberResponse memberResponse = new MemberResponse( - postDetailsOutput.memberDetailsOutput().memberNo(), + postDetailsOutput.memberDetailsOutput().memberId(), postDetailsOutput.memberDetailsOutput().nickname() ); diff --git a/src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java b/src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java index 1957920..e372d09 100644 --- a/src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java +++ b/src/main/java/com/inmybook/adapter/in/web/dto/response/MemberResponse.java @@ -1,7 +1,7 @@ package com.inmybook.adapter.in.web.dto.response; public record MemberResponse( - Long memberNo, + String memberId, String nickname ) { }