반응형
[TIL]TDD스터디_Test 메소드 접근제어자(Public) & Record 클래스 타입
[TIL]JAVA사전스터디_연산자, 조건문, 반복문, 배열, 컬렉션[TIL]JAVA사전스터디_기본형 변수, 참조형 변수, 형변환📌 자바 개발 환경JRE(Java Runtime Environment): 자바 실행 환경으로 JRE(JVM)만 있다면 Java
success-notes.tistory.com
해당 포스트는 "실전!스프링부트 상품 주문API 개발로 알아보는 TDD" 강의를 수강하여 작성한 글입니다.
📌오늘 얻은 지식
[ JPA 설정 ]
Spring Boot에서 jpa의 작동 코드를 콘솔에서 확인하고자 할 때, application.properties에 show_sql과 format_sql 설정을 해주면 데이터베이스에 적용된 sql문을 확인할 수 있다.
application.properties
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
console 결과 예시
Hibernate:
insert
into
products
(discount_policy, name, price, id)
values
(?, ?, ?, default)
👩🏻💻 코드 작성
public class OrderServiceTest {
private OrderService orderService;
private OrderPort orderPort;
private OrderRepository orderRepository;
@BeforeEach
void setUp() {
orderRepository = new OrderRepository();
orderPort = new OrderPort(){
@Override
public Product getProductById(Long productId) {
return new Product("상품명",1000, DiscountPolicy.NONE);
}
@Override
public void save(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(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;
public OrderAdapter(ProductRepository productRepository, 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 final Product product;
private final int quantity;
private Long id;
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 sequence =0L;
public void save(final Order order) {
order.assignId(++sequence);
persistence.put(order.getId(), order);
}
}
private interface OrderPort {
Product getProductById(final Long productId);
void save(final Order order);
}
}
반응형
'개발 > TIL' 카테고리의 다른 글
[TIL][VSCode] html 확장자 인식 안됨 - html ➡️Django (0) | 2024.05.21 |
---|---|
[TIL]방법론 스터디_TDD 테스트 예제 & [failed to load applicationcontext] 에러 & [Error creating bean with name] 에러 (0) | 2024.05.20 |
[TIL]TDD스터디_Test 메소드 접근제어자(Public) & Record 클래스 타입 (0) | 2024.05.14 |
[TIL]JAVA사전스터디_연산자, 조건문, 반복문, 배열, 컬렉션 (0) | 2024.05.08 |
[TIL]JAVA사전스터디_기본형 변수, 참조형 변수, 형변환 (0) | 2024.05.08 |