[TIL] 2023.01.03 [연관관계... 기초를 탄탄히]

조성현·2023년 1월 3일
0

스프링 심화 팀프로젝트 3일차

  • 단순히 돌아가는 코드가 아니라 효율과 안정성에 대한 생각을 하면서 코드를 작성하다 보니... 생각보다 진도가 안나간다.
  • 그러나 리팩토링 시간을 절약한다는 측면에서 충분히 가치있는 과정이다.
    (이미 완성된 코드, 심지어 남이 쓴 코드를 리팩토링 하는 것은 생각보다 리소스가 많이 든다.)
  • 또한 좋은 코드를 작성하는 습관을 들인다는 점에서도 가치가 있다!

오늘의 생각, 배움들

// 원투매니는 신중하게 사용하세요
// 매니투원으로만 해결되는 문제는 아닌지 생각해보고 신중하게 달고,
//원투매니는 특히나 더더더더욱 신중하게 해야됩니다. )

package middleProjects.com.entity;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import middleProjects.com.dto.comment.CommentRequestDto;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Getter
@Entity
@RequiredArgsConstructor
public class Comment extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private Long id;

    @Column(nullable = false)
    private String contents;

//    @OneToMany(mappedBy = "comment", cascade = CascadeType.ALL, orphanRemoval = true)
//    List<CommentRecommendation> commentRecommendationList = new ArrayList<>();

/// 원투매니는 신중하게 사용하세요 (-> 매니투원을 항상 먼저 달고(얘도 고민을 충분히 하고 다시고,
//원투매니는 특히나 더더더더욱 신중하게 해야됩니다. )

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id", nullable = false)
    private Board board;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "userId", nullable = false)
    private Member member;

    public Comment(String contents, Board board, Member member ){
        this.contents = contents;
        this.board = board;
        this.member = member;
        // board에 list보고 맞춰가야함. ex) board.getCommentList().add(this);
    }
    public void memberAndCommentWriterEqualCheck(String username){
        if(!this.member.getUsername().equals(username)){
            //TODO: 추후에 핸들링 할 수 있도록 exception 수정요망.
            throw new IllegalArgumentException("댓글작성자와 멤버 불일치");
        }
    }

    public void updateComment(String contents) {
        this.contents = contents;
    }
}

//댓글추천db에서 countBy로 숫자만 세온다. -> comment.getRecommendList.stream().count 해버리면? 다 들고와서 숫자를 세는 꼴(서버 붐)

package middleProjects.com.dto.comment;

import lombok.Getter;
import middleProjects.com.entity.Comment;

import java.time.LocalDateTime;

@Getter
//@RequiredArgsConstructor
//@NoArgsConstructor(force=true)
public class CommentResponseDto {

    private final Long commentId;
    private final String comment;
    private final String commentWriter;
    private final LocalDateTime createDate;
    private final LocalDateTime modDate;
    private final Long recommendCount;

    public CommentResponseDto(Comment comment){
        this.commentId = comment.getId();
        this.comment = comment.getContents();
        this.commentWriter = comment.getMember().getUsername(); 
        //얘도 이렇게하면 db에서 member 꺼내오는 것. 
        this.createDate = comment.getCreateDate();
        this.modDate = comment.getModDate();
        this.recommendCount = comment.getCommentRecommendationList().stream().count();
   //댓글추천db에서 countBy로 숫자만 세온다.(들고오지는 않는다)
   // -> comment.getRecommendList.stream().count 해버리면? 다 들고와서 숫자를 세는 꼴(서버 붐)
    }
}

하나의 함수에서 두가지 일을 하고 있다.

  • 댓글 좋아요를 눌렀는지 여부에 따라 분기해서 다른 로직을 실행하도록 하고 있다.
  • 원래 기능은 '댓글에 좋아요'를 해주는게 맞다. -> 그러나? 지금 댓글좋아요가 존재할 시에 취소해주는 기능을 까지도 해주고 있다.
  • 댓글 좋아요와 댓글 좋아요 취소 API를 구분하자
    -> API에 대한 분기(어떤 api를 부를지에 대한 선택)는 프론트에서 이루어진다.
  • 프론트는 어차피 이 사람이 해당 게시물/댓글에 좋아요를 눌렀는지 여부에 대해 이미 알고있다 (그래야만 화면을 띄워줄 수 있기 때문)

    API를 두개로 나누자 - 취사선택은 프론트에서 하는 것.

  • 과제 명세를 곧이 곧대로 받아들이지말고, 해석하는 습관.
    @Transactional
    @Override
    public String recommendComment(Long commentId, String username) {
//        Member member = memberRepository.findByUsername(username).orElseThrow(IllegalArgumentException::new);
        Comment comment = commentRepository.findById(commentId).orElseThrow(IllegalArgumentException::new);
        Optional<CommentRecommendation> optionalCommentRecommend = commentRecommendationRepository.findByMemberAndCommentId(comment.getMember(), commentId);
        if(optionalCommentRecommend.isPresent()){
            commentRecommendationRepository.delete(optionalCommentRecommend.get());
            return "댓글 좋아요 취소완료" ;
        }

        CommentRecommendation commentRecommend = new CommentRecommendation(comment, comment.getMember());
        commentRecommendationRepository.save(commentRecommend);
        return "댓글 좋아요 완료";
    }

오늘의 Ref 한줌넣기
[DDD] 간접 참조 (feat. JPA)
도메인 주도 설계와 모델 주도 설계 도입하기 - 정산편(타다)
[JPA] Exists
[Java] Optional isPresent(), ifPresent() 사용하기
JPA로 원하는 매개변수로 findBy 메소드 생성하기
JPA 이해하기 (feat. ORM)
https://www.inflearn.com/questions/618281/updateitemdto

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

0개의 댓글