마이페이지에서 내가 그동안 작성한 리뷰들을 조회할 수 있는 내 리뷰 조회 api를 구현했다.
@Data
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name="review")
public class Review {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer reviewIdx;
private Integer userIdx;
private Integer resIdx;
private Integer reviewCategory;
}
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ReviewNotFoundException extends RuntimeException{
public ReviewNotFoundException(String message){
super(message);
}
}
처음에는 반환되는 음식점 이름과 리뷰 내용을 어떤 형식으로 반환해야 되는지 몰라 Object[]로 반환했는데, 실행 결과는 똑같지만 그래도 클래스나 인터페이스에 담아 반환하면 좋을 것 같아 관련 내용을 찾아봤다.
제일 처음 작성한 방식이다.
Object[] 로 반환했다.
@Repository
public interface ReviewRepository extends JpaRepository<Review, Integer> {
@Query(value = "Select res.resName, rev.reviewCategory From restaurant res, review rev where rev.resIdx=res.resIdx and rev.userIdx= :userIdx")
List<Object[]> findByUserIdx(@Param("userIdx") Integer userIdx);
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/v1/vegan-res")
public class ReviewJpaController {
@Autowired
private ReviewRepository reviewRepository;
// 최근 나의 리뷰 조회
@GetMapping("/{userIdx}/myReview")
public List<Object[]> checkMyReview(@PathVariable int userIdx){
List<Object[]> reviews=reviewRepository.findByUserIdx(userIdx);
if(reviews.isEmpty()){
throw new ReviewNotFoundException(String.format("작성한 리뷰가 없습니다."));
}
return reviews;
}
}
그 다음으로 수정한 방식이다. Object 대신 식당이름과 리뷰만 가지고 있는 클래스를 하나 생성하고, 클래스에 담아 반환했다.
주의할 점은 @Query에 클래스의 위치를 정확하게 나타내 줘야 한다.
// 식당 이름과 리뷰 내용만 가지고 있는 클래스 새로 생성
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyReview {
private String resName;
private Integer reviewCategory;
}
@Repository
public interface ReviewRepository extends JpaRepository<Review, Integer> {
// select 이후 new 와 함께 MyReview 클래스의 위치 정확하게 명시하기
@Query(value = "Select new team.togizi.cukvris.review.MyReview(res.resName, rev.reviewCategory) From restaurant res, review rev where rev.resIdx=res.resIdx and rev.userIdx= :userIdx")
List<MyReview> findByUserIdx(@Param("userIdx") Integer userIdx);
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/v1/vegan-res")
public class ReviewJpaController {
@Autowired
private ReviewRepository reviewRepository;
// 최근 나의 리뷰 조회
@GetMapping("/{userIdx}/myReview")
public List<MyReview> checkMyReview(@PathVariable int userIdx){
// Object[] 대신 MyReview
List<MyReview> reviews=reviewRepository.findByUserIdx(userIdx);
if(reviews.isEmpty()){
throw new ReviewNotFoundException(String.format("작성한 리뷰가 없습니다."));
}
return reviews;
}
}
클래스를 이용하기 위해 찾다보니 인터페이스를 이용할 수도 있다고 한다.
직접 해보진 않아 참고한 글들을 첨부한다.
https://velog.io/@seongwon97/Spring-Boot-Query
https://algorithmstudy-mju.tistory.com/153
새로 생성한 클래스에 담겨 반환되는 것을 확인할 수 있다.