WIL 6주차 스프링부트!

JSESSIONID 생성 규칙? 찾아보기 (저번주 의문사항)

  • https://semtax.tistory.com/92 읽고 쓰는 정리
    1. 16바이트 단위로 랜덤 값을 가져와서 문자열 형태의 16진수로 변환
    2. 라우트 값이 있는 경우 랜덤값 뒤에 . 문자와 같이 라우트값 할당
    3. 마지막으로 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개의 값만 가져왔다.

미흡한 부분

  • 이번에도 과제 완성 못했는데… 다음에는 무조건 밀린거 없이 완성해오겠습니다 ㅜㅜㅜ

다음 목표

  1. JSESSIONID 생성 규칙 추가 조사
  2. 남은 과제 완성