Skip to content

Commit a08689c

Browse files
authored
refactor: 인증 정보 argumentResolver가 long siteUserId를 주입하도록 (#396)
* refactor: long 또는 Long을 추출하도록 * refactor: 파라미터가 원시타입이면 반드시 required로 해석하도록 * test: argumentResolver 변경사항 테스트 코드에 반영 - 추가로, 반복되던 mocking 으로 가독성을 해치던 것을 해결 * refactor: long id를 받도록 ApplicationController 수정 * refactor: long id를 받도록 AuthController 수정 * refactor: long id를 받도록 CommentController 수정 * refactor: long id를 받도록 PostController 수정 * refactor: long id를 받도록 MentorController 수정 * refactor: long id를 받도록 NewsController 수정 * refactor: long id를 받도록 S3Controller 수정 * refactor: long id를 받도록 ScoreController 수정 * refactor: long id를 받도록 MyPageController 수정 * refactor: long id를 받도록 UniversityController 수정 * refactor: 누락된 부분 포함하여 변경 * chore: todo 추가
1 parent 0cfa442 commit a08689c

File tree

46 files changed

+366
-267
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+366
-267
lines changed

src/main/java/com/example/solidconnection/application/controller/ApplicationController.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import com.example.solidconnection.common.resolver.AuthorizedUser;
99
import com.example.solidconnection.security.annotation.RequireRoleAccess;
1010
import com.example.solidconnection.siteuser.domain.Role;
11-
import com.example.solidconnection.siteuser.domain.SiteUser;
1211
import jakarta.validation.Valid;
1312
import lombok.RequiredArgsConstructor;
1413
import org.springframework.http.HttpStatus;
@@ -31,10 +30,10 @@ public class ApplicationController {
3130
// 지원서 제출하기 api
3231
@PostMapping
3332
public ResponseEntity<ApplicationSubmissionResponse> apply(
34-
@AuthorizedUser SiteUser siteUser,
33+
@AuthorizedUser long siteUserId,
3534
@Valid @RequestBody ApplyRequest applyRequest
3635
) {
37-
ApplicationSubmissionResponse applicationSubmissionResponse = applicationSubmissionService.apply(siteUser, applyRequest);
36+
ApplicationSubmissionResponse applicationSubmissionResponse = applicationSubmissionService.apply(siteUserId, applyRequest);
3837
return ResponseEntity
3938
.status(HttpStatus.OK)
4039
.body(applicationSubmissionResponse);
@@ -43,22 +42,22 @@ public ResponseEntity<ApplicationSubmissionResponse> apply(
4342
@RequireRoleAccess(roles = {Role.ADMIN})
4443
@GetMapping
4544
public ResponseEntity<ApplicationsResponse> getApplicants(
46-
@AuthorizedUser SiteUser siteUser,
45+
@AuthorizedUser long siteUserId,
4746
@RequestParam(required = false, defaultValue = "") String region,
4847
@RequestParam(required = false, defaultValue = "") String keyword
4948
) {
50-
applicationQueryService.validateSiteUserCanViewApplicants(siteUser);
51-
ApplicationsResponse result = applicationQueryService.getApplicants(siteUser, region, keyword);
49+
applicationQueryService.validateSiteUserCanViewApplicants(siteUserId);
50+
ApplicationsResponse result = applicationQueryService.getApplicants(siteUserId, region, keyword);
5251
return ResponseEntity
5352
.ok(result);
5453
}
5554

5655
@GetMapping("/competitors")
5756
public ResponseEntity<ApplicationsResponse> getApplicantsForUserCompetitors(
58-
@AuthorizedUser SiteUser siteUser
57+
@AuthorizedUser long siteUserId
5958
) {
60-
applicationQueryService.validateSiteUserCanViewApplicants(siteUser);
61-
ApplicationsResponse result = applicationQueryService.getApplicantsByUserApplications(siteUser);
59+
applicationQueryService.validateSiteUserCanViewApplicants(siteUserId);
60+
ApplicationsResponse result = applicationQueryService.getApplicantsByUserApplications(siteUserId);
6261
return ResponseEntity
6362
.ok(result);
6463
}

src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.solidconnection.application.service;
22

33
import static com.example.solidconnection.common.exception.ErrorCode.APPLICATION_NOT_APPROVED;
4+
import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;
45

56
import com.example.solidconnection.application.domain.Application;
67
import com.example.solidconnection.application.dto.ApplicantsResponse;
@@ -9,6 +10,7 @@
910
import com.example.solidconnection.common.VerifyStatus;
1011
import com.example.solidconnection.common.exception.CustomException;
1112
import com.example.solidconnection.siteuser.domain.SiteUser;
13+
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
1214
import com.example.solidconnection.university.domain.UnivApplyInfo;
1315
import com.example.solidconnection.university.repository.UnivApplyInfoRepository;
1416
import com.example.solidconnection.university.repository.custom.UnivApplyInfoFilterRepositoryImpl;
@@ -32,14 +34,17 @@ public class ApplicationQueryService {
3234
private final ApplicationRepository applicationRepository;
3335
private final UnivApplyInfoRepository univApplyInfoRepository;
3436
private final UnivApplyInfoFilterRepositoryImpl universityFilterRepository;
37+
private final SiteUserRepository siteUserRepository;
3538

3639
@Value("${university.term}")
3740
public String term;
3841

3942
// todo: 캐싱 정책 변경 시 수정 필요
4043
@Transactional(readOnly = true)
41-
public ApplicationsResponse getApplicants(SiteUser siteUser, String regionCode, String keyword) {
44+
public ApplicationsResponse getApplicants(long siteUserId, String regionCode, String keyword) {
4245
// 1. 대학 지원 정보 필터링 (regionCode, keyword)
46+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
47+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
4348
List<UnivApplyInfo> univApplyInfos = universityFilterRepository.findAllByRegionCodeAndKeywords(regionCode, List.of(keyword));
4449
if (univApplyInfos.isEmpty()) {
4550
return new ApplicationsResponse(List.of(), List.of(), List.of());
@@ -54,7 +59,9 @@ public ApplicationsResponse getApplicants(SiteUser siteUser, String regionCode,
5459
}
5560

5661
@Transactional(readOnly = true)
57-
public ApplicationsResponse getApplicantsByUserApplications(SiteUser siteUser) {
62+
public ApplicationsResponse getApplicantsByUserApplications(long siteUserId) {
63+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
64+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
5865
Application userLatestApplication = applicationRepository.getApplicationBySiteUserIdAndTerm(siteUser.getId(), term);
5966

6067
List<Long> univApplyInfoIds = Stream.of(
@@ -118,7 +125,9 @@ private List<ApplicantsResponse> createUniversityApplicantsResponses(
118125
}
119126

120127
@Transactional(readOnly = true)
121-
public void validateSiteUserCanViewApplicants(SiteUser siteUser) {
128+
public void validateSiteUserCanViewApplicants(long siteUserId) {
129+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
130+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
122131
VerifyStatus verifyStatus = applicationRepository.getApplicationBySiteUserIdAndTerm(siteUser.getId(), term).getVerifyStatus();
123132
if (verifyStatus != VerifyStatus.APPROVED) {
124133
throw new CustomException(APPLICATION_NOT_APPROVED);

src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static com.example.solidconnection.common.exception.ErrorCode.INVALID_GPA_SCORE_STATUS;
66
import static com.example.solidconnection.common.exception.ErrorCode.INVALID_LANGUAGE_TEST_SCORE;
77
import static com.example.solidconnection.common.exception.ErrorCode.INVALID_LANGUAGE_TEST_SCORE_STATUS;
8+
import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;
89

910
import com.example.solidconnection.application.domain.Application;
1011
import com.example.solidconnection.application.dto.ApplicationSubmissionResponse;
@@ -18,6 +19,7 @@
1819
import com.example.solidconnection.score.repository.GpaScoreRepository;
1920
import com.example.solidconnection.score.repository.LanguageTestScoreRepository;
2021
import com.example.solidconnection.siteuser.domain.SiteUser;
22+
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
2123
import java.util.Optional;
2224
import lombok.RequiredArgsConstructor;
2325
import org.springframework.beans.factory.annotation.Value;
@@ -33,14 +35,17 @@ public class ApplicationSubmissionService {
3335
private final ApplicationRepository applicationRepository;
3436
private final GpaScoreRepository gpaScoreRepository;
3537
private final LanguageTestScoreRepository languageTestScoreRepository;
38+
private final SiteUserRepository siteUserRepository;
3639

3740
@Value("${university.term}")
3841
private String term;
3942

4043
// 학점 및 어학성적이 모두 유효한 경우에만 지원서 등록이 가능하다.
4144
// 기존에 있던 status field 우선 APRROVED로 입력시킨다.
4245
@Transactional
43-
public ApplicationSubmissionResponse apply(SiteUser siteUser, ApplyRequest applyRequest) {
46+
public ApplicationSubmissionResponse apply(long siteUserId, ApplyRequest applyRequest) {
47+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
48+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
4449
UnivApplyInfoChoiceRequest univApplyInfoChoiceRequest = applyRequest.univApplyInfoChoiceRequest();
4550
GpaScore gpaScore = getValidGpaScore(siteUser, applyRequest.gpaScoreId());
4651
LanguageTestScore languageTestScore = getValidLanguageTestScore(siteUser, applyRequest.languageTestScoreId());

src/main/java/com/example/solidconnection/auth/controller/AuthController.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.example.solidconnection.common.exception.ErrorCode;
2222
import com.example.solidconnection.common.resolver.AuthorizedUser;
2323
import com.example.solidconnection.siteuser.domain.AuthType;
24-
import com.example.solidconnection.siteuser.domain.SiteUser;
2524
import jakarta.validation.Valid;
2625
import lombok.RequiredArgsConstructor;
2726
import org.springframework.http.ResponseEntity;
@@ -104,11 +103,11 @@ public ResponseEntity<Void> signOut(
104103

105104
@DeleteMapping("/quit")
106105
public ResponseEntity<Void> quit(
107-
@AuthorizedUser SiteUser siteUser,
108-
Authentication authentication // todo: #299를 작업하며 인자를 (Authentication authentication)만 받도록 수정해야 함
106+
Authentication authentication,
107+
@AuthorizedUser long siteUserId
109108
) {
110109
String accessToken = getAccessToken(authentication);
111-
authService.quit(siteUser, accessToken);
110+
authService.quit(siteUserId, accessToken);
112111
return ResponseEntity.ok().build();
113112
}
114113

src/main/java/com/example/solidconnection/auth/service/AuthService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.example.solidconnection.auth.service;
22

33
import static com.example.solidconnection.common.exception.ErrorCode.REFRESH_TOKEN_EXPIRED;
4+
import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;
45

56
import com.example.solidconnection.auth.dto.ReissueRequest;
67
import com.example.solidconnection.auth.dto.ReissueResponse;
78
import com.example.solidconnection.auth.token.TokenBlackListService;
89
import com.example.solidconnection.common.exception.CustomException;
910
import com.example.solidconnection.siteuser.domain.SiteUser;
11+
import com.example.solidconnection.siteuser.repository.SiteUserRepository;
1012
import java.time.LocalDate;
1113
import lombok.RequiredArgsConstructor;
1214
import org.springframework.stereotype.Service;
@@ -18,6 +20,7 @@ public class AuthService {
1820

1921
private final AuthTokenProvider authTokenProvider;
2022
private final TokenBlackListService tokenBlackListService;
23+
private final SiteUserRepository siteUserRepository;
2124

2225
/*
2326
* 로그아웃한다.
@@ -37,7 +40,9 @@ public void signOut(String token) {
3740
* - 로그아웃한다.
3841
* */
3942
@Transactional
40-
public void quit(SiteUser siteUser, String token) { // todo: #299를 작업하며 인자를 (String token)만 받도록 수정해야 함
43+
public void quit(long siteUserId, String token) {
44+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
45+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
4146
LocalDate tomorrow = LocalDate.now().plusDays(1);
4247
siteUser.setQuitedAt(tomorrow);
4348
signOut(token);

src/main/java/com/example/solidconnection/common/resolver/AuthorizedUserResolver.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import com.example.solidconnection.common.exception.CustomException;
66
import com.example.solidconnection.security.userdetails.SiteUserDetails;
7-
import com.example.solidconnection.siteuser.domain.SiteUser;
87
import lombok.RequiredArgsConstructor;
98
import org.springframework.core.MethodParameter;
109
import org.springframework.security.core.Authentication;
@@ -22,29 +21,37 @@ public class AuthorizedUserResolver implements HandlerMethodArgumentResolver {
2221
@Override
2322
public boolean supportsParameter(MethodParameter parameter) {
2423
return parameter.hasParameterAnnotation(AuthorizedUser.class)
25-
&& parameter.getParameterType().equals(SiteUser.class);
24+
&& (parameter.getParameterType().equals(long.class)
25+
|| parameter.getParameterType().equals(Long.class));
2626
}
2727

2828
@Override
2929
public Object resolveArgument(MethodParameter parameter,
3030
ModelAndViewContainer mavContainer,
3131
NativeWebRequest webRequest,
3232
WebDataBinderFactory binderFactory) {
33-
SiteUser siteUser = extractSiteUserFromAuthentication();
34-
if (parameter.getParameterAnnotation(AuthorizedUser.class).required() && siteUser == null) {
33+
Long siteUserId = extractIdFromAuthentication();
34+
if (isRequired(parameter) && siteUserId == null) {
3535
throw new CustomException(AUTHENTICATION_FAILED, "로그인 상태가 아닙니다.");
3636
}
37-
38-
return siteUser;
37+
return siteUserId;
3938
}
4039

41-
private SiteUser extractSiteUserFromAuthentication() {
40+
private Long extractIdFromAuthentication() {
4241
try {
4342
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
4443
SiteUserDetails principal = (SiteUserDetails) authentication.getPrincipal();
45-
return principal.getSiteUser();
44+
return principal.getSiteUser().getId();
4645
} catch (Exception e) {
4746
return null;
4847
}
4948
}
49+
50+
private boolean isRequired(MethodParameter parameter) {
51+
if (parameter.getParameterType().isPrimitive()) { // NPE 방지를 위해 required로 간주
52+
return true;
53+
}
54+
AuthorizedUser authorizedUser = parameter.getParameterAnnotation(AuthorizedUser.class);
55+
return authorizedUser != null && authorizedUser.required();
56+
}
5057
}

src/main/java/com/example/solidconnection/community/board/controller/BoardController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.example.solidconnection.community.board.domain.BoardCode;
55
import com.example.solidconnection.community.post.dto.PostListResponse;
66
import com.example.solidconnection.community.post.service.PostQueryService;
7-
import com.example.solidconnection.siteuser.domain.SiteUser;
87
import java.util.ArrayList;
98
import java.util.List;
109
import lombok.RequiredArgsConstructor;
@@ -34,7 +33,7 @@ public ResponseEntity<?> findAccessibleCodes() {
3433

3534
@GetMapping("/{code}")
3635
public ResponseEntity<?> findPostsByCodeAndCategory(
37-
@AuthorizedUser SiteUser siteUser,
36+
@AuthorizedUser long siteUserId, // todo: '사용하지 않는 인자'로 인증된 유저만 접근하게 하기보다는, 다른 방식으로 접근하는것이 좋을 것 같다
3837
@PathVariable(value = "code") String code,
3938
@RequestParam(value = "category", defaultValue = "전체") String category) {
4039
List<PostListResponse> postsByCodeAndPostCategory = postQueryService

src/main/java/com/example/solidconnection/community/comment/controller/CommentController.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import com.example.solidconnection.community.comment.dto.CommentUpdateRequest;
88
import com.example.solidconnection.community.comment.dto.CommentUpdateResponse;
99
import com.example.solidconnection.community.comment.service.CommentService;
10-
import com.example.solidconnection.siteuser.domain.SiteUser;
1110
import jakarta.validation.Valid;
1211
import lombok.RequiredArgsConstructor;
1312
import org.springframework.http.ResponseEntity;
@@ -28,29 +27,29 @@ public class CommentController {
2827

2928
@PostMapping
3029
public ResponseEntity<?> createComment(
31-
@AuthorizedUser SiteUser siteUser,
30+
@AuthorizedUser long siteUserId,
3231
@Valid @RequestBody CommentCreateRequest commentCreateRequest
3332
) {
34-
CommentCreateResponse response = commentService.createComment(siteUser, commentCreateRequest);
33+
CommentCreateResponse response = commentService.createComment(siteUserId, commentCreateRequest);
3534
return ResponseEntity.ok().body(response);
3635
}
3736

3837
@PatchMapping("/{comment_id}")
3938
public ResponseEntity<?> updateComment(
40-
@AuthorizedUser SiteUser siteUser,
39+
@AuthorizedUser long siteUserId,
4140
@PathVariable("comment_id") Long commentId,
4241
@Valid @RequestBody CommentUpdateRequest commentUpdateRequest
4342
) {
44-
CommentUpdateResponse response = commentService.updateComment(siteUser, commentId, commentUpdateRequest);
43+
CommentUpdateResponse response = commentService.updateComment(siteUserId, commentId, commentUpdateRequest);
4544
return ResponseEntity.ok().body(response);
4645
}
4746

4847
@DeleteMapping("/{comment_id}")
4948
public ResponseEntity<?> deleteCommentById(
50-
@AuthorizedUser SiteUser siteUser,
49+
@AuthorizedUser long siteUserId,
5150
@PathVariable("comment_id") Long commentId
5251
) {
53-
CommentDeleteResponse response = commentService.deleteCommentById(siteUser, commentId);
52+
CommentDeleteResponse response = commentService.deleteCommentById(siteUserId, commentId);
5453
return ResponseEntity.ok().body(response);
5554
}
5655
}

src/main/java/com/example/solidconnection/community/comment/service/CommentService.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static com.example.solidconnection.common.exception.ErrorCode.CAN_NOT_UPDATE_DEPRECATED_COMMENT;
44
import static com.example.solidconnection.common.exception.ErrorCode.INVALID_COMMENT_LEVEL;
55
import static com.example.solidconnection.common.exception.ErrorCode.INVALID_POST_ACCESS;
6+
import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND;
67

78
import com.example.solidconnection.common.exception.CustomException;
89
import com.example.solidconnection.community.comment.domain.Comment;
@@ -36,7 +37,9 @@ public class CommentService {
3637
private final SiteUserRepository siteUserRepository;
3738

3839
@Transactional(readOnly = true)
39-
public List<PostFindCommentResponse> findCommentsByPostId(SiteUser siteUser, Long postId) {
40+
public List<PostFindCommentResponse> findCommentsByPostId(long siteUserId, Long postId) {
41+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
42+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
4043
List<Comment> allComments = commentRepository.findCommentTreeByPostId(postId);
4144
List<Comment> filteredComments = filterCommentsByDeletionRules(allComments);
4245

@@ -83,7 +86,9 @@ private Boolean isOwner(Comment comment, SiteUser siteUser) {
8386
}
8487

8588
@Transactional
86-
public CommentCreateResponse createComment(SiteUser siteUser, CommentCreateRequest commentCreateRequest) {
89+
public CommentCreateResponse createComment(long siteUserId, CommentCreateRequest commentCreateRequest) {
90+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
91+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
8792
Post post = postRepository.getById(commentCreateRequest.postId());
8893

8994
Comment parentComment = null;
@@ -105,7 +110,9 @@ private void validateCommentDepth(Comment parentComment) {
105110
}
106111

107112
@Transactional
108-
public CommentUpdateResponse updateComment(SiteUser siteUser, Long commentId, CommentUpdateRequest commentUpdateRequest) {
113+
public CommentUpdateResponse updateComment(long siteUserId, Long commentId, CommentUpdateRequest commentUpdateRequest) {
114+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
115+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
109116
Comment comment = commentRepository.getById(commentId);
110117
validateDeprecated(comment);
111118
validateOwnership(comment, siteUser);
@@ -122,7 +129,9 @@ private void validateDeprecated(Comment comment) {
122129
}
123130

124131
@Transactional
125-
public CommentDeleteResponse deleteCommentById(SiteUser siteUser, Long commentId) {
132+
public CommentDeleteResponse deleteCommentById(long siteUserId, Long commentId) {
133+
SiteUser siteUser = siteUserRepository.findById(siteUserId)
134+
.orElseThrow(() -> new CustomException(USER_NOT_FOUND));
126135
Comment comment = commentRepository.getById(commentId);
127136
validateOwnership(comment, siteUser);
128137

0 commit comments

Comments
 (0)