Mini 프로젝트 - review

박경희·2023년 8월 4일
0

프로젝트

목록 보기
4/16

review

Entity

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class Review {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long reviewId;

    @ManyToOne
    @JoinColumn(name = "hotel_id")
    private Hotel hotel;

    private String guestName;
    private Double rating;
    private String comment;
    private LocalDateTime createdAt;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

Repository

public interface ReviewRepository extends JpaRepository<Review, Long> {

//    Page<Review> findAllBy(Pageable pageable);
}
  • 왜 주석이 달렸을까~~~?

Service

public interface ReviewService {

    void save(ReviewRequest request);
    ReviewResponse changeDate(Long id, ReviewRequest request);
    void deleteById(Long id);
    Review findById(Long id);
    Page<ReviewResponse> findAll(Pageable pageable);
}

ServiceImpl

@Service
@RequiredArgsConstructor
@Transactional
public class ReviewServiceImpl implements ReviewService {

    private final ReviewRepository reviewRepository;
    private final HotelRepository hotelRepository;
    private final UserRepository userRepository;

    @Override
    public void save(ReviewRequest request) {
        User user = userRepository.findById(request.getUserId())
                .orElseThrow(()-> new RuntimeException("User not found"));

        Hotel hotel = hotelRepository.findById(request.getHotelId())
                .orElseThrow(()-> new RuntimeException("Hotel not found"));

        Review review = Review.builder()
                .hotel(hotel)
                .guestName(request.getGuestName())
                .rating(request.getRating())
                .comment(request.getComment())
                .createdAt(LocalDateTime.now()) 
                .user(user)
                .build();

        reviewRepository.save(review);
    }

    @Override
    public Review findById(Long id) {
        Optional<Review> byId = reviewRepository.findById(id);
        return byId.orElseThrow(()-> new RuntimeException("없는 review입니다."));
    }

    @Override
    public Page<ReviewResponse> findAll(Pageable pageable) {
        Page<Review> allBy = reviewRepository.findAll(pageable);
        return allBy.map(r-> new ReviewResponse(r));
    }

    @Override
    public ReviewResponse changeDate(Long id, ReviewRequest request) {
        Optional<Review> byId = reviewRepository.findById(id);
        if (byId.isEmpty()) throw new RuntimeException("게시물이 없습니다.");

        User user = userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
        Hotel hotel = hotelRepository.findById(id).orElseThrow(() -> new RuntimeException("Hotel not found"));

        Review review = new Review(id, hotel, request.getGuestName(), request.getRating(),
                request.getComment(), request.getCreatedAt(), user);
        Review save = reviewRepository.save(review);
        return new ReviewResponse(save);
    }

    @Override
    public void deleteById(Long id) {
        reviewRepository.deleteById(id);
    }
}
  • service를 인터페이스로 만들고 lmpl을 사용하는 습관을 들이는게 좋다고 해서 review는 lmpl을 만들었다.

Controller

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/reviews")
public class ReviewController {
    private final ReviewService reviewService;

    @PostMapping
    public void insert(@RequestBody ReviewRequest request) {
        reviewService.save(request);
    }

    @GetMapping("{id}")
    public Review getById(@PathVariable("id") Long id) {
        return reviewService.findById(id);
    }

    @GetMapping
    public Page<ReviewResponse> findAll(@RequestParam(name = "size", required = false, defaultValue = "10") Integer size,
                                          @RequestParam(name = "page", required = false, defaultValue = "0") Integer page) {
        PageRequest request = PageRequest.of(page, size);
        return reviewService.findAll(request);
    }

    @PutMapping("{id}")
    public void changeData(@PathVariable("id") Long id,
                           @RequestBody ReviewRequest request) {
        reviewService.changeDate(id, request);
    }

    @DeleteMapping("{id}")
    public void deleteById(@PathVariable("id") Long id) {
        reviewService.deleteById(id);
    }
}

Response

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class ReviewResponse {
    private Hotel hotelName;
    private String guestName;
    private Double rating;
    private String comment;
    private LocalDateTime createdAt;

    public ReviewResponse(Review review) {
        this.hotelName = review.getHotel();
        this.guestName = review.getGuestName();
        this.rating = review.getRating();
        this.comment = review.getComment();
        this.createdAt = review.getCreatedAt();
    }
}

Request

@Getter
@AllArgsConstructor
public class ReviewRequest {
    private Long hotelId;
    private String guestName;
    private Double rating;
    private String comment;
    private LocalDateTime createdAt;
    private Long userId;

   /* public Review toEntity() {
        createdAt = LocalDateTime.now();
        return Review.builder()
                .hotel(new Hotel(hotelId,null,null,null,null,null,null,null,null,null,null,null,null,null,null))
                .guestName(guestName)
                .rating(rating)
                .comment(comment)
                .createdAt(createdAt)
                .user(userId)
                .build();
    }*/
}![](https://velog.velcdn.com/images/qmffndoden/post/dbb7109d-bc1c-4812-836a-59a7a2965eeb/image.png)

1개의 댓글

comment-user-thumbnail
2023년 8월 4일

정보에 감사드립니다.

답글 달기

관련 채용 정보