본문 바로가기
web/맛슐랭 Project

맛슐랭 - 찜한 맛집 리스트 구현

by su0a 2024. 3. 30.

1. repository

LikeRepository

Like를 저장하기 위해 LikeRepository 를 만들었다.

특정 멤버가 누른 좋아요 리스트를 반환하기 위해 findByMember 함수를 만들었다.

특정 멤버가 특정 장소에 좋아요를 눌렀는지 확인하기 위해 existByMemberEmailAndPlace 함수를 만들었다.

특정 멤버가 특정 장소에 누른 좋아요를 제거하기 위해 deleteByMemberAndPlace 함수를 만들었다.

@Repository
public interface LikeRepository extends JpaRepository<Like,Long> {
    void deleteByMemberAndPlace(Member loginMember, Place place);

    Boolean existsByMemberEmailAndPlace(String loginMemberEmail, Place place);

    @Query("select l from Like l " +
            "join fetch l.member m "+
            "join fetch l.place p "+
            "where l.member=:member")
    List<Like> findByMember(@Param("member") Member member);
}

 

2. service

LikeService

@Service
@RequiredArgsConstructor
public class LikeService {
    private final LikeRepository likeRepository;
    private final MemberRepository memberRepository;
    private final PlaceRepository placeRepository;

    // Like 생성
    @Transactional
    public void addLike(Member loginMember, Place place){

        likeRepository.save(Like.builder()
                .member(loginMember)
                .place(place)
                .build()
        );
    }

    // Like 삭제
    @Transactional
    public void deleteLike(Member loginMember, Place place){

        likeRepository.deleteByMemberAndPlace(loginMember,place);
    }

    // 특정 회원이 특정 장소에 좋아요 눌렀는지 확인하기 위해
    public Boolean checkLike(String loginMemberEmail, Place place){
        return likeRepository.existsByMemberEmailAndPlace(loginMemberEmail,place);
    }
}

 

PlaceService

특정 회원이 찜한 장소를 반환하기 위해 getLikePlace 함수를 만들었다.

@Service
@RequiredArgsConstructor
public class PlaceService {
    private final PlaceRepository placeRepository;
    private final LikeService likeService;
    private final LikeRepository likeRepository;
    // 특정 회원이 찜한 장소 리스트 반환
    public List<PlaceDto> getLikePlace(Member member) {
        // 특정 회원이 누른 좋아요 리스트 반환
        List<Like> likeList=likeRepository.findByMember(member);
        List<PlaceDto> placeDtoList = new ArrayList<>();
        for(Like like:likeList){
            // 해당 likeList 에 해당되는 장소들 리스트로 반환
            PlaceDto placeDto = PlaceDto.of(like.getPlace());
            placeDto.setCheckLike(true);
            placeDtoList.add(placeDto);
        }
        return placeDtoList;
    }
}

 

3. Controller

MemberController

@Controller
@RequiredArgsConstructor
@RequestMapping("/members")
public class MemberController {
    // 특정 장소에 좋아요 추가함으로써 찜한 장소에 추가됨
    @PostMapping("/addLike")
    public String addLike(@RequestParam("posX") String posX,
                                                            @RequestParam("posY") String posY, Model model) {
        //System.out.println(posX+"  "+posY);
        SessionUser user = (SessionUser) httpSession.getAttribute("user");
        Member member= memberRepository.findByEmail(user.getEmail()).get();
        Place place = placeRepository.findByPosXAndPosY(posX, posY).get();
        likeService.addLike(member, place);
        return "reviews/reviewList";
    }

    // 찜한 장소에 like 취소하기 위해
    @PostMapping("/delLike")
    public String deleteLike(@RequestParam("posX") String posX,
                                 @RequestParam("posY") String posY, Model model) {
        //System.out.println(posX+"  "+posY);
        SessionUser user = (SessionUser) httpSession.getAttribute("user");
        Member member= memberRepository.findByEmail(user.getEmail()).get();
        Place place = placeRepository.findByPosXAndPosY(posX, posY).get();
        likeService.deleteLike(member,place);
        return "reviews/reviewList";
    }

    // 특정 회원이 찜한 장소 리스트 볼 수 있는 uri
    @GetMapping("/likeList")
    public String getLikeList(Model model){
        SessionUser user = (SessionUser) httpSession.getAttribute("user");
        List<PlaceDto> placeDtoList;
        Member member = memberRepository.findByEmail(user.getEmail()).get();
        placeDtoList = placeService.getLikePlace(member);

        model.addAttribute("placeDtoList",placeDtoList);
        return "reviews/likeList";
    }
}