WIL 6주차(김영현)
webWIL 6주차 스프링부트!
JSESSIONID 생성 규칙? 찾아보기 (저번주 의문사항)
- https://semtax.tistory.com/92 읽고 쓰는 정리
- 16바이트 단위로 랜덤 값을 가져와서 문자열 형태의 16진수로 변환
- 라우트 값이 있는 경우 랜덤값 뒤에 . 문자와 같이 라우트값 할당
- 마지막으로 jvaRoute값을 “.”문자와 합쳐준다.
- 뭔소리인지 모르겠음.. 다음주까지 좀더 찾아보겠습니다.
저번주 과제 마무리
게시물 댓글 관련 구현
- 코드를 작성할때마다 느끼지만 package를 어떻게 정리해야 깔끔한지 모르겠다…
- 지금은 front를 생각하면서 나누었던 package대로 commnet 관련이기 때문에 새로운 comment package를 만들어 사용중인데 사실 이게 맞는지 확신은 없다.. 지수님이 알려준 거에 대해서 자세히 알아봐야겠다
게시물의 댓글 조회
List<Comment> comments = commentRepository.findAllByBoardId_Id(id); List<BoardDto.GetCommentRequest> getCommentRequest = comments.stream().map(comment -> { BoardDto.GetCommentRequest getComment = modelMapper.map(comment, BoardDto.GetCommentRequest.class); // 받아온 comment는 db에 저장된 그대로 가져오기 때문에 원하는 값만 가져올 수 있게 따로 정리를 해줘야 함. modelMapper.map를 이용하여 미리 지정된 형식 GetCommentRequest 에 맞추어 정리함. getComment.setCreatedAt(comment.getCreatedAt().format(DateTimeFormatter.ofPattern("yyMMddHHss"))); // db에는 초 단위까지 저장되지만 그렇게 자세한 정보는 필요없기 때문에 타입을 바꿔줌 //익명 활성화 되었는지 확인하기 if (comment.getIsSecret()){ getComment.setNickname("익명"); getComment.setProfilePic("익명 사진"); }else{ getComment.setNickname(comment.getUser().getNickname()); getComment.setProfilePic(comment.getUser().getProfilePic()); } getComment.setUserId(comment.getUser().getId()); return getComment; //여기서 return은 stream중인 comments 각각을 return해주는 것 }).collect(Collectors.toList());
- 람다식의 return을 확실하게 생각해보고 작성해야 함을 느꼈다..
게시물 댓글 작성
Board board = boardRepository.getById(dto.getBoardId());
User user = userRepository.getById(id);
Comment newComment = Comment.builder()
.board(board)
.user(user)
.content(dto.getContent())
.isSecret(dto.getIsSecret())
.build();
commentRepository.save(newComment);
- 필요한 input은 댓글을 작성하는 board의 id와 작성자 즉 로그인 되어있는 session id값이 필요했다.
- 또한 DB의 구성이 board column의 타입이 int인 board_id 가 아니라 Board 타입이기 때문에 해당하는 board 자체를 가져와서 저장해주어야 했다.
jpql을 사용하여 API 구현하기
is_Hot이 True인 값 중에서 가장 최신 2가지 가져오기
- 당연히 복잡하지는 않지만 where문과 order by 등 여러가지 구문이 들어가야 하기 때문에 jpql로 구현해야 한다고 생각했지만 정말 간단하게 findTop2ByIsHotOrderByCreatedAtDesc(boolean isHot) 로 구현이 가능했다..
- Top2 -> limit 2, IsHot -> input과 같은 값(service 부분에서 true로 넣어줄 예정)
- OrderByCreatedAtDesc -> order by created_at desc
- jpa는 대단한거 같다..
main의 myBoard 6개 보내주기
- @Query(“select board from Board board where board.categoryId <=6 and board.createdAt IN (select max(board.createdAt) from board group by board.categoryId) order by board.categoryId”)
-
일단 categoryId가 6보다 작아야하고, 가장 최신의 글을 보여줘야하기 때문에 column IN()을 이용해서 ()내부의 조건에 맞는 값들만 가져오게 작성하였다.
- @Query(“select board from Board board where board.categoryId <=6 order by board.createdAt desc limit 1”) 원래 이런식으로 limit을 이용하여 작성하고 싶었는데 왜 limit에서 오류가 나오는지 모르겠다,,, 누가 안다면 help.. 검색해도 안나오고,., –> 작성중에 해결했는데 jpql 에서는 limit이 사용불가 하다고 한다..
실시간 인기글 조회
- @Query(value = “select * from board where created_at > date_add(now(),interval-24 hour) and is_hot = true order by like_num+comment_num desc, created_at desc limit 2”, nativeQuery = true)
- 위에서 limit이 안된거 처럼 jpql 쓰니까 너무 답답해서 그냥 query문으로 작성했다..
- 24시간 이내의 글, 좋아요+댓글 수 합과 created_at desc로 order by 후 limit 2로 2개의 값만 가져왔다.
미흡한 부분
- 이번에도 과제 완성 못했는데… 다음에는 무조건 밀린거 없이 완성해오겠습니다 ㅜㅜㅜ
다음 목표
- JSESSIONID 생성 규칙 추가 조사
- 남은 과제 완성