카테고리 없음

[내일배움캠프] 12월 23일 금요일 TIL 회고록

tft4rollz 2022. 12. 24. 01:07

오늘 한 것: 댓글 기능 구현 시도

 

게시글 작성 API를 깔끔하게 정리하려고 했다. 

혼자 해보려고 시도는 했으나 쉽지 않아서 강의를 참고하며 만들었다.

 

이전에는 Service 에서 토큰을 가져오고 토큰이 유효한지 확인했었는데 다시 코드를 만들면서 이번에는 Controller에서 토큰을 가져오고 유효한지 확인하게 만들었다.  그리고 boardService.createBoard(requestDto,claims)를 리턴시켰다.

@PostMapping("/boards")
    public BoardResponseDto createBoard(@RequestBody BoardRequestDto requestDto, HttpServletRequest request) {
        // Request에서 토큰 가져오기
        String token = jwtUtil.resolveToken(request);
        Claims claims;
        // 토큰이 있는 경우에만 토큰 가져오기
       if (token != null) {
           if (jwtUtil.vaildateToken(token)) {
               claims = jwtUtil.getUserInfoFromToken(token);
           }else {
               throw new IllegalArgumentException("Token Error");
           }
       return boardService.createBoard(requestDto,claims);
       }else {
           throw new IllegalArgumentException("토큰이 유효하지 않습니다");
       }
    }

Service에는 responeDto로 리턴 타입을 설정하고 requestDto, claims를 매개변수로 받는 createBoard를 만들었다.

User user = 로 토큰에서 가져온 사용자 정보를 사용해서 DB를 조회한 후 정보가 없으면 사용자가 존재하지 않다는 익셉션을 출력하게 만들었다.

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

그리고 받은 매개변수를 이용해서 새 Board 객체를 생성하고, Repository에 생성한 객체를 저장했다. 

만든 Board 객체를 이용해서, responseDto 객체도 새로 생성해서 리턴시켰다.

// 토큰값이 유효한 회원만 게시글 작성 가능
        Board board = new Board(requestDto,user);
        boardRepository.save(board);
        return new BoardResponseDto(board);
}

Postman에서도 이쁘게 게시글 작성이 된다.

알게된 점은 Board board = new Board 를 이용해서 쉽게 게시글을 저장할 수 있다는 것을 알게됬고,  Controller 부분에서

토큰을 검사해서, Service에 있는 댓글 작성 api부분을 보기 깔끔하게 만들수 있다는걸 알았다.

전체 게시글 조회 및 선택한 게시글 조회를 할 시 댓글이 나오고 내림차순으로 나와야하는데 댓글은 정상적으로 나오나 내림차순이 안되어 굉장히 시간을 많이 썼다..

현재 전체 리스트를 출력해주는 BoardListResponseDto는 강의에서 튜터님이 알려주신 코드로 적어서 출력이 된다. 하지만 내림차순이 안된다.

public BoardListResponseDto(Board board) {
    List<CommentResponseDto> list = new ArrayList<>();
    this.title = board.getTitle();
    this.content = board.getContent();
    this.createdAt = board.getCreatedAt();
    this.modifiedAt = board.getModifiedAt();
    this.username = board.getUser().getUsername();
    for (Comment comment : board.getComments()) {
        list.add(new CommentResponseDto(comment));
    }
    this.commentsList = list;
}

그래서 게시글 전체 조회 코드에 이렇게도 추가해보고..  추가하고 실행했더니 실행은 되는데 뭔가 이상하게 나온다..

    List<Comment> commentList = commentRepository.findAllByOrderByModifiedAtDesc();
    for (Comment comment : commentList){
    responseDtoList.add((new BoardListResponseDto(comment.getBoard())));
}

 

 

BoardListResponseDto 여기에 이걸 추가하고..

private CommentRepository commentRepository;

이렇게도 해봤지만 이렇게 했더니 아예 전체리스트가 안불러와져서 포기했다.

       List<Comment> commentList = findAllByOrderByModifiedAtDesc();
       List<CommentResponseDto> list = new ArrayList<>();
        this.title = board.getTitle();
        this.content = board.getContent();
        this.createdAt = board.getCreatedAt();
        this.modifiedAt = board.getModifiedAt();
        this.username = board.getUser().getUsername();
        for (Comment comment : commentList) {
            list.add(new CommentResponseDto(comment));
        }
        this.commentsList = list;

그래서 구글링을 해봤더니 @OrderBy() 를 사용하면 내림차순으로 정렬할 수 있다고 해서

 

Board.java에 붙여보고 실행했다.

@OneToMany(mappedBy = "board")
@OrderBy("comment desc")
private List<Comment> comments = new ArrayList<>();

실행했더니 조회했을때 내림차 순으로 잘 정렬이 된다..

두시간 동안 고생해서 겨우겨우 정렬을 했다.. 이렇게 하면 안될거같지만..  

앞으로 모르는 부분이 생기면 구글링을 열심히 해야겠다. 

구글링을 해서 예외 처리까지 구현했다.

나머지는 주말이나 다음주에 해야겠다.