diff --git a/src/main/java/server/loop/domain/post/controller/PostController.java b/src/main/java/server/loop/domain/post/controller/PostController.java index 00a1ac9..a19c240 100644 --- a/src/main/java/server/loop/domain/post/controller/PostController.java +++ b/src/main/java/server/loop/domain/post/controller/PostController.java @@ -49,7 +49,8 @@ public ResponseEntity createPost( @GetMapping("/{postId}") public ResponseEntity getPost( @PathVariable Long postId, - @AuthenticationPrincipal @Nullable User currentUser) { + @AuthenticationPrincipal @Nullable User currentUser // 로그인 안 해도 null + ) { PostDetailResponseDto response = postService.getPost(postId, currentUser); return ResponseEntity.ok(response); } diff --git a/src/main/java/server/loop/domain/post/entity/repository/PostRepository.java b/src/main/java/server/loop/domain/post/entity/repository/PostRepository.java index 07ccee7..2153069 100644 --- a/src/main/java/server/loop/domain/post/entity/repository/PostRepository.java +++ b/src/main/java/server/loop/domain/post/entity/repository/PostRepository.java @@ -27,15 +27,14 @@ public interface PostRepository extends JpaRepository { @Query("SELECT p FROM Post p WHERE p.category = :category ORDER BY p.createdAt DESC") Slice findAllActivePostsByCategory(@Param("category") Category category, Pageable pageable); - @Query("SELECT DISTINCT p FROM Post p " + + @Query("SELECT p FROM Post p " + "LEFT JOIN FETCH p.author " + "LEFT JOIN FETCH p.comments c " + "LEFT JOIN FETCH c.author " + - "LEFT JOIN FETCH c.children cc " + - "LEFT JOIN FETCH cc.author " + "WHERE p.id = :id AND p.isDeleted = false") Optional findActivePostWithCommentsById(@Param("id") Long id); + @Query("SELECT p FROM Post p WHERE p.author = :author ORDER BY p.createdAt DESC") Slice findActivePostsByAuthor(@Param("author") User author, Pageable pageable); } \ No newline at end of file diff --git a/src/main/java/server/loop/global/security/JwtAuthenticationFilter.java b/src/main/java/server/loop/global/security/JwtAuthenticationFilter.java index 4829609..b493a10 100644 --- a/src/main/java/server/loop/global/security/JwtAuthenticationFilter.java +++ b/src/main/java/server/loop/global/security/JwtAuthenticationFilter.java @@ -18,7 +18,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtTokenProvider jwtTokenProvider; - private final UserDetailsService userDetailsService; // CustomUserDetailsService 주입 + private final UserDetailsService userDetailsService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) @@ -27,7 +27,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse String path = request.getRequestURI(); // === 1. 광고 업로드/조회 API는 인증 없이 통과 === - if (path.startsWith("/api/ads")) { // /api/ads 또는 /api/ads/… 전부 허용 + if (path.startsWith("/api/ads")) { filterChain.doFilter(request, response); return; } @@ -35,23 +35,27 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse // 1. 요청 헤더에서 토큰 추출 String token = resolveToken(request); - // 2. 토큰 유효성 검증 - if (token != null && jwtTokenProvider.validateToken(token)) { - // 3. 토큰에서 사용자 정보(email) 가져오기 + // === 2. 토큰이 없으면 (비로그인 요청) 그냥 통과 === + if (token == null) { + filterChain.doFilter(request, response); + return; + } + + // === 3. 토큰이 유효하면 인증 객체 생성 === + if (jwtTokenProvider.validateToken(token)) { String email = jwtTokenProvider.getEmail(token); - // 4. UserDetailsService를 통해 UserDetails 객체 가져오기 UserDetails userDetails = userDetailsService.loadUserByUsername(email); - // 5. Authentication 객체 생성 및 SecurityContext에 저장 + Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); } - // 다음 필터로 요청 전달 + // 4. 다음 필터로 요청 전달 filterChain.doFilter(request, response); } - // 요청 헤더에서 'Bearer ' 토큰을 추출하는 메소드 + // 요청 헤더에서 'Bearer ' 토큰 추출 private String resolveToken(HttpServletRequest request) { String bearerToken = request.getHeader("Authorization"); if (bearerToken != null && bearerToken.startsWith("Bearer ")) { @@ -59,4 +63,4 @@ private String resolveToken(HttpServletRequest request) { } return null; } -} \ No newline at end of file +}