기존 코드
# PostController
@PutMapping("/posts/{id}")
public PostResponse updatePost(@PathVariable Long id, @RequestBody PostRequest requestDto, HttpServletRequest request) {
String token = jwtUtil.resolveToken(request);
Claims claims;
if (token != null) {
if (!jwtUtil.validateToken(token)) {
throw new IllegalArgumentException("토큰값이 잘못되었습니다.");
}
claims = jwtUtil.getUserInfoFromToken(token);
String usernameOfToken = claims.getSubject();
return postService.updatePost(id, requestDto, usernameOfToken);
} else {
throw new IllegalArgumentException("토큰이 존재하지 않습니다.");
}
}
# PostService
@Transactional
public PostResponse updatePost(Long id, PostRequest requestDto, String usernameOfToken) {
Post post = postRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 포스트가 존재하지 않습니다.")
);
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(usernameOfToken).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
if (post.isWriter(user.getUsername()) || user.isAdmin(user.getRole())) {
post.update(id, requestDto, user);
postRepository.save(post);
} else {
throw new RuntimeException("해당 유저만 수정할 수 있습니다.");
}
return new PostResponse(post, user);
}
# JwtService
@Service
@RequiredArgsConstructor
public class JwtService {
private final JwtUtil jwtUtil;
public AuthenticatedUser validateAndGetInfo(String token) {
if (jwtUtil.validateToken(token)) {
Claims claims = jwtUtil.getUserInfoFromToken(token);
String username = claims.getSubject();
UserRoleEnum role = UserRoleEnum.valueOf(claims.get("auth").toString());
return new AuthenticatedUser(role, username );
} else {
throw new IllegalArgumentException("Token Error");
}
}
}
@Getter
public class AuthenticatedUser {
private final UserRoleEnum userRoleEnum;
private final String username;
public AuthenticatedUser(UserRoleEnum role, String username) {
this.userRoleEnum = role;
this.username = username;
}
}
최종 코드
# Controller
@PutMapping("/posts/{id}")
public PostResponse updatePost(@PathVariable Long id, @RequestBody PostRequest requestDto, HttpServletRequest request) {
String token = jwtUtil.resolveToken(request);
AuthenticatedUser authenticatedUser = jwtUtil.validateAndGetInfo(token);
return postService.updatePost(id, requestDto, authenticatedUser.getUsername());
}
@PutMapping("/admin/posts/{id}")
public PostResponse adminUpdatePost(@PathVariable Long id, @RequestBody PostRequest requestDto, HttpServletRequest request) {
String token = jwtUtil.resolveToken(request);
AuthenticatedUser authenticatedUser = jwtUtil.validateAndGetInfo(token);
if (!authenticatedUser.getUserRoleEnum().equals(UserRoleEnum.ADMIN)) {
throw new IllegalArgumentException("권한이 없습니다.");
}
return postService.adminUpdatePost(id, requestDto, authenticatedUser.getUsername());
}
# Service
@Transactional
public PostResponse updatePost(Long id, PostRequest requestDto, String username) {
Post post = postRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 포스트가 존재하지 않습니다.")
);
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(username).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
if (post.isWriter(user.getUsername())) {
post.update(id, requestDto, user);
postRepository.save(post);
} else {
throw new RuntimeException("해당 유저만 수정할 수 있습니다.");
}
return new PostResponse(post, user);
}
@Transactional
public PostResponse adminUpdatePost(Long id, PostRequest requestDto, String username) {
Post post = postRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 포스트가 존재하지 않습니다.")
);
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(username).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
post.update(id, requestDto, user);
postRepository.save(post);
return new PostResponse(post, user);
}