20240904_TIL
1. 내일배움캠프 Sping
오늘은 팀 프로젝트를 하였습니다. 프로젝트를 모두 합치고 추가해야할 부분을 추가하면서 소통을 많이 하였습니다. 예외처리부분이나 공통적인 부분에 관하여 이야기를 많이 하고, 어떤 기능을 추가하면 좋을지, 혹은 어떤 기능이 더 필요한지 등에 관하여 토론하였습니다.
2. 김영한의 스프링 기본편
세션 8. 의존관계 자동 주입에 관하여 배웠습니다. 의존관계 주입, 옵션처리, 룸북,애노테이션 직접 만들기에 관하여 배웠고, 의존관계 주입에서는 최대한 생성자 주입과 자동주입을 사용하는 것이 좋다는 것도 알게되었습니다.
3. 코딩테스트
4. 스프링 숙련 프로젝트
오늘은 게시글 부분(feed부분)을 자신의 글과 자신이 친구로 추가한 친구의 글만 보이도록 수정하고, 게시글 조회시 댓글도 같이 조회하는 기능과 좋아요 기능에서 자기 자신의 게시글은 좋아요를 누를 수 없도록 하였습니다.
https://github.com/KJG04/sparta-news-feed
GitHub - KJG04/sparta-news-feed
Contribute to KJG04/sparta-news-feed development by creating an account on GitHub.
github.com
게시글 부분(feed부분)을 자신의 글과 자신이 친구로 추가한 친구의 글만 보이도록 수정한 부분
public Page<BoardsResponseDto> getAllBoards(int page, int size, String sortBy, boolean isAsc, List<Friend> friendList, User user) {
// pageing 처리
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size, sort);
List<Long> userList = new ArrayList<>();
// 자신의 글을 불러오기 위해 로그인 한 사람 id 추가
userList.add(user.getUserId());
// 친구들의 글을 불러오기 위해 친구 id 추가
for (Friend friend : friendList) {
userList.add(friend.getToUser().getUserId());
}
// 친구의 글을 가져와서 dto에 넣어줌
Page<BoardsResponseDto> boardsResponseDtoList = boardsRepository.findAllByUserIdIn(pageable, userList).map(BoardsResponseDto::new);
// 댓글 개수와, 좋아요개수 넣어줌
for (BoardsResponseDto boardsResponseDto : boardsResponseDtoList) {
List<BoardsLike> boardsLikeList = boardsLikeRepository.findAllByBoardIdAndLikeState(boardsResponseDto.getBoardId(), true);
List<Comment> comments = commentRepository.findAllByBoards_BoardId(boardsResponseDto.getBoardId());
boardsResponseDto.update(boardsLikeList.size(), comments.size());
}
return boardsResponseDtoList;
}
위 부분은 BoardsService 의 한 부분입니다.
userList에 자신의 아이디와 친구들의 아이디를 저장한 후, 좋아요의 개수와 댓글의 개수를 저장하여 반환합니다.
게시글 조회시 댓글도 같이 조회하는 기능 부분
public BoardOneResponseDto getOneBoard(Long boardId, List<Friend> friendList, User user) {
List<Long> userList = new ArrayList<>();
// 자신의 글을 불러오기 위해 로그인 한 사람 id 추가
userList.add(user.getUserId());
// 친구들의 글을 불러오기 위해 친구 id 추가
for (Friend friend : friendList) {
userList.add(friend.getToUser().getUserId());
}
Boards boards = boardsRepository.findById(boardId).orElseThrow();
if(!userList.contains(boards.getUserId())) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "해당 게시판의 접근이 불가능합니다.");
}
List<BoardsLike> boardsLikeList = boardsLikeRepository.findAllByBoardIdAndLikeState(boardId, true);
List<Comment> comments = commentRepository.findAllByBoards_BoardId(boardId);
return new BoardOneResponseDto(getOneBoardWithId(boardId), boardsLikeList.size(), comments);
}
위 부분은 BoardsService 의 한 부분입니다.
권한에 따라 친구와 자기 자신만 단건 조회가 가능합니다. 여기에서 댓글도 조회가 가능하도록 하기 위해 commets를 불러와서 보여주도록 만들었습니다.
좋아요 기능에서 자기 자신의 게시글은 좋아요를 누를 수 없도록하는 부분
@Transactional
public BoardsLikeResponseDto boardsLike(Long boardId, User user) {
BoardsLike boardsLike = boardsLikeRepository.findByBoardIdAndUserId(boardId, user.getUserId());
Boards board = boardsRepository.findById(boardId).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "해당 게시판의 ID를 찾을 수 없습니다."));
// 처음 좋아요를 누르는 경우 생성을 하고, 만약 전에 누른적이 있다면 상태를 변경합니다.
if(user.getUserId().equals(board.getUserId())){
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "자신의 게시글에는 좋아요를 누를 수 없습니다.");
}
if (boardsLike == null) {
BoardsLike newboardsLike = new BoardsLike(user.getUserId(), boardId, true);
BoardsLike saveBoardsLike = boardsLikeRepository.save(newboardsLike);
return new BoardsLikeResponseDto(saveBoardsLike);
} else {
return new BoardsLikeResponseDto(boardsLike.update());
}
}
BoardsLikeService부분입니다.
처음에 로그인한 user의 id와 게시글의 userid(게시글을 작성한 사람)이 같다면 좋아요를 누를 수 없도록 하였습니다.
추가적으로 했으면 하는 부분
예외처리 부분과 JPA N+1 오류를 찾아 수정해야한다고 생각합니다.