본문 바로가기
개발/TIL

[TIL]방법론스터디_주문요청 API & JPA console 설정

by 반비🥰 2024. 5. 16.
반응형
 

[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);
    }
}

 

반응형