Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ subprojects {
}

dependencies {
api 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

Expand Down
13 changes: 13 additions & 0 deletions order/order-api/http/주문.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#### 주문 조회
GET http://localhost:8080/api/v1/orders

#### 주문 조회
GET http://localhost:8080/api/v2/orders

#### SIMPLE 주문 조회
GET http://localhost:8080/api/simple-orders
Accept: application/json

#### SIMPLE 주문 조회 v2
GET http://localhost:8080/api/v2/simple-orders
Accept: application/json
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package io.lovethefel.springboot.order;

import io.dodn.springboot.storage.db.order.entity.*;
import io.dodn.springboot.storage.db.order.entity.item.Book;
import jakarta.annotation.PostConstruct;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
* 종 주문 2개 * userA * JPA1 BOOK * JPA2 BOOK * userB * SPRING1 BOOK * SPRING2 BOOK
*/
@Component
@RequiredArgsConstructor
public class InitDb {

private final InitService initService;

@PostConstruct
public void init() {

initService.dbInit1();
initService.dbInit2();
}

@Component
@Transactional
@RequiredArgsConstructor
static class InitService {

private final EntityManager em;

public void dbInit1() {

Member member = createMember("이", "자바", "서울", "1", "1111");
em.persist(member);

Book book1 = createBook("JPA1 BOOK", 10000, 100);
em.persist(book1);

Book book2 = createBook("JPA2 BOOK", 20000, 100);
em.persist(book2);

OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2);

Delivery delivery = createDelivery(member);
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
em.persist(order);
}

public void dbInit2() {

Member member = createMember("이", "자바", "진주", "2", "2222");
em.persist(member);

Book book1 = createBook("SPRING1 BOOK", 20000, 200);
em.persist(book1);

Book book2 = createBook("SPRING2 BOOK", 40000, 300);
em.persist(book2);

OrderItem orderItem1 = OrderItem.createOrderItem(book1, 20000, 3);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 40000, 4);

Delivery delivery = createDelivery(member);
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
em.persist(order);
}

private Member createMember(String nameOfFirst, String nameOfLast, String city, String street, String zipcode) {

return Member.of(nameOfFirst, nameOfLast, new Address(city, street, zipcode));
}

private Book createBook(String name, int price, int stockQuantity) {

Book book1 = new Book();
book1.setName(name);
book1.setPrice(price);
book1.setStockQuantity(stockQuantity);
return book1;
}

private Delivery createDelivery(Member member) {

Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
return delivery;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@ConfigurationPropertiesScan
@SpringBootApplication
@EntityScan( basePackages = {"io.dodn.springboot.storage.db.order.entity"} )
@EnableJpaRepositories(basePackages = "io.dodn.springboot.storage.db.order.repository")
public class OrderApiApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package io.lovethefel.springboot.order.api.v1.aplication;

import io.dodn.springboot.storage.db.order.entity.Order;
import io.dodn.springboot.storage.db.order.repository.OrderRepository;
import io.dodn.springboot.storage.db.order.repository.dto.OrderSimpleQueryDto;
import io.lovethefel.springboot.order.api.v1.aplication.response.OrderResponse;
import io.lovethefel.springboot.order.api.v1.aplication.response.SimpleOrderResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class OrderApiService {

private final OrderRepository orderRepository;

public List<SimpleOrderResponse> simpleOrders() {

final List<Order> orders = orderRepository.findAllWithMemberDelivery();
return orders.stream()
.map(SimpleOrderResponse::from)
.toList();
}

public List<SimpleOrderResponse> simpleOrdersV2() {

final List<OrderSimpleQueryDto> orderDtos = orderRepository.findOrderDtos();
return orderDtos.stream().map(SimpleOrderResponse::from).toList();
}

public List<OrderResponse> orders() {

final List<Order> orders = orderRepository.findAllWithMemberDelivery();
return orders.stream()
.map(OrderResponse::from)
.toList();
}

public List<OrderResponse> ordersV2() {

final List<Order> orders = orderRepository.finaAllWithItem();
return orders.stream()
.map(OrderResponse::from)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.lovethefel.springboot.order.api.v1.aplication.response;

import io.dodn.springboot.storage.db.order.entity.OrderItem;

public record OrderItemResponse(

String itemName,
int orderPrice,
int count
) {

public static OrderItemResponse from(final OrderItem orderItem) {

return new OrderItemResponse(orderItem.getItem().getName(), orderItem.getOrderPrice(), orderItem.getCount());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.lovethefel.springboot.order.api.v1.aplication.response;

import io.dodn.springboot.storage.db.order.entity.Address;
import io.dodn.springboot.storage.db.order.entity.Order;
import io.dodn.springboot.storage.db.order.entity.OrderStatus;
import java.time.LocalDateTime;
import java.util.List;

public record OrderResponse(

Long orderId,
String name,
LocalDateTime orderDate,
OrderStatus orderStatus,
Address address,
List<OrderItemResponse> orderItems
) {
public static OrderResponse from(final Order order) {

final List<OrderItemResponse> orderItems = order.getOrderItems().stream()
.map(OrderItemResponse::from)
.toList();

return new OrderResponse(order.getId(), order.getMember().getFullName(), order.getOrderDate()
, order.getStatus(), order.getDelivery().getAddress(), orderItems);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.lovethefel.springboot.order.api.v1.aplication.response;

import io.dodn.springboot.storage.db.order.entity.Address;
import io.dodn.springboot.storage.db.order.entity.Order;
import io.dodn.springboot.storage.db.order.entity.OrderStatus;
import io.dodn.springboot.storage.db.order.repository.dto.OrderSimpleQueryDto;

import java.time.LocalDateTime;

public record SimpleOrderResponse(

Long orderId,
String name,
LocalDateTime orderDate,
OrderStatus orderStatus,
Address address
) {
public static SimpleOrderResponse from(final Order order) {

return new SimpleOrderResponse(order.getId(), order.getMember().getFullName(), order.getOrderDate(),
order.getStatus(), order.getDelivery().getAddress());
}

public static SimpleOrderResponse from(final OrderSimpleQueryDto dto) {

return new SimpleOrderResponse(dto.getOrderId(), dto.getName().getFullName(), dto.getOrderDate(),
dto.getOrderStatus(), dto.getAddress());
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package io.lovethefel.springboot.order.api.v1.controller;

import io.lovethefel.springboot.order.api.v1.aplication.OrderApiService;
import io.lovethefel.springboot.order.api.v1.aplication.response.OrderResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class OrderApiController {

private final OrderApiService orderApiService;

@GetMapping("/api/v1/orders")
public ResponseEntity<List<OrderResponse>> ordersV1() {

final List<OrderResponse> orders = orderApiService.orders();
return ResponseEntity.ok(orders);
}

@GetMapping("/api/v2/orders")
public ResponseEntity<List<OrderResponse>> ordersV2() {

final List<OrderResponse> orders = orderApiService.ordersV2();
return ResponseEntity.ok(orders);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.lovethefel.springboot.order.api.v1.controller;

import io.lovethefel.springboot.order.api.v1.aplication.OrderApiService;
import io.lovethefel.springboot.order.api.v1.aplication.response.SimpleOrderResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class OrderSimpleApiController {

private final OrderApiService orderApiService;

/**
* entity 조회 -> Response 변환
* @return SimpleOrderResponse
*/
@GetMapping("/api/simple-orders")
public List<SimpleOrderResponse> orders() {

return orderApiService.simpleOrders();
}

/**
* Query Dto 조회 -> Response 변환
* SELECT 절에서 원하는 데이터를 직접 선택하므로 DB -> 애플리케이션 네트웤 용량 최적화(생각보다 미비하다?)
* 해당 쿼리는 재사용성 떨어짐, API 스펙에 맞춘 코드
* @return SimpleOrderResponse
*/
@GetMapping("/api/v2/simple-orders")
public List<SimpleOrderResponse> ordersV2() {

return orderApiService.simpleOrdersV2();
}

}
39 changes: 38 additions & 1 deletion order/order-api/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,40 @@
spring.application.name: order-api
spring.profiles.active: local

spring:
config:
import:
- monitoring.yml
- logging.yml
- db-order.yml
mvc.throw-exception-if-no-handler-found: true
web.resources.add-mappings: false

server:
tomcat:
max-connections: 20000
threads:
max: 600
min-spare: 100

---
spring.config.activate.on-profile: local

logging:
level:
io.dodn.springboot.order: debug
io.dodn.springboot.order: debug

---
spring.config.activate.on-profile: local-dev


---
spring.config.activate.on-profile: dev


---
spring.config.activate.on-profile: staging


---
spring.config.activate.on-profile: live
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.dodn.springboot.storage.db.member.core.BaseEntity;
import io.dodn.springboot.storage.db.order.Order;
import io.dodn.springboot.storage.db.order.entity.Order;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.OneToMany;
Expand Down
Loading