주문서비스의 구현 - TheOpenCloudEngine/uEngine-cloud GitHub Wiki

주문/재고 서비스의 유즈케이스

  1. 고객이 주문을 한다. 고객의 상품 주문 정보를 받아서 데이터베이스에 입력한다.
  2. 주문이 들어오면 먼저 해당 상품의 재고의 수량을 확인하여 재고가 존재할 때 주문이 가능하다.

Metaworks4 App 의 생성

OCE 애플리케이션을 생성하기 위하여 앞선 과정의 OO 의 내용을 참고하여 생성하면 다음과 같은 폴더가 생성된다:

src
 +- main
  +- java
   +- org
    +- uengine
     +- msa
       Application.java
       WebConfig.java
  ...
pom.xml

엔티티 클래스 설계

생성된 프로젝트의 Application.java 가 포함된 동일한 패키지내에 다음의 클래스들을 생성한다:

  1. Order.java
@Entity
@Table(name="order_table")
public class Order {

    @Id @GeneratedValue
    Long id;
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }

    @ManyToOne @JoinColumn(name = "itemId")
    Item item;
        public Item getItem() {
            return item;
        }
        public void setItem(Item item) {
            this.item = item;
        }

    int qty;
        public int getQty() {
            return qty;
        }
        public void setQty(int qty) {
            this.qty = qty;
        }
}

  1. Item.java
@Entity
public class Item {

    @Id
    String item;
        public String getItem() {
            return item;
        }
        public void setItem(String item) {
            this.item = item;
        }

    int stock;
        public int getStock() {
            return stock;
        }
        public void setStock(int stock) {
            this.stock = stock;
        }

    int point;
        public int getPoint() {
            return point;
        }
        public void setPoint(int point) {
            this.point = point;
        }

}

여기서 사용된 JPA 애노테이션을 소개하면,

  • @Entity: 해당 클래스가 엔티티 클래스임을 표시한다.
  • @Id: 해당 프로퍼티가 Primary Key임을 표시한다.
  • @ManyToOne: 해당 프로퍼티 클래스와 본 엔티티는 n:1 관계임을 표시한다. 이 경우는 하나의 Item 에 대하여 여러 주문건이 발생할 수 있으므로 Order 입장에서 ManyToOne 이 옳은 설정이다.
  • @JoinColumn: 연결되는 조인 컬럼 ID 를 Database Level 에서 사용할 컬럼명(name)을 지정해준다.
  • 더 상세한 JPA 애노테이션에 대한 명세는 metaworks4.io를 참고한다.

레파지토리

위와 같은 두개의 엔티티 도메인 클래스를 만든 후, 대응하는 Repository 2개를 동일한 패키지 내에 만들어준다:

  1. OrderRepository
public interface OrderRepository extends PagingAndSortingRepository<Order, Long>{
}

  1. ItemRepository
public interface ItemRepository extends PagingAndSortingRepository<Item, String>{
}

테스트

  1. 서비스의 기동
mvn spring-boot:run

혹은 IntelliJ 등의 IDE 툴에서 Application.java > Run 하면 된다.

  1. 기동된 서비스의 확인
$ http localhost:8080

{
    "_links": {
        "items": {
            "href": "http://localhost:8080/items{?page,size,sort}", 
            "templated": true
        }, 
        "orders": {
            "href": "http://localhost:8080/orders{?page,size,sort}", 
            "templated": true
        }, 
        "profile": {
            "href": "http://localhost:8080/profile"
        }
    }
}
  1. 상품 정보 등록
http POST http://localhost:8080/items item="tv" price=100 stock=5

{
    "_links": {
        "item": {
            "href": "http://localhost:8080/items/tv"
        }, 
        "self": {
            "href": "http://localhost:8080/items/tv"
        }
    }, 
    "point": 0, 
    "stock": 5
}
  1. 주문 등록
$ http POST http://localhost:8080/orders item="http://localhost:8080/items/tv" qty=2 

{
    "_links": {
        "item": {
            "href": "http://localhost:8080/orders/1/item"
        }, 
        "order": {
            "href": "http://localhost:8080/orders/1"
        }, 
        "self": {
            "href": "http://localhost:8080/orders/1"
        }
    }, 
    "qty": 2
}

  1. 등록된 주문 정보내에 Foreign Key 로 연결된 item 정보를 읽어보면

        "item": {
            "href": "http://localhost:8080/orders/1/item"
        }

....

http "http://localhost:8080/orders/1/item"

{
    "_links": {
        "item": {
            "href": "http://localhost:8080/items/tv"
        }, 
        "self": {
            "href": "http://localhost:8080/items/tv"
        }
    }, 
    "point": 0, 
    "stock": 5
}

두개의 엔티티 값이 HATEOAS Link 를 통하여 연결된 것을 확인할 수 있다.

  • Next: 고객서비스의 생성