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> {
}
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;
}![](https://velog.velcdn.com/images/qmffndoden/post/dbb7109d-bc1c-4812-836a-59a7a2965eeb/image.png)
정보에 감사드립니다.