프로젝트 (Java)/예약마켓

[프로젝트] 42. 예약 구매 기능을 지원하는 Order 모듈 추가

hihyuk 2024. 2. 13. 09:48

Order 모듈 구성

build.gradle

Order 모듈에 필요한 의존성을 정의합니다. 여기에는 Spring Boot 웹 스타터, 시큐리티 스타터, 그리고 공통 기능을 담당하는 myshop-core 모듈이 포함됩니다.

project(':myshop-order') {
	dependencies {
		implementation 'org.springframework.boot:spring-boot-starter-web'
		implementation 'org.springframework.boot:spring-boot-starter-security'
		implementation project(':myshop-core')
	}
}

OrderApplication

스프링 부트 애플리케이션의 메인 클래스로서, 애플리케이션을 구동시키는 엔트리 포인트입니다. @PostConstruct를 사용하여 서버 시간을 Asia/Seoul로 설정함으로써, 모든 시간 데이터가 한국 시간대를 기준으로 처리되도록 합니다.

@Import(JpaAuditingConfig.class)
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @PostConstruct
    public void setTime() {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
    }
}

application.yml

Order 서비스의 포트 설정과 스프링 프로파일을 포함합니다. include: - coremyshop-core 모듈의 설정을 포함시키는 역할을 합니다.

server:
  port: 8084

spring:
  profiles:
    include:
      - core

 

주요 도메인 엔티티

Order

주문 엔티티로, 사용자 정보와 주문한 상품 목록, 주문 상태를 관리합니다. @OneToMany 관계를 통해 여러 주문 항목(OrderItem)을 포함할 수 있습니다.

@Entity
@Table(name = "orders")
@Getter
@NoArgsConstructor
public class Order extends BaseTimeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch= FetchType.LAZY, optional = false)
    @JoinColumn(name = "user_id")
    private User user;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}

OrderItems

주문 항목 엔티티로, 구매된 상품의 정보, 주문 가격, 수량 등을 관리합니다. @ManyToOne 관계를 통해 상품(Item)과 연결됩니다.

@Entity
@Table(name = "order_items")
@Getter
@NoArgsConstructor
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch= FetchType.LAZY, optional = false)
    @JoinColumn(name = "item_id")
    private Item item;

    @ManyToOne(fetch= FetchType.LAZY, optional = false)
    @JoinColumn(name = "order_id")
    private Order order;

    @Column(name = "order_price")
    private int orderPrice;

    @Column(name = "count")
    private int count;
}

Item

상품 엔티티로, 상품의 이름, 설명, 가격, 재고 수량 및 상태(일반 또는 예약)를 관리합니다. ItemStatus 열거형을 통해 상품의 상태를 표현합니다.

@Entity
@Table(name = "items")
@Getter
@NoArgsConstructor
public class Item {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "content")
    private String content;
    @Column(name = "price")
    private int price;
    @Column(name = "stock_quantity")
    private int stockQuantity;
    @Enumerated(EnumType.STRING)
    private ItemStatus status;
}

 

주문과 상품 관리

Order 모듈은 사용자가 상품을 예약 및 구매하는 과정을 관리합니다. 사용자는 Item 엔티티로 표현되는 상품을 선택하여 예약하거나 구매할 수 있으며, 이러한 행위는 Order 엔티티에 기록됩니다. 각 Order 엔티티는 하나 이상의 OrderItem 엔티티를 포함할 수 있으며, 이는 사용자가 주문한 각 상품의 세부 사항을 나타냅니다.

 

 

결론

Order 모듈의 추가는 사용자가 상품을 예약하고 구매하는 기능을 제공함으로써, 전체 시스템의 기능성을 향상시킵니다. 이 모듈은 myshop-core 모듈과의 연동을 통해 공통적인 기능을 활용하며, 마이크로서비스 아키텍처 내에서 중요한 역할을 수행합니다.