โณ๏ธ ์ฅ๋ฐ๊ตฌ๋ ๊ตฌํ
๐ ํ๋ชฉ ์ถ๊ฐ
1๏ธโฃ ์กฐ๊ฑด ํ์ธ
โณ๏ธ API : GET /cart/add/{productId}
โณ๏ธ ์๊ตฌ์ฌํญ
โ๏ธ ์ํ์ด ๊ณง ๋์์ด๋ค.
โ๏ธ ๋์๋ฅผ ์ฅ๋ฐ๊ตฌ๋์ ๋ด์ ์ ์๋ค.
2๏ธโฃ ์ฅ๋ฐ๊ตฌ๋ Entity ์ถ๊ฐ ๋ฐ ์ปฌ๋ผ๋ณ ๊ด๊ณ ์ ์ (๊ธฐ๋ณธ ๊ตฌํ)

โก๏ธ Member(ํ์) ๊ฐ ์กด์ฌํด์ผ Product(์ํ) ์ด ์กด์ฌํ๊ณ , ๋์ด ์กด์ฌํด์ผ CartItem(์ฅ๋ฐ๊ตฌ๋ ํผ๋ชฉ) ์ด ์กด์ฌํ ์ ์๋ค.
โ CartItem Entity ์์ฑ
@Entity
@Getter
@SuperBuilder
@ToString(callSuper = true)
@NoArgsConstructor(access = PROTECTED)
public class CartItem extends BaseEntity {
@ManyToOne
private Member member;
@ManyToOne
private Product product;
private Long index_unique;
public CartItem (Member member, Product product) {
this.member = member;
this.product = product;
this.index_unique = Long.parseLong("%d%d".formatted(member.getId(), product.getId()));
}
}

โก๏ธ ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ด ๋ด๊ธฐ๋ฉด, Member ๋ ๊ทธ ๋ฆฌ์คํธ๋ฅผ ์๊ณ ์์ด์ผํจ. ์ฅ๋ฐ๊ตฌ๋ ๋ฆฌ์คํ ๊ตฌํ ๋ ์๊ฐํ๊ณ ์์ (ํ๋ชฉ ๋ฆฌ์คํธ์ 2๏ธโฃ-โก)
โก๏ธ ํ์์ด ๊ฐ์ ์ํ์ ๋๋ฒ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๋ ๊ฒฝ์ฐ์ ์์ธ ์ฒ๋ฆฌ (๐ ๋ฆฌํฉํ ๋ง ํ์)
โก addCart ๋ก์ง ์์ฑ
@Controller
@RequiredArgsConstructor
@RequestMapping("/cart")
public class CartController {
// (์๋ต)
@PreAuthorize("isAuthenticated()")
@PostMapping("/add/{productId}")
public String addCart (@PathVariable Long productId, Principal principal) {
Member member = memberService.findByUsername(principal.getName()).orElse(null);
if (member == null) {
throw new NotFoundException();
}
Product product = productService.findById(productId).orElse(null);
if (product == null) {
throw new NotFoundException();
}
cartService.addCart(member, product);
return "redirect:/";
}
}
@Service
@RequiredArgsConstructor
public class CartService {
private CartRepository cartRepository;
public void addCart(Member member, Product product) {
CartItem cartItem = new CartItem(member, product);
cartRepository.save(cartItem);
}
}
โข Test Case ์์ฑ (CartServiceTests)
@SpringBootTest
@Transactional
@ActiveProfiles("test")
public class CartServiceTests {
// (์๋ต)
@Test
@DisplayName("์ํ ์ถ๊ฐ")
void t1 () {
Member member = memberService.findByUsername("user1").get();
Product product = productService.findById(3L).get();
CartItem cartItem = cartService.addCart(member, product);
assertThat(cartItem.getId()).isEqualTo(3L);
assertThat(cartItem.getMember()).isEqualTo(member);
assertThat(cartItem.getProduct()).isEqualTo(product);
}
}
โก๏ธ ๊ฐ์ฌ๋์ Rq.getId ์จ๋ ์ข์ ๋ฏ

โฃ DevInitData ์ CartItem ๋ ์ถ๊ฐ
@Configuration
@Profile({"dev", "test"})
public class NotProdInitData {
private boolean initDataDone = false;
@Bean
CommandLineRunner initData(
MemberService memberService,
PostService postService,
ProductService productService,
CartService cartService
) {
return args -> {
// (์๋ต)
CartItem cartItem1 = cartService.addCart(member2, product3);
CartItem cartItem2 = cartService.addCart(member1, product2);
};
}
}
โค ์ค์ ์๋ ํ์ธ
<!-- ์ฐ๊ฒฐ -->
<a th:href="@{|/cart/add/${product.id}|}" methods="POST" class="btn btn-sm">
<i class="fa-solid fa-cart-plus"></i>
<span class="ml-2">์ฅ๋ฐ๊ตฌ๋</span>
</a>

๐ ํ๋ชฉ ๋ฆฌ์คํธ
1๏ธโฃ ์กฐ๊ฑด ํ์ธ
โณ๏ธ API : GET /cart/list
โณ๏ธ ์๊ตฌ์ฌํญ
โ๏ธ ์ฅ๋ฐ๊ตฌ๋์์ ๋์๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
2๏ธโฃ ๊ธฐ๋ณธ ๊ตฌํ
โ UI ์ถ๊ฐ

โก ๊ธฐ๋ณธ ๊ตฌํ
public class CartController {
// (์๋ต)
@PreAuthorize("isAuthenticated()")
@GetMapping("/list")
public String showCartItemList(Model model) {
List<CartItem> cartItemsList = cartService.findAllByMemberId(rq.getId());
model.addAttribute("cartItemsList", cartItemsList);
return "cart_list";
}
}
public class CartService {
// (์๋ต)
public List<CartItem> findAllByMemberId(long id) {
return cartRepository.findAllByMemberId(id);
}
}
โข Test Case ์์ฑ (CartServiceTests)
@Test
@DisplayName("์ํ ๋ชฉ๋ก ํ์ธ")
void t2() {
List<CartItem> cartItemList = cartService.findAllByMemberId(2L);
assertThat(cartItemList.size()).isEqualTo(1);
assertThat(cartItemList.get(0).getIndex_unique()).isEqualTo(23);
}

โฃ ์ค์ ์๋ ํ์ธ


'LikeLion_Final_Project ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [2์ฃผ์ฐจ] Mission ํด๊ฒฐ ์ผ์ง (2) (0) | 2022.10.26 |
|---|---|
| [1์ฃผ์ฐจ] ํผ์ด ๋ฆฌ๋ทฐ ์ผ์ง (0) | 2022.10.20 |
| [1์ฃผ์ฐจ] Mission ํด๊ฒฐ ์ผ์ง (0) | 2022.10.19 |
| [0์ฃผ์ฐจ] ํ๋ก์ ํธ ๊ฐ์ (0) | 2022.10.17 |