스프링 심화 팀프로젝트 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