[12.15] 내일배움캠프[Spring] TIL-33

박상훈·2022년 12월 15일
0

내일배움캠프[TIL]

목록 보기
33/72

[12.15] 내일배움캠프[Spring] TIL-33

1. Spring 개인 과제 진행

요구사항

  1. 전체 게시글 목록 조회 API
    • 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
    • 작성 날짜 기준 내림차순으로 정렬하기
  2. 게시글 작성 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
    • 제목, 작성자명(username), 작성 내용을 저장하고
    • 저장된 게시글을 Client 로 반환하기
  3. 선택한 게시글 조회 API
    • 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기
      (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
  4. 선택한 게시글 수정 API
    • 수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
    • 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
  5. 선택한 게시글 삭제 API
    • 삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후
    • 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 삭제 가능
    • 선택한 게시글을 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기

1. 전체 게시글 목록 조회

Controller

//전체 게시글 조회
@GetMapping("/board/list")
    public List<Board> getBoardList(){
        return boardService.getBoardAll();
    }

Service

  @Transactional
    public List<Board> getBoardAll() {
        return boardRepository.findAllByOrderByModifiedAtDesc();
    }

Repository

public interface BoardRepository extends JpaRepository<Board,Long> {
	//save(),delete() 같이 기본으로 들어있지 않기 때문에 선언!
    List<Board> findAllByOrderByModifiedAtDesc();
}

2. 게시글 작성

  • 회원 가입을 진행하고, 로그인 된 상태(JWT을 받은 상태)에서만 작성 가능
  • 여기서 과제의 조건이 회원가입과 로그인의 성공 시 msg , StatusCode를 리턴하는 것 이였는데,
    아무리 생각해도 Json타입으로 반환할 생각이 안나서, DTO를 따로 만들어서 set 한 후 해당 DTO를 리턴했는데, 출력은 잘되지만 뭔가 코드마다 이 객체의 생성이 모두 들어가게 되는 것 같아 불안하다.

Controller

//Board(게시물) 추가시 해당 User의 ID를 body로 받아서 ~ 같이 추가해줘야 될 것 같음.
    @PostMapping("/board/list")
    public Board createBoard(@RequestBody BoardRequestDTO boardDto, HttpServletRequest request){

        return boardService.createBoard(boardDto,request);
    }

Service

@Transactional
    public Board createBoard(BoardRequestDTO boardDto, HttpServletRequest request) {


        // Request에서 Token 가져오기
        String token = jwtUtil.resolveToken(request);
        Claims claims;

        // 토큰이 있는 경우에만 게시글 생성 가능
        if (token != null) {

            // Token 검증
            if (jwtUtil.validateToken(token)) {
                // 토큰에서 사용자 정보 가져오기
                claims = jwtUtil.getUserInfoFromToken(token);
            } else {
                throw new IllegalArgumentException("Token Error");
            }

            // 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
            User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
                    () -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
            );

            Board board = new Board(boardDto, user);
            boardRepository.save(board);
            return board;
        }
        return null;
    }

등록되지 않은 사용자가 게시글을 작성할 경우

회원가입 -> 로그인 ( 토큰 발급 ) -> 게시글 작성 경우




3. 선택한 게시글 조회

Controller

 @GetMapping("/board/list/{id}")
    public Optional<Board> findBoard(@PathVariable Long id){
        return boardService.findBoardById(id);
    }

Service

 @Transactional
    public Optional<Board> findBoardById(Long id) {
        return Optional.ofNullable(boardRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("특정 게시글이 없습니다!")
        ));
    }

4. 선택한 게시글 수정

  • 로그인이 되어 JWT를 발급 받고 진행
  • 본인의 JWT를 넣어주지 않으면 게시물의 수정이 이뤄지지 않는다.

Controller

@PutMapping("/board/list/{id}")
    public Board updateBoard(@PathVariable Long id, @RequestBody BoardRequestDTO boardDto , HttpServletRequest request){
        return boardService.update(id,boardDto,request);
    }

Service

@Transactional
    public Board update(Long id, BoardRequestDTO boardDto, HttpServletRequest request) {

        // Request에서 Token 가져오기
        String token = jwtUtil.resolveToken(request);
        Claims claims;

        //선택한 게시글 찾기
        Board board = boardRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("수정하고자 하는 게시글이 없습니다!")
        );

        // 토큰이 있는 경우에만 게시글 수정 가능
        if (token != null) {

            // Token 검증
            if (jwtUtil.validateToken(token)) {
                // 토큰에서 사용자 정보 가져오기
                claims = jwtUtil.getUserInfoFromToken(token);
            } else {
                throw new IllegalArgumentException("Token Error");
            }

            // 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
            User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
                    () -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
            );

            if (!(board.getUser().getId() == user.getId())) {
                throw new IllegalArgumentException("해당 사용자가 아니면 게시글을 수정할 수 없습니다!");
            }
            board.update(boardDto);
            return board;
        }
        return null;
    }

등록되지 않은 사용자가 게시글을 수정할 경우

로그인 ( 토큰 발급 ) -> 게시글 수정 경우


5. 선택한 게시글 삭제

  • 로그인이 되어 JWT를 발급 받고 진행
  • 본인의 JWT를 넣어주지 않으면 게시물의 수정이 이뤄지지 않는다.

Controller

@DeleteMapping("/board/list/{id}")
    public ResponseEntity deleteBoard(@PathVariable Long id, @RequestBody BoardRequestDTO boardDto, HttpServletRequest request){
        return boardService.delete(id,boardDto,request);
    }

Service

public ResponseEntity delete(Long id, BoardRequestDTO boardDto, HttpServletRequest request) {

        // Request에서 Token 가져오기
        String token = jwtUtil.resolveToken(request);
        Claims claims;

        Board board = boardRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("삭제하고자 하는 게시글이 없습니다!")
        );

        if (token != null) {

            // Token 검증
            if (jwtUtil.validateToken(token)) {
                // 토큰에서 사용자 정보 가져오기
                claims = jwtUtil.getUserInfoFromToken(token);
            } else {
                throw new IllegalArgumentException("Token Error");
            }

            // 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
            User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
                    () -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
            );

            if (!(board.getUser().getId() == user.getId())) {
                throw new IllegalArgumentException("해당 사용자가 아니면 게시글을 삭제할 수 없습니다!");
            }

            boardRepository.deleteById(id);

            DeleteSuccessDto deleteSuccessDto = new DeleteSuccessDto();
            deleteSuccessDto.setMsg("게시글 삭제 성공!");
            deleteSuccessDto.setStatusCode(200);
            return ResponseEntity.status(HttpStatus.OK).body(deleteSuccessDto);
        }
        return null;
    }

다른 사용자가 게시글을 삭제할 경우

  • 회원 가입 조차 하지 않은 회원이 접근할 경우 유저를 찾을 수 없다는 메세지가 뜹니다.

사용자가 게시글을 삭제할 경우

profile
기록하는 습관

0개의 댓글