100DAYS) [Main-Project] ReviewLike 1차 구현, Review 및 ReviewLike에 Principal 적용

nacSeo (낙서)·2023년 3월 13일
0

오전 회의에서는 주말 간 개인별 진행된 상황을 공유했다. 나는 ReviewLike CD와 Like개수를 count하는 로직을 구현했다. ReviewLike 파트를 구현하면서 기록할 만한 내용들은 다음과 같다.

  1. Entity 클래스에서 member와 review와의 다대일 관계 설정
@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;
}
  1. 이를 통해 Mapper 인터페이스에서 Mapstruct를 적용
@Mapper(componentModel = "spring")
public interface ReviewLikeMapper {
    @Mapping(source = "reviewLike.member.memberId", target = "memberId")
    @Mapping(source = "reviewLike.review.id", target = "reviewId")
    ReviewLikeResponseDto ReviewLikeToReviewLikeResponseDto(ReviewLike reviewLike);
}
  1. Like의 개수를 count하는 기능을 위해 Repository에서 JPA를 통해 메서드 로직 구현
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시에 적용해주었다 :)

profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글