메서드로 코드 중복 줄이기

박영준·2023년 6월 30일
0

Spring

목록 보기
30/58

jwt 토큰을 이용하여 사용자를 확인한 후, 게시글을 작성/수정/삭제 할 수 있는 권한을 주는 프로젝트를 만드는 중이었다.

그러나 IntelliJ 에서 코드가 중복된다며 알려주었다.

1. 중복된 코드 확인

게시글 수정

@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 토큰을 가져와서 검증하고, 사용자와 게시글의 존재 여부를 확인하는 과정이다.
이렇게 긴 부분이 중복되다보니 코드가 지저분해졌다.

2. 메서드로 중복 줄이기

게시글 수정

@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 이 없습니다.");
}
  • jwt 토큰으로 사용자를 조회하는 메서드로 묶었다.
profile
개발자로 거듭나기!

0개의 댓글