diff --git a/.gitignore b/.gitignore index d1be1544..9251e929 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,8 @@ CLAUDE.md db_dev.mv.db db_dev.trace.db + cookies.txt + +.DS_Store + diff --git a/back/.env.default b/back/.env.default index 47d2f175..da8cf60b 100644 --- a/back/.env.default +++ b/back/.env.default @@ -1 +1 @@ -CUSTOM__JWT__SECRET_KEY=NEED_TO_SET \ No newline at end of file +CUSTOM__JWT__SECRET_KEY=abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 diff --git a/back/src/main/java/com/back/domain/member/member/repository/MemberRepository.java b/back/src/main/java/com/back/domain/member/member/repository/MemberRepository.java index ece6c652..dc00e93f 100644 --- a/back/src/main/java/com/back/domain/member/member/repository/MemberRepository.java +++ b/back/src/main/java/com/back/domain/member/member/repository/MemberRepository.java @@ -5,7 +5,7 @@ import java.util.Optional; -public interface MemberRepository extends JpaRepository { +public interface MemberRepository extends JpaRepository { Optional findByEmail(String email); } diff --git a/back/src/main/java/com/back/domain/post/controller/InformationPostController.java b/back/src/main/java/com/back/domain/post/controller/InformationPostController.java new file mode 100644 index 00000000..9616272e --- /dev/null +++ b/back/src/main/java/com/back/domain/post/controller/InformationPostController.java @@ -0,0 +1,59 @@ +package com.back.domain.post.controller; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.dto.PostAllResponse; +import com.back.domain.post.dto.PostCreateRequest; +import com.back.domain.post.dto.PostCreateResponse; +import com.back.domain.post.dto.PostSingleResponse; +import com.back.domain.post.entity.Post; +import com.back.domain.post.rq.ApiResponse; +import com.back.domain.post.service.PostService; +import com.back.global.auth.CurrentUser; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("post/infor") +@RequiredArgsConstructor +public class InformationPostController { + private final PostService postService; + + + @Operation(summary = "게시글 생성") + @PostMapping + public ResponseEntity> createPost( + @RequestBody PostCreateRequest postCreateRequest, + @CurrentUser Member member + ) { + String authorName = member.getName(); + Post post = postService.createPost(postCreateRequest, authorName); + PostCreateResponse postCreateResponse = PostCreateResponse.from(post); + ApiResponse response = new ApiResponse<>("게시글이 성공적으로 생성되었습니다. " , postCreateResponse); + return ResponseEntity.ok(response); + } + + @Operation(summary = "게시글 다건 조회") + @GetMapping + public ResponseEntity>> getAllPost() { + List postAllResponse = postService.getAllPostResponse(); + + + ApiResponse> response = new ApiResponse<>("게시글 다건 조회 성공", postAllResponse); + return ResponseEntity.ok(response); + } + + @Operation(summary = "게시글 단건 조회") + @GetMapping("/{post_id}") + public ResponseEntity> getSinglePost(@PathVariable long post_id) { + Post post = postService.findById(post_id); + + PostSingleResponse postSingleResponse = new PostSingleResponse(post); + + ApiResponse response = new ApiResponse<>("게시글 단건 조회 성공", postSingleResponse); + return ResponseEntity.ok(response); + } +} diff --git a/back/src/main/java/com/back/domain/post/dto/PostAllResponse.java b/back/src/main/java/com/back/domain/post/dto/PostAllResponse.java new file mode 100644 index 00000000..7760b45e --- /dev/null +++ b/back/src/main/java/com/back/domain/post/dto/PostAllResponse.java @@ -0,0 +1,26 @@ +package com.back.domain.post.dto; + +import com.back.domain.post.entity.Post; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class PostAllResponse { + private Long id; + private String title; + private String authorName; + private LocalDateTime createdAt; + private int viewCount; + private int like; + + public PostAllResponse(Post post) { + this.id = post.getId(); + this.title = post.getTitle(); + this.authorName = post.getAuthorName(); + this.createdAt = post.getCreateDate(); + this.viewCount = post.getViewCount(); + this.like = post.getLiked(); + } + +} diff --git a/back/src/main/java/com/back/domain/post/dto/PostCreateRequest.java b/back/src/main/java/com/back/domain/post/dto/PostCreateRequest.java new file mode 100644 index 00000000..84684fd6 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/dto/PostCreateRequest.java @@ -0,0 +1,12 @@ +package com.back.domain.post.dto; + +import lombok.Data; + +@Data +public class PostCreateRequest { + private Long memberId; + private String postType; + private String title; + private String content; + +} diff --git a/back/src/main/java/com/back/domain/post/dto/PostCreateResponse.java b/back/src/main/java/com/back/domain/post/dto/PostCreateResponse.java new file mode 100644 index 00000000..c3b5505b --- /dev/null +++ b/back/src/main/java/com/back/domain/post/dto/PostCreateResponse.java @@ -0,0 +1,17 @@ +package com.back.domain.post.dto; + +import com.back.domain.post.entity.Post; +import lombok.Data; + +@Data +public class PostCreateResponse { + private Long postId; + private String title; + + public static PostCreateResponse from(Post post) { + PostCreateResponse response = new PostCreateResponse(); + response.setPostId(post.getId()); + response.setTitle(post.getTitle()); + return response; + } +} diff --git a/back/src/main/java/com/back/domain/post/dto/PostSingleResponse.java b/back/src/main/java/com/back/domain/post/dto/PostSingleResponse.java new file mode 100644 index 00000000..4e40ce19 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/dto/PostSingleResponse.java @@ -0,0 +1,25 @@ +package com.back.domain.post.dto; + +import com.back.domain.post.entity.Post; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class PostSingleResponse { + private Long id; + private String title; + private String authorName; + private LocalDateTime createdAt; + private int viewCount; + private int like; + + public PostSingleResponse(Post post) { + this.id = post.getId(); + this.title = post.getTitle(); + this.authorName = post.getAuthorName(); + this.createdAt = post.getCreateDate(); + this.viewCount = post.getViewCount(); + this.like = post.getLiked(); + } +} diff --git a/back/src/main/java/com/back/domain/post/entity/Post.java b/back/src/main/java/com/back/domain/post/entity/Post.java new file mode 100644 index 00000000..fa12a4c8 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/entity/Post.java @@ -0,0 +1,33 @@ +package com.back.domain.post.entity; + +import com.back.global.jpa.BaseEntity; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@NoArgsConstructor +@Getter +@Setter +public class Post extends BaseEntity { + private String title; + private String content; + private String authorName; + + @Enumerated(EnumType.STRING) + private PostType postType; + + public enum PostType { + INFORMATIONPOST, + PRACTICEPOST, + QUESTIONPOST + } + + private int viewCount; + + private int liked; + +} diff --git a/back/src/main/java/com/back/domain/post/entity/PracticePost.java b/back/src/main/java/com/back/domain/post/entity/PracticePost.java new file mode 100644 index 00000000..6c9940a6 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/entity/PracticePost.java @@ -0,0 +1,11 @@ +package com.back.domain.post.entity; + +import jakarta.persistence.Entity; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor +public class PracticePost extends Post{ + private Boolean isMento; + private String carrer; +} diff --git a/back/src/main/java/com/back/domain/post/entity/QuestionPost.java b/back/src/main/java/com/back/domain/post/entity/QuestionPost.java new file mode 100644 index 00000000..5a9c49f8 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/entity/QuestionPost.java @@ -0,0 +1,8 @@ +package com.back.domain.post.entity; + +import jakarta.persistence.Entity; + +@Entity +public class QuestionPost extends Post{ + private Boolean isResolve; +} diff --git a/back/src/main/java/com/back/domain/post/repository/PostRepository.java b/back/src/main/java/com/back/domain/post/repository/PostRepository.java new file mode 100644 index 00000000..628d0fa8 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/repository/PostRepository.java @@ -0,0 +1,9 @@ +package com.back.domain.post.repository; + +import com.back.domain.post.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PostRepository extends JpaRepository { +} diff --git a/back/src/main/java/com/back/domain/post/rq/ApiResponse.java b/back/src/main/java/com/back/domain/post/rq/ApiResponse.java new file mode 100644 index 00000000..d999348b --- /dev/null +++ b/back/src/main/java/com/back/domain/post/rq/ApiResponse.java @@ -0,0 +1,15 @@ +package com.back.domain.post.rq; + +import lombok.Getter; + +@Getter +public class ApiResponse { + private String message; + private T data; + + + public ApiResponse(String message, T data) { + this.message= message; + this.data = data; + } +} diff --git a/back/src/main/java/com/back/domain/post/service/PostService.java b/back/src/main/java/com/back/domain/post/service/PostService.java new file mode 100644 index 00000000..0f69cf8c --- /dev/null +++ b/back/src/main/java/com/back/domain/post/service/PostService.java @@ -0,0 +1,64 @@ +package com.back.domain.post.service; + +import com.back.domain.post.dto.PostAllResponse; +import com.back.domain.post.dto.PostCreateRequest; +import com.back.domain.post.entity.Post; +import com.back.domain.post.repository.PostRepository; +import com.back.global.exception.ServiceException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PostService { + + private final PostRepository postRepository; + + public List getAllPosts() { + List posts = postRepository.findAll(); + + return posts; + } + + + public Post createPost(PostCreateRequest postCreateRequest, String authorName) { + Post post = new Post(); + post.setTitle(postCreateRequest.getTitle()); + post.setContent(postCreateRequest.getContent()); + post.setAuthorName(authorName); + String postTypeStr = postCreateRequest.getPostType(); + Post.PostType postType; + + switch(postTypeStr) { + case "INFORMATIONPOST": + postType = Post.PostType.INFORMATIONPOST; + break; + case "PRACTICEPOST": + postType = Post.PostType.PRACTICEPOST; + break; + case "QUESTIONPOST": + postType = Post.PostType.QUESTIONPOST; + break; + default: + throw new ServiceException("400-2", "유효하지 않은 PostType입니다."); + } + + post.setPostType(postType); + + postRepository.save(post); + + return post; + } + + public Post findById(Long id) { + return postRepository.findById(id).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + } + + public List getAllPostResponse() { + return postRepository.findAll().stream() + .map(PostAllResponse::new) + .toList(); + } +} diff --git a/back/src/main/java/com/back/global/auth/CurrentUser.java b/back/src/main/java/com/back/global/auth/CurrentUser.java new file mode 100644 index 00000000..70888101 --- /dev/null +++ b/back/src/main/java/com/back/global/auth/CurrentUser.java @@ -0,0 +1,11 @@ +package com.back.global.auth; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface CurrentUser { +} diff --git a/back/src/main/java/com/back/global/auth/CurrentUserArgumentResolver.java b/back/src/main/java/com/back/global/auth/CurrentUserArgumentResolver.java new file mode 100644 index 00000000..0c42b611 --- /dev/null +++ b/back/src/main/java/com/back/global/auth/CurrentUserArgumentResolver.java @@ -0,0 +1,58 @@ +package com.back.global.auth; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.member.member.repository.MemberRepository; +import com.back.global.security.SecurityUser; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.MethodParameter; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +@Component +@RequiredArgsConstructor +@Slf4j +public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver { + private final MemberRepository memberRepository; + @Override + public boolean supportsParameter(MethodParameter parameter) { + // 여기에 구현 + return parameter.hasParameterAnnotation(CurrentUser.class) && parameter.getParameterType().equals(Member.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, + ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, + WebDataBinderFactory binderFactory) { + // 여기에 구현 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + log.info("Authentication: {}", authentication != null ? "존재" : "null"); + + if (authentication == null || !authentication.isAuthenticated()) { + // 인증되지 않은 사용자라면 예외 처리 + log.warn("인증 정보 없음"); + return null; + } + Object principal = authentication.getPrincipal(); + log.info("Principal 타입: {}", authentication.getPrincipal().getClass().getSimpleName()); + log.info("Principal 값: {}", principal); + + SecurityUser securityUser = (SecurityUser) authentication.getPrincipal(); + Long memberId = securityUser.getId(); + log.info("Member ID: {}", memberId); + + + + Member member = memberRepository.findById(memberId).orElse(null); + log.info("Member 조회 결과: {}", member != null ? "성공" : "실패"); + + + return member; + } +} diff --git a/back/src/main/java/com/back/global/config/WebConfig.java b/back/src/main/java/com/back/global/config/WebConfig.java new file mode 100644 index 00000000..a5eeab15 --- /dev/null +++ b/back/src/main/java/com/back/global/config/WebConfig.java @@ -0,0 +1,21 @@ +package com.back.global.config; + +import com.back.global.auth.CurrentUserArgumentResolver; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +@RequiredArgsConstructor +public class WebConfig implements WebMvcConfigurer { + + private final CurrentUserArgumentResolver currentUserArgumentResolver; + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(currentUserArgumentResolver); + } +} diff --git a/back/src/main/java/com/back/global/jpa/BaseEntity.java b/back/src/main/java/com/back/global/jpa/BaseEntity.java index eb21883d..f7b35e6e 100644 --- a/back/src/main/java/com/back/global/jpa/BaseEntity.java +++ b/back/src/main/java/com/back/global/jpa/BaseEntity.java @@ -43,4 +43,4 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hashCode(id); } -} \ No newline at end of file +} diff --git a/back/src/main/java/com/back/global/rq/Rq.java b/back/src/main/java/com/back/global/rq/Rq.java index 684745fb..a590c7ef 100644 --- a/back/src/main/java/com/back/global/rq/Rq.java +++ b/back/src/main/java/com/back/global/rq/Rq.java @@ -115,4 +115,4 @@ public void setHeader(String name, String value) { resp.setHeader(name, value); } } -} \ No newline at end of file +} diff --git a/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java b/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java index d56a8002..df065fb6 100644 --- a/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java +++ b/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java @@ -11,6 +11,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -22,7 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; - +@Slf4j @Component @RequiredArgsConstructor public class CustomAuthenticationFilter extends OncePerRequestFilter { @@ -47,7 +48,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse private void work(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 인증이 필요없는 API 요청이라면 패스 - if (List.of("/auth/login", "/auth/signup", "auth/refresh", "/h2-console").contains(request.getRequestURI()) || + if (List.of("/auth/login", "/auth/signup", "/auth/refresh", "/h2-console").contains(request.getRequestURI()) || request.getRequestURI().startsWith("/h2-console/") || request.getRequestURI().startsWith("/swagger-ui/") || request.getRequestURI().startsWith("/v3/api-docs/") || @@ -56,7 +57,6 @@ private void work(HttpServletRequest request, HttpServletResponse response, Filt return; } - // 쿠키에서 토큰 추출 String accessToken = rq.getCookieValue("accessToken", ""); if (accessToken.isBlank()) { @@ -122,4 +122,4 @@ private void work(HttpServletRequest request, HttpServletResponse response, Filt filterChain.doFilter(request, response); } -} \ No newline at end of file +} diff --git a/back/src/main/java/com/back/global/security/SecurityConfig.java b/back/src/main/java/com/back/global/security/SecurityConfig.java index 321ff8dd..d79a3444 100644 --- a/back/src/main/java/com/back/global/security/SecurityConfig.java +++ b/back/src/main/java/com/back/global/security/SecurityConfig.java @@ -59,4 +59,4 @@ public UrlBasedCorsConfigurationSource corsConfigurationSource() { return source; } -} \ No newline at end of file +} diff --git a/back/src/main/java/com/back/global/security/SecurityUser.java b/back/src/main/java/com/back/global/security/SecurityUser.java index 326860c8..5eeb8fd4 100644 --- a/back/src/main/java/com/back/global/security/SecurityUser.java +++ b/back/src/main/java/com/back/global/security/SecurityUser.java @@ -25,4 +25,4 @@ public SecurityUser( this.id = id; this.name = name; } -} \ No newline at end of file +} diff --git a/back/src/test/java/com/back/domain/post/controller/InformationPostControllerTest.java b/back/src/test/java/com/back/domain/post/controller/InformationPostControllerTest.java new file mode 100644 index 00000000..ee751913 --- /dev/null +++ b/back/src/test/java/com/back/domain/post/controller/InformationPostControllerTest.java @@ -0,0 +1,179 @@ +package com.back.domain.post.controller; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.member.member.service.MemberService; +import com.back.domain.post.entity.Post; +import com.back.domain.post.service.PostService; +import com.back.global.security.SecurityUser; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +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.http.MediaType; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +import java.util.List; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + + +@ActiveProfiles("test") +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class InformationPostControllerTest { + + @Autowired + private PostService postService; + +// @MockBean +// private PostService postMockService; + + @Autowired + private MemberService memberService; + + @Autowired + private MockMvc mvc; + + @BeforeEach + void setUp() { + Member member = memberService.join("user1", "사용자1", "password123", Member.Role.MENTEE); + + // SecurityContext에 인증 정보 설정 + SecurityUser securityUser = new SecurityUser( + member.getId(), + member.getEmail(), + member.getPassword(), + member.getName(), + List.of(new SimpleGrantedAuthority("ROLE_" + member.getRole().name())) + ); + + Authentication auth = new UsernamePasswordAuthenticationToken( + securityUser, + null, + securityUser.getAuthorities() + ); + + SecurityContextHolder.getContext().setAuthentication(auth); + } + + @Test + @DisplayName("게시글 생성") + void t1() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/infor") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 1, + "postType": "INFORMATIONPOST", + "title": "테스트 제목", + "content": "테스트 내용" + } + """.stripIndent()) + ) + .andDo(print()); + + // 실제 생성된 게시글 조회 (실제 DB에서) + Post createdPost = postService.findById(1L); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("createPost")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.message").value("게시글이 성공적으로 생성되었습니다. ")) + .andExpect(jsonPath("$.data").exists()) + .andExpect(jsonPath("$.data.postId").value(createdPost.getId())) + .andExpect(jsonPath("$.data.title").value(createdPost.getTitle())); + } + + @Test + @DisplayName("일치하지 않는 postType") + void t2() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/infor") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 3, + "postType": "INFORMATIONPOST12", + "title": "테스트 제목", + "content": "테스트 내용" + } + """.stripIndent()) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("createPost")) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.resultCode").value("400-2")) + .andExpect(jsonPath("$.msg").value("유효하지 않은 PostType입니다.")); + } + + @Test + @DisplayName("게시글 다건조회") + void t3() throws Exception { + ResultActions resultActions = mvc + .perform( + get("/post/infor") + ) + .andDo(print()); + + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("getAllPost")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isArray()) + .andExpect(jsonPath("$.message").value("게시글 다건 조회 성공")) + .andExpect(jsonPath("$.data").exists()); + } + +// @Test +// @DisplayName("게시글 단건조회") +// void t4() throws Exception { +// Post mockPost = new Post(); +// +// // 리플렉션으로 ID 설정 +// Field idField = BaseEntity.class.getDeclaredField("id"); +// idField.setAccessible(true); +// idField.set(mockPost, 1L); +// +// mockPost.setTitle("테스트 제목"); +// mockPost.setContent("테스트 내용"); +// mockPost.setAuthorName("테스트유저"); +// mockPost.setPostType(Post.PostType.INFORMATIONPOST); +// +// when(postService.findById(1L)).thenReturn(mockPost); +// +// ResultActions resultActions = mvc +// .perform( +// get("/post/infor/{post_id}", 1L) +// ) +// .andDo(print()); +// +// +// resultActions +// .andExpect(handler().handlerType(InformationPostController.class)) +// .andExpect(handler().methodName("getSinglePost")) +// .andExpect(status().isOk()) +// .andExpect(jsonPath("$.message").value("게시글 단건 조회 성공")) +// .andExpect(jsonPath("$.data").exists()); +// } +}