jwt 토큰을 이용하여 사용자를 확인한 후, 게시글을 작성/수정/삭제 할 수 있는 권한을 주는 프로젝트를 만드는 중이었다.
그러나 IntelliJ 에서 코드가 중복된다며 알려주었다.
게시글 수정
@Transactional
public BoardResponseDto updateBoard(Long id, BoardRequestDto requestDto, HttpServletRequest request) {
String token = jwtUtil.getJwtFromHeader(request);
Claims claims;
if (StringUtils.hasText(token)) {
if (jwtUtil.validateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("올바른 token 이 아닙니다.");
}
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자를 찾을 수 없습니다.")
);
Board board = boardRepository.findByIdAndUserId(id, user.getId()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자의 게시글을 찾을 수 없습니다.")
);
board.update(requestDto);
return new BoardResponseDto(board);
}
return null;
}
게시글 삭제
@Transactional
public MsgResponseDto deleteBoard(Long id, HttpServletRequest request) {
String token = jwtUtil.getJwtFromHeader(request);
Claims claims;
if (StringUtils.hasText(token)) {
if (jwtUtil.validateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("올바른 token 이 아닙니다.");
}
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자를 찾을 수 없습니다.")
);
Board board = boardRepository.findByIdAndUserId(id, user.getId()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자의 게시글을 찾을 수 없습니다.")
);
boardRepository.delete(board);
return new MsgResponseDto("게시글을 삭제했습니다.", HttpStatus.OK.value());
}
return new MsgResponseDto("게시글 작성자만 삭제할 수 있습니다.", HttpStatus.OK.value());
}
수정 & 삭제에서 중복된 부분
String token = jwtUtil.getJwtFromHeader(request);
Claims claims;
if (StringUtils.hasText(token)) {
if (jwtUtil.validateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("올바른 token 이 아닙니다.");
}
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자를 찾을 수 없습니다.")
);
Board board = boardRepository.findByIdAndUserId(id, user.getId()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자의 게시글을 찾을 수 없습니다.")
);
jwt 토큰을 가져와서 검증하고, 사용자와 게시글의 존재 여부를 확인하는 과정이다.
이렇게 긴 부분이 중복되다보니 코드가 지저분해졌다.
게시글 수정
@Transactional
public BoardResponseDto updateBoard(Long id, BoardRequestDto requestDto, HttpServletRequest request) {
User user = getUserFromToken(request); // getUserFromToken 메서드를 호출
Board board = boardRepository.findByIdAndUserId(id, user.getId()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자의 게시글을 찾을 수 없습니다.")
);
board.update(requestDto);
return new BoardResponseDto(board);
}
게시글 삭제
public MsgResponseDto deleteBoard(Long id, HttpServletRequest request) {
User user = getUserFromToken(request); // getUserFromToken 메서드를 호출
Board board = boardRepository.findByIdAndUserId(id, user.getId()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자의 게시글을 찾을 수 없습니다.")
);
boardRepository.delete(board);
return new MsgResponseDto("게시글을 삭제했습니다.", HttpStatus.OK.value());
}
중복된 부분을 공통 처리하는 메서드
private User getUserFromToken(HttpServletRequest request) {
String token = jwtUtil.getJwtFromHeader(request);
Claims claims;
if (StringUtils.hasText(token)) {
if (jwtUtil.validateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("올바른 token 이 아닙니다.");
}
return userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("해당 사용자를 찾을 수 없습니다.")
);
}
throw new IllegalArgumentException("token 이 없습니다.");
}