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

맛슐랭 - 모든 맛집 리스트 조회를 위한 구현

by su0a 2024. 3. 30.

1. repository

ReviewRepository 

이전에 구현했던  ReviewRepository 에 findByPlace 함수를 추가함으로써 해당 장소에 대한 모든 리뷰를 반환받을 수 있다.

@Repository
public interface ReviewRepository extends JpaRepository<Review,Long> {
List<Review> findByPlace(Place place);
}

 

2. service

ReviewService

이전에 구현했던 ReviewService 에 getReviewByPlace 함수를 추가함으로써 장소에 의해 리뷰를 찾을 수 있는 로직을 구현하였다.

//특정 장소에 작성된 리뷰 리스트 반환
@Service
@RequiredArgsConstructor
public class ReviewService {
    private final ReviewRepository reviewRepository;
    private final UploadImageService uploadImageService;
    private final PlaceService placeService;
    private final PlaceRepository placeRepository;

    public List<ReviewDto> getReviewByPlace(String posX, String posY) {
        // 장소 찾은 후
        Place place = placeRepository.findByPosXAndPosY(posX,posY).get();
        // 해당 장소에 해당하는 리뷰들 조회
        List<Review> reviewByPlace = reviewRepository.findByPlace(place);
        List<ReviewDto> reviewDtos =new ArrayList<>();
        for(Review review:reviewByPlace){
            // 리뷰에 저장된 이미지들의 파일 경로 리스트에 모두 저장 후
            List<String> filePathList = getFilePathList(review.getUploadImages());
            // dto로 반환
            ReviewDto reviewDto = ReviewDto.of(review, filePathList);
            reviewDtos.add(reviewDto);
        }
        return reviewDtos;
    }
}

 

PlaceService

이전에 구현했던 PlaceService에 getAllPlace 함수를 추가하였다. member을 파라미터로 받는 경우 해당 멤버가 특정 장소에 좋아요를 눌렀는지 확인 후 좋아요를 누른 장소이면 checkLike를 true로 변경함으로서 좋아요를 누름을 표시했다.

member을 파라미터로 받지 않으면 좋아요를 눌렀는지 확인하지 않고 모든 장소를 반환한다.

@Service
@RequiredArgsConstructor
public class PlaceService {
	// 특정 회원이 좋아요를 누른 장소의 마커 색깔을 다르게 하기 위해
    public List<PlaceDto> getAllPlace(Member member){
        List<Place> places = placeRepository.findAll();
        //System.out.println(places.size());
        List<PlaceDto> placeDtoList = new ArrayList<>();
        for(Place place:places){
            PlaceDto placeDto = PlaceDto.of(place);
            if(likeService.checkLike(member.getEmail(), place)){
                placeDto.setCheckLike(true);
            }
            placeDtoList.add(placeDto);
        }
        return placeDtoList;
    }

    // 리뷰가 작성된 모든 장소 반환
    public List<PlaceDto> getAllPlace(){
        List<Place> places = placeRepository.findAll();
        List<PlaceDto> placeDtoList = new ArrayList<>();
        for(Place place:places){
            PlaceDto placeDto = PlaceDto.of(place);
            placeDtoList.add(placeDto);
        }
        return placeDtoList;
    }

}

 

3. controller

HomeController

메인 페이지에 모든 맛집 리스트를 볼 수 있는 지도를 띄우기 위해 모든 맛집 리스트를 받아온다.

로그인을 한 상태이면 getAllPlace함수에 member을 파라미터로 넘긴다.

@Controller
@RequiredArgsConstructor
public class HomeController {
    private final HttpSession httpSession;
    private final MemberRepository memberRepository;
    private final PlaceService placeService;
    @GetMapping(value={"","/"})
    public String getAllReviews(Model model){
        SessionUser user = (SessionUser) httpSession.getAttribute("user");
        List<PlaceDto> placeDtoList;
        if(user!=null){
            Member member = memberRepository.findByEmail(user.getEmail()).get();
            placeDtoList = placeService.getAllPlace(member);
        }else{
            placeDtoList = placeService.getAllPlace();
        }
        model.addAttribute("placeDtoList",placeDtoList);
        return "reviews/reviewList";
    }
}

 

ReviewController

전체 맛집이 표시된 지도에서 특정 마커 클릭시 마커가 가리키는 장소에 작성된 모든 리뷰 리스트 반환하는 uri

@Controller
@RequiredArgsConstructor
@RequestMapping("/reviews")
public class ReviewController {
    @GetMapping("/byPlace")
    public ResponseEntity<List<ReviewDto>> getReviewByPlace(@RequestParam("posX") String posX,
                                                        @RequestParam("posY") String posY){
        List<ReviewDto> reviewDtos = reviewService.getReviewByPlace(posX, posY);
        return ResponseEntity.ok(reviewDtos);
    }
}