5์ฃผ์ฐจ
์นด์นด์ค ํ ํฌ ์บ ํผ์ค 2๋จ๊ณ - BE - 5์ฃผ์ฐจ ํด๋ก ๊ณผ์
๊ณผ์ ๋ช
1. ์ฝ๋ ๋ฆฌํฉํ ๋ง
๊ณผ์ ์ค๋ช
์นด์นด์ค ์ผํ ํ๋ก์ ํธ ์ ์ฒด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ค
- AOP๋ก ์ ํจ์ฑ๊ฒ์ฌ ์ ์ฉํ๊ธฐ
- GlobalExceptionHanlder ๊ตฌํํ๊ธฐ
- ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ -> ์์ธ ์ฒ๋ฆฌํ๊ธฐ
- ์ฅ๋ฐ๊ตฌ๋ ์์ (์ฃผ๋ฌธํ๊ธฐ) -> ์์ธ์ฒ๋ฆฌํ๊ธฐ
- ๊ฒฐ์ฌํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ (์ฅ๋ฐ๊ตฌ๋๊ฐ ๊ผญ ์ด๊ธฐํ ๋์ด์ผํจ)
- ์ฃผ๋ฌธ๊ฒฐ๊ณผ ํ์ธ ๊ธฐ๋ฅ ๊ตฌํ
๊ณผ์ ์์ธ : ์๊ฐ์๋ค์ด ๊ณผ์ ๋ฅผ ์งํํ ๋, ์ ๋ ํด์ผํ ๊ฒ
์๋ ํญ๋ชฉ์ ๋ฐ๋์ ํฌํจํ์ฌ ๊ณผ์ ์ํํด์ฃผ์ธ์!
AOP๊ฐ ์ ์ฉ๋์๋๊ฐ? โ๏ธ
GlobalExceptionHandler๊ฐ ์ ์ฉ๋์๋๊ฐ? โ๏ธ
์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ์ ๋ชจ๋ ์์ธ๊ฐ ์ฒ๋ฆฌ ์๋ฃ๋์๋๊ฐ? โ๏ธ
์ฅ๋ฐ๊ตฌ๋ ์์ ์ ๋ชจ๋ ์์ธ๊ฐ ์ฒ๋ฆฌ ์๋ฃ๋์๋๊ฐ? โ๏ธ
๊ฒฐ์ฌํ๊ธฐ์ ์ฃผ๋ฌธ๊ฒฐ๊ณผ ํ์ธ ์ฝ๋๊ฐ ์๋ฃ๋์๋๊ฐ?
1. ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ
List<Option> options = new ArrayList<>();
for (CartRequest.SaveDTO requestDTO : requestDTOs) {
int optionId = requestDTO.getOptionId();
int quantity = requestDTO.getQuantity();
// 1. ๋์ผํ ์ต์
์ด ๋ค์ด์ค๋ฉด ์์ธ์ฒ๋ฆฌ
// [ { optionId:1, quantity:5 }, { optionId:1, quantity:10 } ]
if(options.contains(optionId)) {
throw new Exception400("์ด๋ฏธ ์ฅ๋ฐ๊ตฌ๋์ ์กด์ฌํ๋ ์ํ์
๋๋ค. : " + optionId);
}
// ์ต์
์กฐํ ๋ฐ ์์ธ์ฒ๋ฆฌ
Option optionPS = optionJPARepository.findById(optionId).orElseThrow(()
-> new Exception404("ํด๋น ์ํ์ ์ฐพ์ ์ ์์ต๋๋ค : " + optionId));
int price = optionPS.getPrice() * quantity;
// 2. cartJPARepository.findByOptionIdAndUserId() ์กฐํ -> ์กด์ฌํ๋ฉด ์ฅ๋ฐ๊ตฌ๋์ ์๋์ ์ถ๊ฐํ๋ ์
๋ฐ์ดํธ๋ฅผ ํด์ผํจ. (๋ํฐ์ฒดํนํ๊ธฐ)
Optional<Cart> findExistingCart = cartJPARepository.findByOptionIdAndUserId(optionId, sessionUser.getId());
if(findExistingCart.isPresent()) {
Cart existingCart = findExistingCart.get();
existingCart.update(existingCart.getQuantity() + quantity, existingCart.getPrice() + price);
} else {
// 3. [2๋ฒ์ด ์๋๋ผ๋ฉด] ์ ์ ์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธฐ
Cart cart = Cart.builder().user(sessionUser).option(optionPS).quantity(quantity).price(price).build();
cartJPARepository.save(cart);
}
}
1) ๋์ผํ ์ต์ ์ด ๋ค์ด์์ ๋, options ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ํด๋น ์ต์ id๊ฐ ๋ฆฌ์คํธ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ 400 ์๋ฌ(badRequest)๋ฅผ ๋ฐ์์ํค๊ณ , ์ด๋ฏธ ์ฅ๋ฐ๊ตฌ๋์ ์กด์ฌํ๋ ์ํ์ด๋ผ๋ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
2) ์ต์ ์ ์กฐํํ๊ณ ํด๋น ์ต์ id๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ 404 ์๋ฌ(notFound)๋ฅผ ๋ฐ์ํ๋ค ํด๋น ์ํ์ ์ฐพ์ ์ ์๋ค๋ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
3) ๋ํ, JPA Repository๋ฅผ ํตํด ์์ฒญ์ด ๋ค์ด์จ option์ ์์ด๋๋ฅผ ์กฐํํ์ฌ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ ์๋๊ณผ ๊ฐ๊ฒฉ์ update์ํค๊ณ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์์ฑ์๋ฅผ ํตํด ์ฅ๋ฐ๊ตฌ๋์ ๋ด๋๋ค.
2. ์ฅ๋ฐ๊ตฌ๋ ์์
public CartResponse.UpdateDTO update(List<CartRequest.UpdateDTO> requestDTOs, User user) {
List<Cart> cartList = cartJPARepository.findAllByUserId(user.getId());
// 1. ์ ์ ์ฅ๋ฐ๊ตฌ๋์ ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ์์ธ์ฒ๋ฆฌ
if(cartList.isEmpty()) {
throw new Exception400("์ฅ๋ฐ๊ตฌ๋๊ฐ ๋น์ด์์ต๋๋ค.");
}
// 2. cartId:1, cartId:1 ์ด๋ ๊ฒ requestDTOs์ ๋์ผํ ์ฅ๋ฐ๊ตฌ๋ ์์ด๋๊ฐ ๋๋ฒ ๋ค์ด์ค๋ฉด ์์ธ์ฒ๋ฆฌ
List<Option> checkCartId = new ArrayList<>();
for(CartRequest.UpdateDTO updateDTO : requestDTOs) {
int cartId = updateDTO.getCartId();
if (checkCartId.contains(cartId)) {
throw new Exception400("๋์ผํ ์ํ์ด ์ค๋ณต์ผ๋ก ๋ด๊ฒจ์์ต๋๋ค : " + cartId);
}
// 3. ์ ์ ์ฅ๋ฐ๊ตฌ๋์ ์๋ cartId๊ฐ ๋ค์ด์ค๋ฉด ์์ธ์ฒ๋ฆฌ
if (cartList.stream().noneMatch(cart -> cart.getId() == updateDTO.getCartId())) {
throw new Exception404("์ ์ ์ ์ฅ๋ฐ๊ตฌ๋์ ์กด์ฌํ์ง ์๋ cartId์
๋๋ค : " + updateDTO.getCartId());
}
}
// ์์ 3๊ฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์๋ ํ๋ก๊ทธ๋จ์ ์๋์๊ฐ๋ค. ์๋ฅผ ๋ค์ด 1๋ฒ์ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด for๋ฌธ์ ๋์ง ์๊ณ , cartList๊ฐ ๋น๋ฐฐ์ด []๋ก ์ ์์๋ต์ด ๋๊ฐ.
return new CartResponse.UpdateDTO(cartList);
} // ๋ํฐ์ฒดํน
3. ๊ฒฐ์ ํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ -> ์ฅ๋ฐ๊ตฌ๋ ์ด๊ธฐํ
4. ์ฃผ๋ฌธ๊ฒฐ๊ณผ ํ์ธ ๊ธฐ๋ฅ ๊ตฌํ
'๐ช kakaotech campus' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์นด์นด์คํ ํฌ ์บ ํผ์ค | ์์ด๋์ดํค 2๋ฑ ํ๊ณ ๐ (0) | 2023.09.01 |
---|---|
์นดํ ์ผ | [STEP2 clone coding] 6์ฃผ์ฐจ ๊ณผ์ (๋ฐฐํฌ ์๋ฃ !!) (0) | 2023.08.04 |
์นดํ ์ผ | [STEP2 cloncoding] 4์ฃผ์ฐจ ๊ณผ์ - (2) (0) | 2023.07.20 |
์นดํ ์ผ | [STEP2 cloncoding] 4์ฃผ์ฐจ ๊ณผ์ - (1) (0) | 2023.07.19 |
์นดํ ์ผ | [STEP2 clone coding] 3์ฃผ์ฐจ ๊ณผ์ (0) | 2023.07.14 |