V-RIS 개발일지 (10) 내가 작성한 리뷰 조회 구현

KHJ·2022년 5월 11일
0

V-RIS 개발일지

목록 보기
10/15

마이페이지에서 내가 그동안 작성한 리뷰들을 조회할 수 있는 내 리뷰 조회 api를 구현했다.

구현 방법

  1. 특정 유저가 작성한 리뷰를 보기 위해 유저의 userIdx 값과 Review 테이블의 userIdx의 값이 같은 데이터들을 가져온다.
  2. Review 테이블에 저장된 restaurantIdx 값으로 restaurnat 테이블에서 식당 이름을 가져온다.
  3. Review 테이블에서 작성한 리뷰가 어떤 것인지 리뷰 카테고리를 가져올 예정이다.


Review.java

@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;
}

ReviewNotFoundException.java

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ReviewNotFoundException extends RuntimeException{
    public ReviewNotFoundException(String message){
        super(message);
    }
}

Repository에서는 @Query를 이용해 직접 쿼리문을 생성했다.

처음에는 반환되는 음식점 이름과 리뷰 내용을 어떤 형식으로 반환해야 되는지 몰라 Object[]로 반환했는데, 실행 결과는 똑같지만 그래도 클래스나 인터페이스에 담아 반환하면 좋을 것 같아 관련 내용을 찾아봤다.



@Query로 특정 컬럼만 추출하기 (Object[] 이용)

제일 처음 작성한 방식이다.
Object[] 로 반환했다.

ReviewRepository.java

@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);
}

ReviewJpaController.java

@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;

    }
}



@Query로 특정 컬럼만 추출하기 (클래스 이용)

그 다음으로 수정한 방식이다. Object 대신 식당이름과 리뷰만 가지고 있는 클래스를 하나 생성하고, 클래스에 담아 반환했다.

주의할 점은 @Query에 클래스의 위치를 정확하게 나타내 줘야 한다.

MyReview.java

// 식당 이름과 리뷰 내용만 가지고 있는 클래스 새로 생성
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyReview {
    private String resName;
    private Integer reviewCategory;
}

ReviewRepository.java

@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);
}

ReviewJpaController.java

@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;

    }
}


@Query로 특정 컬럼만 추출하기 (인터페이스 이용)

클래스를 이용하기 위해 찾다보니 인터페이스를 이용할 수도 있다고 한다.

직접 해보진 않아 참고한 글들을 첨부한다.

https://velog.io/@seongwon97/Spring-Boot-Query

https://algorithmstudy-mju.tistory.com/153


실행결과

새로 생성한 클래스에 담겨 반환되는 것을 확인할 수 있다.

0개의 댓글