Skip to content

Commit

Permalink
[Order API TDD] POJO 상품 주문 기능 구현하기
Browse files Browse the repository at this point in the history
  • Loading branch information
jihunparkme committed Feb 27, 2024
1 parent 8990a65 commit c697d1f
Show file tree
Hide file tree
Showing 5 changed files with 186 additions and 3 deletions.
58 changes: 58 additions & 0 deletions product-order-service/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,31 @@ final UpdateProductRequest request = new UpdateProductRequest(name, price, disco

> [POJO Test to SpringBoot Test]()
### API 테스트로 전환하기

> [API 테스트로 전환하기]()
## 상품 주문 기능 구현하기

**POJO**

**스프링부트 테스트로 전환하기**

**API 테스트로 전환하기**

**JPA 적용**

## 주문 결제 기능 구현하기

**POJO**

**스프링부트 테스트로 전환하기**


**API 테스트로 전환하기**

**JPA 적용**

---

Point.
Expand All @@ -119,6 +144,39 @@ Point.
- HttpStatus
- 200 OK
- 201 CREATE

---

Reference.

**intellij introduce variable final**
- Preference -> Editor -> Code Style -> Java -> Code Generation -> Final Modifier
- Make generated local variables final
- Make generated parameters final

**Live Templates**
- Preferences -> Editor -> Live Templates

**Inspections**
- Preferences -> Editor -> Inspections
- Local variable or parameter can be final

**extract variable final**
- option + command + v
- option + shift + O
- Declare final
- Declare var

**extract method final**
- option + command + m
- option + shift + O
- make static

**code vision usages**
- Preferences -> Editor -> Inlay Hints -> Java -> Code vision -> Show hints for
- Usages
- inheritors


---

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.example.productorderservice.product;

enum DiscountPolicy {
public enum DiscountPolicy {
NONE
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
@Table(name = "products")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
class Product {
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

import org.springframework.data.jpa.repository.JpaRepository;

interface ProductRepository extends JpaRepository<Product, Long> {
public interface ProductRepository extends JpaRepository<Product, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package com.example.productorderservice.order;

import com.example.productorderservice.product.DiscountPolicy;
import com.example.productorderservice.product.Product;
import com.example.productorderservice.product.ProductRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.util.Assert;

import java.util.HashMap;
import java.util.Map;

class OrderServiceTest {

private OrderService orderService;
private OrderPort orderPort;
private OrderRepository orderRepository;

@BeforeEach
void setUp() {
orderRepository = new OrderRepository();
orderPort = new OrderPort() {
@Override
public Product getProductById(final long productId) {
return new Product("상품명", 1000, DiscountPolicy.NONE);
}

@Override
public void save(final Order order) {
orderRepository.save(order);
}
};
orderService = new OrderService(orderPort);
}

@Test
void 상품주문() {
final long productId = 1L;
final int quantity = 2;
final CreateOrderRequest request = new CreateOrderRequest(productId, quantity);

orderService.createOrder(request);
}

private record CreateOrderRequest(long productId, int quantity) {
private CreateOrderRequest {
Assert.notNull(productId, "상품 ID는 필수입니다.");
Assert.isTrue(quantity > 0, "수량은 0보다 커야 합니다.");
}
}

private class OrderService {
private final OrderPort orderPort;

private OrderService(final OrderPort orderPort) {
this.orderPort = orderPort;
}

public void createOrder(final CreateOrderRequest request) {
final Product product = orderPort.getProductById(request.productId());

final Order order = new Order(product, request.quantity());

orderPort.save(order);
}
}

private class OrderAdapter implements OrderPort{

private final ProductRepository productRepository;
private final OrderRepository orderRepository;

private OrderAdapter(final ProductRepository productRepository, final OrderRepository orderRepository) {
this.productRepository = productRepository;
this.orderRepository = orderRepository;
}

@Override
public Product getProductById(final long productId) {
return productRepository.findById(productId)
.orElseThrow(() -> new IllegalArgumentException("상품이 존재하지 않습니다."));
}

@Override
public void save(final Order order) {
orderRepository.save(order);
}
}

private class Order {
private Long id;
private final Product product;
private final int quantity;

public Order(final Product product, final int quantity) {
Assert.notNull(product, "상품은 필수입니다.");
Assert.isTrue(quantity > 0, "수량은 0보다 커야 합니다.");
this.product = product;
this.quantity = quantity;
}

public void assignId(final Long id) {
this.id = id;
}

public Long getId() {
return id;
}
}

private class OrderRepository {
private Map<Long, Order> persistence = new HashMap<>();
private Long sequance = 0L;

public void save(final Order order) {
order.assignId(++sequance);
persistence.put(order.getId(), order);
}
}

private interface OrderPort {
Product getProductById(final long productId);
void save(final Order order);
}
}

0 comments on commit c697d1f

Please sign in to comment.