오전 회의에서는 주말 간 개인별 진행된 상황을 공유했다. 나는 ReviewLike CD와 Like개수를 count하는 로직을 구현했다. ReviewLike 파트를 구현하면서 기록할 만한 내용들은 다음과 같다.
@NoArgsConstructor
@Getter
@Setter
@Entity
public class ReviewLike {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne
@JoinColumn(name = "review_id")
private Review review;
}
@Mapper(componentModel = "spring")
public interface ReviewLikeMapper {
@Mapping(source = "reviewLike.member.memberId", target = "memberId")
@Mapping(source = "reviewLike.review.id", target = "reviewId")
ReviewLikeResponseDto ReviewLikeToReviewLikeResponseDto(ReviewLike reviewLike);
}
public interface ReviewLikeRepository extends JpaRepository<ReviewLike, Long> {
int countByReviewId(Long reviewId);
}
이 후에는 Principal을 review와 reviewLike에 적용시켜주는 작업을 진행했다.
공식문서에서의 Principal 인터페이스 설명은 다음과 같다.
개인, 회사 및 로그인 ID와 같은 모든 엔티티를 나타내는 데 사용할 수 있는 주체의 추상적인 개념을 나타낸다고 나와있다. 이 중에서도 getName() 메서드를 사용해서 member의 email에 넣어주어 해당 이메일로 로그인이 되어있는지 확인하는 로직을 통해 유효한 member인지 확인할 수 있다는 점을 활용했다.
public Member findLoginMemberByEmail(String email){
Optional<Member> optionalMember = memberRepository.findByEmail(email);
Member member = optionalMember.orElseThrow(() -> new BusinessLogicException(ExceptionCode.MEMBER_NOT_FOUND));
verifyActiveMember(member);
return member;
}
@PostMapping
public ResponseEntity postReview(@RequestBody ReviewDto.Post postDto, Principal principal) {
Member member = memberService.findLoginMemberByEmail(principal.getName());
postDto.setMember(member);
...
이런 식으로 review POST, PATCH, DELETE, reviewLike POST, DELETE시에 적용해주었다 :)