주문서비스의 구현 - TheOpenCloudEngine/uEngine-cloud GitHub Wiki
주문/재고 서비스의 유즈케이스
- 고객이 주문을 한다. 고객의 상품 주문 정보를 받아서 데이터베이스에 입력한다.
- 주문이 들어오면 먼저 해당 상품의 재고의 수량을 확인하여 재고가 존재할 때 주문이 가능하다.
Metaworks4 App 의 생성
OCE 애플리케이션을 생성하기 위하여 앞선 과정의 OO 의 내용을 참고하여 생성하면 다음과 같은 폴더가 생성된다:
src
+- main
+- java
+- org
+- uengine
+- msa
Application.java
WebConfig.java
...
pom.xml
엔티티 클래스 설계
생성된 프로젝트의 Application.java 가 포함된 동일한 패키지내에 다음의 클래스들을 생성한다:
- 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;
}
}
- 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개를 동일한 패키지 내에 만들어준다:
- OrderRepository
public interface OrderRepository extends PagingAndSortingRepository<Order, Long>{
}
- ItemRepository
public interface ItemRepository extends PagingAndSortingRepository<Item, String>{
}
테스트
- 서비스의 기동
mvn spring-boot:run
혹은 IntelliJ 등의 IDE 툴에서 Application.java > Run 하면 된다.
- 기동된 서비스의 확인
$ 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"
}
}
}
- 상품 정보 등록
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
}
- 주문 등록
$ 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
}
- 등록된 주문 정보내에 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: 고객서비스의 생성