1. 목표🎯
/item/{itemId}로 접근했을 때, itemId에 해당하는 물품의 정보를 불러오고자 한다.
response에는 물품 번호(itemId), 물품 대여 상태(itemStatus), 물품 별점(itemReiview) 총 3개의 정보를 포함한다.
2. 기능 명세서📜
Name | Method | URI | Domain | AuthZ |
(특정) 물품 정보 조회 | GET | /item/{itemId} | item | MEMBER |
3. 코드 작성💻
3.1 ItemController
@RestController
@RequestMapping("/item")
@RequiredArgsConstructor
public class ItemController {
private final ItemService itemService;
// 특정 물품 정보 조회
@PreAuthorize("hasRole('ADMIN') or hasRole('MEMBER')")
@GetMapping("/{itemId}")
public ItemDetailResponse getItemDetail(@PathVariable Long itemId){
Item item = itemService.getItemById(itemId);
return ItemDetailResponse.from(item);
}
}
- 관리자와 학생 모두 가능하도록 했다.
3.2 ItemService
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class ItemService {
private final ItemRepository itemRepository;
/**
* 특정 물품 조회
*/
public Item getItemById(Long itemId) {
return itemRepository.findById(itemId)
.orElseThrow(()->new CustomException(ITEM_NOT_FOUND));
}
}
- 먼저 itemId에 해당하는 물품이 존재하는지 검사한다.
- 없을 경우 ITEM_NOT_FOUND라는 커스텀 예외를 발생시킴. 상태코드는 404(Not Found)로 정의해뒀다
// 404 NOT_FOUND
ITEM_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 물품입니다."),
3.3 ItemDetailResponse
package mango.rentalsystem.domain.item.dto.response;
import mango.rentalsystem.domain.item.domain.Item;
import mango.rentalsystem.domain.item.domain.ItemStatus;
public record ItemDetailResponse (
Long itemId,
ItemStatus itemStatus,
Double itemReview
){
public static ItemDetailResponse from (Item item) {
return new ItemDetailResponse(
item.getId(),
item.getItemStatus(),
item.getItemReview()
);
}
}
4. 결과
카테고리 조회 기능과 로직이 똑같아서 쉽게 구현할 수 있었다!
근데 티스토리 글 미리미리 써둘 껄...
이때까지 작업한 category/customException부분도 글 쓰고 싶은데, 그럼 티스토리에 개발 순서가 뒤죽박죽이 되어버린닼큐ㅠ
'PROJECT > GDSC 프로젝트 트랙 : 물품 대여 서비스' 카테고리의 다른 글
[UXUI] 이젠 멀리서도 간편하게, 물품 대여 서비스 '와우대여' (5) | 2024.08.17 |
---|---|
[SpringBoot] 특정 카테고리 정보 조회 API 구현 (0) | 2024.08.14 |
[SpringBoot] 물품 추가 API 구현 (0) | 2024.08.13 |
[SpringBoot] 특정 카테고리 삭제 API 구현 (0) | 2024.08.13 |