diff --git a/order-service/src/main/java/com/justpickup/orderservice/OrderServiceApplication.java b/order-service/src/main/java/com/justpickup/orderservice/OrderServiceApplication.java index c2d4642..698d9fd 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/OrderServiceApplication.java +++ b/order-service/src/main/java/com/justpickup/orderservice/OrderServiceApplication.java @@ -3,9 +3,11 @@ package com.justpickup.orderservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableEurekaClient +@EnableFeignClients public class OrderServiceApplication { public static void main(String[] args) { diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDto.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDto.java new file mode 100644 index 0000000..0e376b7 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/dto/OrderDto.java @@ -0,0 +1,86 @@ +package com.justpickup.orderservice.domain.order.dto; + +import com.justpickup.orderservice.domain.order.entity.Order; +import com.justpickup.orderservice.domain.order.entity.OrderStatus; +import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; +import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Getter @NoArgsConstructor +public class OrderDto { + private Long id; + + private Long userId; + + private String userName; + + private Long userCouponId; + + private Long orderPrice; + + private LocalDateTime orderTime; + + private Long usedPoint; + + private OrderStatus orderStatus; + + // private TransactionDto transactionDto; + + private List orderItemDtoList; + + @Builder + public OrderDto(Long id, Long userId, Long userCouponId, Long orderPrice, LocalDateTime orderTime, + Long usedPoint, OrderStatus orderStatus, List orderItemDtoList) { + this.id = id; + this.userId = userId; + this.userCouponId = userCouponId; + this.orderPrice = orderPrice; + this.orderTime = orderTime; + this.usedPoint = usedPoint; + this.orderStatus = orderStatus; + this.orderItemDtoList = orderItemDtoList; + } + + // == 생성 메소드 == // + public static OrderDto createPrimitiveField(Order order) { + return OrderDto.builder() + .id(order.getId()) + .userId(order.getUserId()) + .userCouponId(order.getUserCouponId()) + .orderPrice(order.getOrderPrice()) + .orderTime(order.getOrderTime()) + .usedPoint(order.getUsedPoint()) + .orderStatus(order.getOrderStatus()) + .build(); + } + + public static OrderDto createFullField(Order order) { + List orderItems = order.getOrderItems(); + List orderItemDtoList = orderItems.stream() + .map(OrderItemDto::createPrimitiveField) + .collect(Collectors.toList()); + + return OrderDto.builder() + .id(order.getId()) + .userId(order.getUserId()) + .userCouponId(order.getUserCouponId()) + .orderPrice(order.getOrderPrice()) + .orderTime(order.getOrderTime()) + .usedPoint(order.getUsedPoint()) + .orderStatus(order.getOrderStatus()) + .orderItemDtoList(orderItemDtoList) + .build(); + } + + + // == 변수 변경 메소드 == // + public void setUserName(String userName) { + this.userName = userName; + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java index 906b4b2..4d9547b 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/entity/Order.java @@ -1,5 +1,7 @@ package com.justpickup.orderservice.domain.order.entity; +import com.justpickup.orderservice.domain.order.dto.OrderDto; +import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; import com.justpickup.orderservice.domain.transaction.entity.Transaction; import com.justpickup.orderservice.global.entity.BaseEntity; @@ -10,6 +12,7 @@ import lombok.NoArgsConstructor; import javax.persistence.*; import java.time.LocalDateTime; import java.util.List; +import java.util.stream.Collectors; @Entity @Table(name = "orders") @@ -34,7 +37,7 @@ public class Order extends BaseEntity { @Enumerated(EnumType.STRING) private OrderStatus orderStatus; - @OneToOne(mappedBy = "order") + @OneToOne(mappedBy = "order", fetch = FetchType.LAZY) private Transaction transaction; @OneToMany(mappedBy = "order") diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepository.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepository.java new file mode 100644 index 0000000..e8159bd --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepository.java @@ -0,0 +1,8 @@ +package com.justpickup.orderservice.domain.order.repository; + +import com.justpickup.orderservice.domain.order.entity.Order; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { + +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java new file mode 100644 index 0000000..de4b027 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/repository/OrderRepositoryCustom.java @@ -0,0 +1,35 @@ +package com.justpickup.orderservice.domain.order.repository; + +import com.justpickup.orderservice.domain.order.entity.Order; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +import static com.justpickup.orderservice.domain.order.entity.QOrder.order; + +@Repository +@RequiredArgsConstructor +public class OrderRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public List findOrderMainBetweenOrderDate(LocalDate orderDate) { + LocalDateTime start = orderDate.atStartOfDay(); + LocalDateTime end = LocalDateTime.of(orderDate, LocalTime.of(23, 59, 59)); + + return queryFactory + .selectFrom(order) + .join(order.orderItems).fetchJoin() + .join(order.transaction).fetchJoin() + .where( + order.orderTime.between(start, end) + ) + .distinct() + .fetch(); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java new file mode 100644 index 0000000..1ef99e9 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderService.java @@ -0,0 +1,10 @@ +package com.justpickup.orderservice.domain.order.service; + +import com.justpickup.orderservice.domain.order.dto.OrderDto; + +import java.time.LocalDate; +import java.util.List; + +public interface OrderService { + List findOrderMain(LocalDate localDate); +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java new file mode 100644 index 0000000..2626f8f --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/service/OrderServiceImpl.java @@ -0,0 +1,54 @@ +package com.justpickup.orderservice.domain.order.service; + +import com.justpickup.orderservice.domain.order.dto.OrderDto; +import com.justpickup.orderservice.domain.order.repository.OrderRepository; +import com.justpickup.orderservice.domain.order.repository.OrderRepositoryCustom; +import com.justpickup.orderservice.global.client.store.GetItemResponse; +import com.justpickup.orderservice.global.client.store.StoreClient; +import com.justpickup.orderservice.global.client.user.UserClient; +import com.justpickup.orderservice.global.client.user.GetCustomerResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Slf4j +public class OrderServiceImpl implements OrderService { + + private final OrderRepository orderRepository; + private final OrderRepositoryCustom orderRepositoryCustom; + private final StoreClient storeClient; + private final UserClient userClient; + + @Override + public List findOrderMain(LocalDate orderDate) { + // 주문 가져오기 + List orderDtoList = orderRepositoryCustom.findOrderMainBetweenOrderDate(orderDate) + .stream() + .map(OrderDto::createFullField) + .collect(Collectors.toList()); + + // 사용자명 및 아이템 이름 가져오기 + orderDtoList.forEach(orderDto -> { + GetCustomerResponse getCustomerResponse = userClient.getUser(orderDto.getUserId()) + .getData(); + orderDto.setUserName(getCustomerResponse.getUserName()); + + orderDto.getOrderItemDtoList() + .forEach(orderItemDto -> { + GetItemResponse getItemResponse = storeClient.getItem(orderItemDto.getItemId()) + .getData(); + orderItemDto.setItemName(getItemResponse.getName()); + }); + }); + + return orderDtoList; + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java new file mode 100644 index 0000000..91ca880 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java @@ -0,0 +1,94 @@ +package com.justpickup.orderservice.domain.order.web; + +import com.justpickup.orderservice.domain.order.dto.OrderDto; +import com.justpickup.orderservice.domain.order.entity.OrderStatus; +import com.justpickup.orderservice.domain.order.service.OrderService; +import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; +import com.justpickup.orderservice.global.dto.Result; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import javax.validation.constraints.Pattern; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +@Slf4j +public class OrderController { + + private final OrderService orderService; + + @GetMapping("/orderMain") + public ResponseEntity orderMain(@Valid OrderMainRequest orderMainRequest) { + + List orderDto = orderService.findOrderMain(orderMainRequest.convertOrderTimeToLocalDate()); + + List orderMainResponses = orderDto.stream() + .map(OrderMainResponse::new) + .collect(Collectors.toList()); + + return ResponseEntity.status(HttpStatus.OK) + .body(Result.createSuccessResult(orderMainResponses)); + } + + @Data @NoArgsConstructor @AllArgsConstructor + static class OrderMainRequest { + // yyyy-mm-dd 형태를 가지는 패턴 조사 + @Pattern(regexp = "^(19|20)\\d{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[0-1])$", + message = "YYYY-MM-DD 형식에 맞게 작성되지 않았습니다.") + private String orderTime; + + public LocalDate convertOrderTimeToLocalDate() { + return LocalDate.parse(orderTime, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } + } + + @Data @NoArgsConstructor @AllArgsConstructor + static class OrderMainResponse { + private Long orderId; + private Long userId; + private String userName; + private List orderItemResponses; + private OrderStatus orderStatus; + private String orderTime; + + public OrderMainResponse(OrderDto orderDto) { + List orderItemDtoList = orderDto.getOrderItemDtoList() + .stream() + .map(OrderItemResponse::new) + .collect(Collectors.toList()); + + this.orderId = orderDto.getId(); + this.userId = orderDto.getUserId(); + this.userName = orderDto.getUserName(); + this.orderItemResponses = orderItemDtoList; + this.orderStatus = orderDto.getOrderStatus(); + this.orderTime = orderDto.getOrderTime() + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + } + + @Data + static class OrderItemResponse { + private Long orderItemId; + private Long itemId; + private String itemName; + + public OrderItemResponse(OrderItemDto orderItemDto) { + this.orderItemId = orderItemDto.getId(); + this.itemId = orderItemDto.getItemId(); + this.itemName = orderItemDto.getItemName(); + } + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/dto/OrderItemDto.java b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/dto/OrderItemDto.java new file mode 100644 index 0000000..52fa502 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/dto/OrderItemDto.java @@ -0,0 +1,45 @@ +package com.justpickup.orderservice.domain.orderItem.dto; + +import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter @NoArgsConstructor +public class OrderItemDto { + + private Long id; + + private Long itemId; + + private String itemName; + + // private List orderItemOptionDtoList; + + private Long price; + + private Long count; + + // == 생성 메소드 == // + @Builder + public OrderItemDto(Long id, Long itemId, Long price, Long count) { + this.id = id; + this.itemId = itemId; + this.price = price; + this.count = count; + } + + public static OrderItemDto createPrimitiveField(OrderItem orderItem) { + return OrderItemDto.builder() + .id(orderItem.getId()) + .itemId(orderItem.getItemId()) + .price(orderItem.getPrice()) + .count(orderItem.getCount()) + .build(); + } + + // == 변수 변경 메소드 == // + public void setItemName(String itemName) { + this.itemName = itemName; + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/entity/OrderItem.java b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/entity/OrderItem.java index d9d21d2..2b80748 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/entity/OrderItem.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/entity/OrderItem.java @@ -1,6 +1,7 @@ package com.justpickup.orderservice.domain.orderItem.entity; import com.justpickup.orderservice.domain.order.entity.Order; +import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption; import com.justpickup.orderservice.global.entity.BaseEntity; import lombok.AccessLevel; diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/repository/OrderItemRepository.java b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/repository/OrderItemRepository.java new file mode 100644 index 0000000..873bc38 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/orderItem/repository/OrderItemRepository.java @@ -0,0 +1,7 @@ +package com.justpickup.orderservice.domain.orderItem.repository; + +import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderItemRepository extends JpaRepository { +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/exception/FeignClientException.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/exception/FeignClientException.java new file mode 100644 index 0000000..c93ed3e --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/exception/FeignClientException.java @@ -0,0 +1,11 @@ +package com.justpickup.orderservice.global.client.exception; + +import com.justpickup.orderservice.global.exception.CustomException; +import org.springframework.http.HttpStatus; + +public class FeignClientException extends CustomException { + + public FeignClientException(HttpStatus status, String message) { + super(status, message); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/exception/FeignClientExceptionErrorDecoder.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/exception/FeignClientExceptionErrorDecoder.java new file mode 100644 index 0000000..5c5a2e5 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/exception/FeignClientExceptionErrorDecoder.java @@ -0,0 +1,38 @@ +package com.justpickup.orderservice.global.client.exception; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.justpickup.orderservice.global.dto.Result; +import feign.Response; +import feign.codec.ErrorDecoder; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +@Slf4j +public class FeignClientExceptionErrorDecoder implements ErrorDecoder { + + private final ObjectMapper objectMapper; + + @Override + public Exception decode(String methodKey, Response response) { + String message = null; + if (response.body() != null) { + try { + Result result = objectMapper.readValue(response.body().asInputStream(), Result.class); + message = result.getMessage(); + } catch (IOException e) { + String catchErrorMessage = "Error Deserializing response body from failed feign request response."; + log.warn(methodKey + catchErrorMessage, e); + + return new FeignClientException(HttpStatus.INTERNAL_SERVER_ERROR, "고객센터로 문의해주세요."); + } + } + + return new FeignClientException(HttpStatus.INTERNAL_SERVER_ERROR, message); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/GetItemResponse.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/GetItemResponse.java new file mode 100644 index 0000000..a750e95 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/GetItemResponse.java @@ -0,0 +1,12 @@ +package com.justpickup.orderservice.global.client.store; + +import com.justpickup.orderservice.global.entity.Yn; +import lombok.Data; + +@Data +public class GetItemResponse { + private Long id; + private String name; + private Yn salesYn; + private Long price; +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java new file mode 100644 index 0000000..c2762bb --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/store/StoreClient.java @@ -0,0 +1,13 @@ +package com.justpickup.orderservice.global.client.store; + +import com.justpickup.orderservice.global.dto.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(name = "STORE-SERVICE", url = "127.0.0.1:8001/store-service") +public interface StoreClient { + + @GetMapping("/item/{itemId}") + Result getItem(@PathVariable("itemId") Long itemId); +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/user/GetCustomerResponse.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/user/GetCustomerResponse.java new file mode 100644 index 0000000..e24d23d --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/user/GetCustomerResponse.java @@ -0,0 +1,10 @@ +package com.justpickup.orderservice.global.client.user; + +import lombok.Data; + +@Data +public class GetCustomerResponse { + private Long userId; + private String userName; + private String phoneNumber; +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/client/user/UserClient.java b/order-service/src/main/java/com/justpickup/orderservice/global/client/user/UserClient.java new file mode 100644 index 0000000..4a81250 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/client/user/UserClient.java @@ -0,0 +1,13 @@ +package com.justpickup.orderservice.global.client.user; + +import com.justpickup.orderservice.global.dto.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(name = "USER-SERVICE", url = "127.0.0.1:8001/user-service") +public interface UserClient { + + @GetMapping("/customer/{userId}") + Result getUser(@PathVariable("userId") Long userId); +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/config/FeignClientConfig.java b/order-service/src/main/java/com/justpickup/orderservice/global/config/FeignClientConfig.java new file mode 100644 index 0000000..781f2e1 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/config/FeignClientConfig.java @@ -0,0 +1,14 @@ +package com.justpickup.orderservice.global.config; + +import feign.Logger; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FeignClientConfig { + + @Bean + public Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/config/QueryDslConfig.java b/order-service/src/main/java/com/justpickup/orderservice/global/config/QueryDslConfig.java new file mode 100644 index 0000000..cb55d91 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/config/QueryDslConfig.java @@ -0,0 +1,22 @@ +package com.justpickup.orderservice.global.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +@Configuration +@EnableJpaAuditing +public class QueryDslConfig { + + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(this.entityManager); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/dto/Code.java b/order-service/src/main/java/com/justpickup/orderservice/global/dto/Code.java new file mode 100644 index 0000000..92337c9 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/dto/Code.java @@ -0,0 +1,5 @@ +package com.justpickup.orderservice.global.dto; + +public enum Code { + SUCCESS, ERROR +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/dto/Result.java b/order-service/src/main/java/com/justpickup/orderservice/global/dto/Result.java new file mode 100644 index 0000000..98f0419 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/dto/Result.java @@ -0,0 +1,36 @@ +package com.justpickup.orderservice.global.dto; + +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data @NoArgsConstructor +public class Result { + private Code code; + private String message; + private T data; + + @Builder + public Result(Code code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public static Result createErrorResult(String message) { + return Result.builder() + .code(Code.ERROR) + .message(message) + .data(null) + .build(); + } + + // 해당 는 클래스의 T와 다름 + public static Result createSuccessResult(T data) { + return Result.builder() + .code(Code.SUCCESS) + .message("") + .data(data) + .build(); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/entity/Yn.java b/order-service/src/main/java/com/justpickup/orderservice/global/entity/Yn.java new file mode 100644 index 0000000..e4f278d --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/entity/Yn.java @@ -0,0 +1,5 @@ +package com.justpickup.orderservice.global.entity; + +public enum Yn { + Y, N +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/exception/CustomException.java b/order-service/src/main/java/com/justpickup/orderservice/global/exception/CustomException.java new file mode 100644 index 0000000..7f706a3 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/exception/CustomException.java @@ -0,0 +1,17 @@ +package com.justpickup.orderservice.global.exception; + +import com.justpickup.orderservice.global.dto.Result; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class CustomException extends RuntimeException { + + private HttpStatus status; + private Result errorResult; + + protected CustomException(HttpStatus status, String message) { + this.status = status; + this.errorResult = Result.createErrorResult(message); + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java b/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..4d08327 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,55 @@ +package com.justpickup.orderservice.global.exception; + +import com.justpickup.orderservice.global.dto.Result; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @ExceptionHandler(CustomException.class) + public ResponseEntity customExceptionHandler(CustomException ce) { + HttpStatus status = ce.getStatus(); + Result errorResult = ce.getErrorResult(); + + return ResponseEntity.status(status) + .body(errorResult); + } + + @ExceptionHandler(BindException.class) + public ResponseEntity bindExceptionHandler(BindException exception) { + return getValidationErrorBody(exception); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) { + return getValidationErrorBody(exception); + } + + private ResponseEntity getValidationErrorBody(BindException exception) { + BindingResult bindingResult = exception.getBindingResult(); + + StringBuilder builder = new StringBuilder(); + bindingResult.getFieldErrors() + .forEach(fieldError -> { + builder.append("["); + builder.append(fieldError.getField()); + builder.append("](은)는 "); + builder.append(fieldError.getDefaultMessage()); + builder.append(" 입력된 값: ["); + builder.append(fieldError.getRejectedValue()); + builder.append("]"); + }); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Result.createErrorResult(builder.toString())); + } + +} diff --git a/owner-apigateway-service/build.gradle b/owner-apigateway-service/build.gradle index 75e1e29..ab169ca 100644 --- a/owner-apigateway-service/build.gradle +++ b/owner-apigateway-service/build.gradle @@ -26,6 +26,9 @@ dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j' implementation 'org.springframework.cloud:spring-cloud-starter-gateway' implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + // https://mvnrepository.com/artifact/io.netty/netty-resolver-dns-native-macos + implementation 'io.netty:netty-resolver-dns-native-macos:4.1.68.Final:osx-aarch_64' + compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' annotationProcessor 'org.projectlombok:lombok' diff --git a/owner-apigateway-service/src/main/resources/application.yml b/owner-apigateway-service/src/main/resources/application.yml index 99e5f31..68321c9 100644 --- a/owner-apigateway-service/src/main/resources/application.yml +++ b/owner-apigateway-service/src/main/resources/application.yml @@ -10,4 +10,32 @@ eureka: spring: application: - name: owner-apigateway-service \ No newline at end of file + name: owner-apigateway-service + + cloud: + gateway: + routes: + - id: owner-frontend-service + uri: lb://OWNER-FRONTEND-SERVICE + predicates: + - Path=/owner-frontend-service/** + filters: + - RewritePath=/owner-frontend-service/(?.*),/$\{segment} + - id: order-service + uri: lb://ORDER-SERVCIE + predicates: + - Path=/order-service/** + filters: + - RewritePath=/order-service/(?.*),/$\{segment} + - id: store-service + uri: lb://STORE-SERVCIE + predicates: + - Path=/store-service/** + filters: + - RewritePath=/store-service/(?.*),/$\{segment} + - id: user-service + uri: lb://USER-SERVICE + predicates: + - Path=/user-service/** + filters: + - RewritePath=/user-service/(?.*),/$\{segment} \ No newline at end of file diff --git a/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/OwnerFrontendServiceApplication.java b/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/OwnerFrontendServiceApplication.java index b749864..698f81a 100644 --- a/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/OwnerFrontendServiceApplication.java +++ b/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/OwnerFrontendServiceApplication.java @@ -2,8 +2,10 @@ package com.justpickup.ownerfrontendservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication +@EnableEurekaClient public class OwnerFrontendServiceApplication { public static void main(String[] args) { diff --git a/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/domain/order/web/OrderController.java b/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/domain/order/web/OrderController.java new file mode 100644 index 0000000..c4b4a08 --- /dev/null +++ b/owner-frontend-service/src/main/java/com/justpickup/ownerfrontendservice/domain/order/web/OrderController.java @@ -0,0 +1,15 @@ +package com.justpickup.ownerfrontendservice.domain.order.web; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +@Slf4j +public class OrderController { + + @GetMapping("/order") + public String order() { + return "/domain/order/order"; + } +} diff --git a/owner-frontend-service/src/main/resources/static/common.js b/owner-frontend-service/src/main/resources/static/common.js new file mode 100644 index 0000000..9134f34 --- /dev/null +++ b/owner-frontend-service/src/main/resources/static/common.js @@ -0,0 +1,4 @@ +const ownerApiGatewayIp = "http://127.0.0.1:8001/"; +const url = { + orderService : ownerApiGatewayIp + "order-service/" +} \ No newline at end of file diff --git a/owner-frontend-service/src/main/resources/templates/domain/order/order.html b/owner-frontend-service/src/main/resources/templates/domain/order/order.html new file mode 100644 index 0000000..7255fa2 --- /dev/null +++ b/owner-frontend-service/src/main/resources/templates/domain/order/order.html @@ -0,0 +1,105 @@ + + + + + + +
+ +

주문

+ + +
2022년 01년 14일
+ + +
+ +
+
+
+ 닉네임 +
+
+
+ + 메뉴1, 메뉴2, 메뉴3 + +
+

+ 오전 11:03 +

+ 상세보기 +
+ +
+
+ + + +
+
+
+ 닉네임 +
+
+
+ + 메뉴1, 메뉴2, 메뉴3, 메뉴4, 메뉴5, 메뉴6 + +
+

+ 오후 04:03 +

+ 상세보기 +
+ +
+
+ + + +
+
+
+ 닉네임 +
+
+
+ + 메뉴1, 메뉴2 + +
+

+ 오후 10:45 +

+ 상세보기 +
+ +
+
+ + +
+ + +
+ + \ No newline at end of file diff --git a/owner-frontend-service/src/main/resources/templates/fragments/navbar.html b/owner-frontend-service/src/main/resources/templates/fragments/navbar.html index 7a55f65..7dbbe82 100644 --- a/owner-frontend-service/src/main/resources/templates/fragments/navbar.html +++ b/owner-frontend-service/src/main/resources/templates/fragments/navbar.html @@ -118,7 +118,7 @@ @@ -130,7 +130,7 @@ @@ -142,7 +142,7 @@ @@ -176,7 +176,7 @@ data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Douglas McGee + src="img/undraw_profile.svg"> - - + + - + - + - + +