Skip to content

Commit e345306

Browse files
authored
Merge pull request #44 from Sportize/cache/user
♻️ Refactor: JwtAuthenticationFilter User 조회 Redis 캐싱 적용
2 parents adfd69d + 7886f32 commit e345306

File tree

22 files changed

+205
-105
lines changed

22 files changed

+205
-105
lines changed

src/main/java/com/be/sportizebe/domain/chat/controller/NoteController.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import com.be.sportizebe.domain.post.entity.Post;
77
import com.be.sportizebe.domain.post.exception.PostErrorCode;
88
import com.be.sportizebe.domain.post.repository.PostRepository;
9-
import com.be.sportizebe.domain.user.entity.User;
109
import com.be.sportizebe.global.exception.CustomException;
1110
import com.be.sportizebe.global.response.BaseResponse;
11+
import com.be.sportizebe.global.cache.dto.UserAuthInfo;
1212
import io.swagger.v3.oas.annotations.Operation;
1313
import io.swagger.v3.oas.annotations.Parameter;
1414
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -33,12 +33,12 @@ public class NoteController {
3333
@Operation(summary = "1대1 채팅방 생성", description = "게시글 작성자와 1대1 쪽지 채팅방을 생성합니다. 채팅방 이름은 게시글 제목으로 설정됩니다. 이미 채팅방이 존재하면 기존 채팅방을 반환합니다.")
3434
public ResponseEntity<BaseResponse<ChatRoomResponse>> createChatRoom(
3535
@Parameter(description = "게시글 ID") @PathVariable Long postId,
36-
@AuthenticationPrincipal User user) {
36+
@AuthenticationPrincipal UserAuthInfo userAuthInfo) {
3737

3838
Post post = postRepository.findById(postId)
3939
.orElseThrow(() -> new CustomException(PostErrorCode.POST_NOT_FOUND));
4040

41-
ChatRoom room = chatRoomService.createNote(post, user);
41+
ChatRoom room = chatRoomService.createNote(post, userAuthInfo.getId());
4242

4343
return ResponseEntity.status(HttpStatus.CREATED)
4444
.body(BaseResponse.success("채팅방 생성 성공", ChatRoomResponse.from(room)));
@@ -47,9 +47,9 @@ public ResponseEntity<BaseResponse<ChatRoomResponse>> createChatRoom(
4747
@GetMapping("/rooms")
4848
@Operation(summary = "내 쪽지 채팅방 목록 조회", description = "현재 사용자가 참여한 모든 쪽지 채팅방 목록을 조회합니다.")
4949
public ResponseEntity<BaseResponse<List<ChatRoomResponse>>> getMyChatRooms(
50-
@AuthenticationPrincipal User user) {
50+
@AuthenticationPrincipal UserAuthInfo userAuthInfo) {
5151

52-
List<ChatRoomResponse> rooms = chatRoomService.findMyNoteRooms(user).stream()
52+
List<ChatRoomResponse> rooms = chatRoomService.findMyNoteRooms(userAuthInfo.getId()).stream()
5353
.map(ChatRoomResponse::from)
5454
.toList();
5555

src/main/java/com/be/sportizebe/domain/chat/repository/ChatRoomRepository.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.be.sportizebe.domain.chat.entity.ChatRoom;
44
import com.be.sportizebe.domain.post.entity.Post;
5-
import com.be.sportizebe.domain.user.entity.User;
65
import org.springframework.data.jpa.repository.JpaRepository;
76

87
import java.util.List;
@@ -11,8 +10,8 @@
1110
public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
1211

1312
// 특정 게시글에 대해 두 사용자 간의 1대1 채팅방이 이미 존재하는지 확인
14-
Optional<ChatRoom> findByPostAndGuestUser(Post post, User guestUser);
13+
Optional<ChatRoom> findByPostAndGuestUserId(Post post, Long guestUserId);
1514

1615
// 사용자가 참여한 1대1 채팅방 목록 조회 (게시글 작성자 또는 채팅 요청자로 참여)
17-
List<ChatRoom> findByPost_UserOrGuestUser(User postUser, User guestUser);
16+
List<ChatRoom> findByPost_UserIdOrGuestUserId(Long postUserId, Long guestUserId);
1817
}

src/main/java/com/be/sportizebe/domain/chat/service/ChatRoomService.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.be.sportizebe.domain.club.entity.Club;
77
import com.be.sportizebe.domain.post.entity.Post;
88
import com.be.sportizebe.domain.user.entity.User;
9+
import com.be.sportizebe.domain.user.exception.UserErrorCode;
10+
import com.be.sportizebe.domain.user.repository.UserRepository;
911
import com.be.sportizebe.global.exception.CustomException;
1012
import lombok.RequiredArgsConstructor;
1113
import org.springframework.stereotype.Service;
@@ -18,6 +20,7 @@
1820
@Transactional(readOnly = true)
1921
public class ChatRoomService {
2022
private final ChatRoomRepository chatRoomRepository;
23+
private final UserRepository userRepository;
2124

2225
@Transactional
2326
public ChatRoom createGroup(Club club) {
@@ -29,17 +32,19 @@ public ChatRoom createGroup(Club club) {
2932
}
3033

3134
@Transactional
32-
public ChatRoom createNote(Post post, User guestUser) {
35+
public ChatRoom createNote(Post post, Long guestUserId) {
3336
User hostUser = post.getUser(); // 게시글 등록자
3437

3538
// 자기 자신에게 채팅 불가
36-
if (hostUser.getId() == guestUser.getId()) {
39+
if (hostUser.getId() == guestUserId) {
3740
throw new CustomException(ChatErrorCode.SELF_CHAT_NOT_ALLOWED);
3841
}
3942

4043
// 이미 존재하는 채팅방이 있으면 반환
41-
return chatRoomRepository.findByPostAndGuestUser(post, guestUser)
44+
return chatRoomRepository.findByPostAndGuestUserId(post, guestUserId)
4245
.orElseGet(() -> {
46+
User guestUser = userRepository.findById(guestUserId)
47+
.orElseThrow(() -> new CustomException(UserErrorCode.USER_NOT_FOUND));
4348
ChatRoom room = ChatRoom.builder()
4449
.chatRoomType(ChatRoom.ChatRoomType.NOTE)
4550
.post(post)
@@ -50,8 +55,8 @@ public ChatRoom createNote(Post post, User guestUser) {
5055
}
5156

5257
// 사용자가 참여한 1대1 채팅방 목록 조회
53-
public List<ChatRoom> findMyNoteRooms(User user) {
54-
return chatRoomRepository.findByPost_UserOrGuestUser(user, user);
58+
public List<ChatRoom> findMyNoteRooms(Long userId) {
59+
return chatRoomRepository.findByPost_UserIdOrGuestUserId(userId, userId);
5560
}
5661

5762
public List<ChatRoom> findAll() {

src/main/java/com/be/sportizebe/domain/club/controller/ClubController.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import com.be.sportizebe.domain.club.dto.response.ClubImageResponse;
66
import com.be.sportizebe.domain.club.dto.response.ClubResponse;
77
import com.be.sportizebe.domain.club.service.ClubServiceImpl;
8-
import com.be.sportizebe.domain.user.entity.User;
98
import com.be.sportizebe.global.response.BaseResponse;
9+
import com.be.sportizebe.global.cache.dto.UserAuthInfo;
1010
import io.swagger.v3.oas.annotations.Operation;
1111
import io.swagger.v3.oas.annotations.Parameter;
1212
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -32,8 +32,8 @@ public class ClubController {
3232
public ResponseEntity<BaseResponse<ClubResponse>> createClub(
3333
@RequestPart("request") @Valid ClubCreateRequest request,
3434
@RequestPart(value = "image", required = false) MultipartFile image,
35-
@AuthenticationPrincipal User user) {
36-
ClubResponse response = clubService.createClub(request, image, user);
35+
@AuthenticationPrincipal UserAuthInfo userAuthInfo) {
36+
ClubResponse response = clubService.createClub(request, image, userAuthInfo.getId());
3737
return ResponseEntity.status(HttpStatus.CREATED)
3838
.body(BaseResponse.success("동호회 생성 성공", response));
3939
}
@@ -43,8 +43,8 @@ public ResponseEntity<BaseResponse<ClubResponse>> createClub(
4343
public ResponseEntity<BaseResponse<ClubResponse>> updateClub(
4444
@PathVariable Long clubId,
4545
@RequestBody @Valid ClubUpdateRequest request,
46-
@AuthenticationPrincipal User user) {
47-
ClubResponse response = clubService.updateClub(clubId, request, user);
46+
@AuthenticationPrincipal UserAuthInfo userAuthInfo) {
47+
ClubResponse response = clubService.updateClub(clubId, request, userAuthInfo.getId());
4848
return ResponseEntity.ok(BaseResponse.success("동호회 수정 성공", response));
4949
}
5050

@@ -53,8 +53,8 @@ public ResponseEntity<BaseResponse<ClubResponse>> updateClub(
5353
public ResponseEntity<BaseResponse<ClubImageResponse>> updateClubImage(
5454
@Parameter(description = "동호회 ID") @PathVariable Long clubId,
5555
@RequestPart("image") MultipartFile image,
56-
@AuthenticationPrincipal User user) {
57-
ClubImageResponse response = clubService.updateClubImage(clubId, image, user);
56+
@AuthenticationPrincipal UserAuthInfo userAuthInfo) {
57+
ClubImageResponse response = clubService.updateClubImage(clubId, image, userAuthInfo.getId());
5858
return ResponseEntity.ok(BaseResponse.success("동호회 사진 수정 성공", response));
5959
}
6060
}

src/main/java/com/be/sportizebe/domain/club/service/ClubService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44
import com.be.sportizebe.domain.club.dto.request.ClubUpdateRequest;
55
import com.be.sportizebe.domain.club.dto.response.ClubImageResponse;
66
import com.be.sportizebe.domain.club.dto.response.ClubResponse;
7-
import com.be.sportizebe.domain.user.entity.User;
87
import org.springframework.web.multipart.MultipartFile;
98

109
public interface ClubService {
11-
ClubResponse createClub(ClubCreateRequest request, MultipartFile image, User user); // 동호회 생성
10+
ClubResponse createClub(ClubCreateRequest request, MultipartFile image, Long userId); // 동호회 생성
1211

13-
ClubResponse updateClub(Long clubId, ClubUpdateRequest request, User user); // 동호회 수정
12+
ClubResponse updateClub(Long clubId, ClubUpdateRequest request, Long userId); // 동호회 수정
1413

15-
ClubImageResponse updateClubImage(Long clubId, MultipartFile image, User user); // 동호회 사진 수정
14+
ClubImageResponse updateClubImage(Long clubId, MultipartFile image, Long userId); // 동호회 사진 수정
1615
}

src/main/java/com/be/sportizebe/domain/club/service/ClubServiceImpl.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.be.sportizebe.domain.club.repository.ClubMemberRepository;
1212
import com.be.sportizebe.domain.club.repository.ClubRepository;
1313
import com.be.sportizebe.domain.user.entity.User;
14+
import com.be.sportizebe.domain.user.exception.UserErrorCode;
15+
import com.be.sportizebe.domain.user.repository.UserRepository;
1416
import com.be.sportizebe.global.exception.CustomException;
1517
import com.be.sportizebe.global.s3.enums.PathName;
1618
import com.be.sportizebe.global.s3.service.S3Service;
@@ -27,11 +29,15 @@ public class ClubServiceImpl implements ClubService {
2729
private final ClubRepository clubRepository;
2830
private final ChatRoomService chatRoomService;
2931
private final ClubMemberRepository clubMemberRepository;
32+
private final UserRepository userRepository;
3033
private final S3Service s3Service;
3134

3235
@Override
3336
@Transactional
34-
public ClubResponse createClub(ClubCreateRequest request, MultipartFile image, User user) {
37+
public ClubResponse createClub(ClubCreateRequest request, MultipartFile image, Long userId) {
38+
User user = userRepository.findById(userId)
39+
.orElseThrow(() -> new CustomException(UserErrorCode.USER_NOT_FOUND));
40+
3541
if (clubRepository.existsByName(request.name())) {
3642
throw new CustomException(ClubErrorCode.CLUB_NAME_DUPLICATED);
3743
}
@@ -62,12 +68,12 @@ public ClubResponse createClub(ClubCreateRequest request, MultipartFile image, U
6268

6369
@Override
6470
@Transactional
65-
public ClubResponse updateClub(Long clubId, ClubUpdateRequest request, User user) {
71+
public ClubResponse updateClub(Long clubId, ClubUpdateRequest request, Long userId) {
6672
Club club = clubRepository.findById(clubId)
6773
.orElseThrow(() -> new CustomException(ClubErrorCode.CLUB_NOT_FOUND));
6874

6975
// 동호회 방장만 수정 가능하도록 검증
70-
if (club.getLeader().getId() != user.getId()) {
76+
if (club.getLeader().getId() != userId) {
7177
throw new CustomException(ClubErrorCode.CLUB_UPDATE_DENIED);
7278
}
7379

@@ -86,12 +92,12 @@ public ClubResponse updateClub(Long clubId, ClubUpdateRequest request, User user
8692

8793
@Override
8894
@Transactional
89-
public ClubImageResponse updateClubImage(Long clubId, MultipartFile image, User user) {
95+
public ClubImageResponse updateClubImage(Long clubId, MultipartFile image, Long userId) {
9096
Club club = clubRepository.findById(clubId)
9197
.orElseThrow(() -> new CustomException(ClubErrorCode.CLUB_NOT_FOUND));
9298

9399
// 동호회 방장만 수정 가능하도록 검증
94-
if (club.getLeader().getId() != user.getId()) {
100+
if (club.getLeader().getId() != userId) {
95101
throw new CustomException(ClubErrorCode.CLUB_UPDATE_DENIED);
96102
}
97103

src/main/java/com/be/sportizebe/domain/comment/controller/CommentController.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import com.be.sportizebe.domain.comment.dto.response.CommentListResponse;
55
import com.be.sportizebe.domain.comment.dto.response.CommentResponse;
66
import com.be.sportizebe.domain.comment.service.CommentService;
7-
import com.be.sportizebe.domain.user.entity.User;
87
import com.be.sportizebe.global.response.BaseResponse;
8+
import com.be.sportizebe.global.cache.dto.UserAuthInfo;
99
import io.swagger.v3.oas.annotations.Operation;
1010
import io.swagger.v3.oas.annotations.Parameter;
1111
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -16,8 +16,6 @@
1616
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1717
import org.springframework.web.bind.annotation.*;
1818

19-
import java.util.List;
20-
2119
@RestController
2220
@RequiredArgsConstructor
2321
@RequestMapping("/api/posts/{postId}/comments")
@@ -31,8 +29,8 @@ public class CommentController {
3129
public ResponseEntity<BaseResponse<CommentResponse>> createComment(
3230
@Parameter(description = "게시글 ID") @PathVariable Long postId,
3331
@RequestBody @Valid CreateCommentRequest request,
34-
@AuthenticationPrincipal User user) {
35-
CommentResponse response = commentService.createComment(postId, request, user);
32+
@AuthenticationPrincipal UserAuthInfo userAuthInfo) {
33+
CommentResponse response = commentService.createComment(postId, request, userAuthInfo.getId());
3634
return ResponseEntity.status(HttpStatus.CREATED)
3735
.body(BaseResponse.success("댓글 생성 성공", response));
3836
}
@@ -50,8 +48,8 @@ public ResponseEntity<BaseResponse<CommentListResponse>> getComments(
5048
public ResponseEntity<BaseResponse<Void>> deleteComment(
5149
@Parameter(description = "게시글 ID") @PathVariable Long postId,
5250
@Parameter(description = "댓글 ID") @PathVariable Long commentId,
53-
@AuthenticationPrincipal User user) {
54-
commentService.deleteComment(postId, commentId, user);
51+
@AuthenticationPrincipal UserAuthInfo userAuthInfo) {
52+
commentService.deleteComment(postId, commentId, userAuthInfo.getId());
5553
return ResponseEntity.ok(BaseResponse.success("댓글 삭제 성공", null));
5654
}
5755

src/main/java/com/be/sportizebe/domain/comment/service/CommentService.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@
33
import com.be.sportizebe.domain.comment.dto.request.CreateCommentRequest;
44
import com.be.sportizebe.domain.comment.dto.response.CommentListResponse;
55
import com.be.sportizebe.domain.comment.dto.response.CommentResponse;
6-
import com.be.sportizebe.domain.user.entity.User;
7-
8-
import java.util.List;
96

107
public interface CommentService {
118

129
// 댓글 생성 (대댓글 포함)
13-
CommentResponse createComment(Long postId, CreateCommentRequest request, User user);
10+
CommentResponse createComment(Long postId, CreateCommentRequest request, Long userId);
1411

1512
// 게시글의 댓글 목록 조회
1613
CommentListResponse getCommentsByPostId(Long postId);
1714

1815
// 댓글 삭제
19-
void deleteComment(Long postId, Long commentId, User user);
16+
void deleteComment(Long postId, Long commentId, Long userId);
2017

2118
// 게시글의 댓글 수 조회
2219
long getCommentCount(Long postId);

src/main/java/com/be/sportizebe/domain/comment/service/CommentServiceImpl.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import com.be.sportizebe.domain.post.exception.PostErrorCode;
1111
import com.be.sportizebe.domain.post.repository.PostRepository;
1212
import com.be.sportizebe.domain.user.entity.User;
13+
import com.be.sportizebe.domain.user.exception.UserErrorCode;
14+
import com.be.sportizebe.domain.user.repository.UserRepository;
1315
import com.be.sportizebe.global.exception.CustomException;
1416
import jakarta.transaction.Transactional;
1517
import lombok.RequiredArgsConstructor;
@@ -27,15 +29,20 @@ public class CommentServiceImpl implements CommentService {
2729

2830
private final CommentRepository commentRepository;
2931
private final PostRepository postRepository;
32+
private final UserRepository userRepository;
3033

3134
@Override
3235
@CacheEvict(cacheNames = {"commentList", "commentCount"}, key = "#postId")
3336
@Transactional
34-
public CommentResponse createComment(Long postId, CreateCommentRequest request, User user) {
37+
public CommentResponse createComment(Long postId, CreateCommentRequest request, Long userId) {
3538
// 게시글 조회
3639
Post post = postRepository.findById(postId)
3740
.orElseThrow(() -> new CustomException(PostErrorCode.POST_NOT_FOUND));
3841

42+
// 사용자 조회
43+
User user = userRepository.findById(userId)
44+
.orElseThrow(() -> new CustomException(UserErrorCode.USER_NOT_FOUND));
45+
3946
// 부모 댓글 조회 (대댓글인 경우)
4047
Comment parent = null; // null로 초기화
4148
if (request.parentId() != null) { // parentId가 null이 아니면 대댓글이기 때문에 부모 댓글 조회로 검증 필요함
@@ -79,12 +86,12 @@ public CommentListResponse getCommentsByPostId(Long postId) {
7986
@Override
8087
@CacheEvict(cacheNames = {"commentList", "commentCount"}, key = "#postId")
8188
@Transactional
82-
public void deleteComment(Long postId, Long commentId, User user) {
89+
public void deleteComment(Long postId, Long commentId, Long userId) {
8390
Comment comment = commentRepository.findById(commentId)
8491
.orElseThrow(() -> new CustomException(CommentErrorCode.COMMENT_NOT_FOUND));
8592

8693
// 작성자 확인
87-
if (comment.getUser().getId() != user.getId()) {
94+
if (comment.getUser().getId() != userId) {
8895
throw new CustomException(CommentErrorCode.COMMENT_DELETE_DENIED);
8996
}
9097

0 commit comments

Comments
 (0)