주문목록검색 취소

1. OrderController 클래스에서

 

@GetMapping 작성

@PostMapping작성

사진

 

2. OrderList.html 파일 작성

 

 

3. 특정이름으로 검색이

마주한 에러 및 문제해결

-OrderRepositoryJPA Criteria 구문 작성

-OrderService 클래스에 findAllCriteria로 변경

 

실습

화면출력

정리

1.orderList.html파일

-검색조건 양식(form)이 있어야 한다.

 

회원명 구문

주문상태 구문

검색 구문

->검색 버튼을 누르면

 

위에 구문에서 작성하고 선택한 옵션값들을 보낸 값들이

OrderController 클래스에 OrderSearchmemberNameOrderStatus에 바인딩이 된다.

다시 OrderController에 와서 바인딩 된 상태로 return에 지정한 order/orderList로 넘어가게 된다.

 

enum typeorder,cancel을 둘다 값을 OrderStatus 루프를 통해 뿌리고 select를 해야 한다.

타임리프의 문법을 사용해서 값을 뿌릴 수 있다.

, enum에 잇는 values를 가져와서 값을 뿌리게 된다.

 

 

<tr th:each="item : ${orders}"> 구문 설명

<td th:text="${item.id}"></td>

<td th:text="${item.member.name}"></td>

<td th:text="${item.orderItems[0].item.name}"></td>

<td th:text="${item.orderItems[0].orderPrice}"></td>

<td th:text="${item.orderItems[0].count}"></td>

<td th:text="${item.status}"></td>

<td th:text="${item.orderDate}"></td>

<td>

 

-orders를 주문으로 돌려서 나오게 한다.

 

 

<a th:if="${item.status.name() == 'ORDER'}" 구문설명

href="#" th:href="'javascript:cancel('+${item.id}+')'"

class="btn btn-danger">CANCEL</a>

 

-상태가 order이면 cancel버튼이 나오도록 자바 스크립트로 작성을 했다.

cancel을 누를 시에 자바스크립트 캔슬이 호출되어 하기구문으로 넘어간다.

 

<script>

function cancel(id) {

var form = document.createElement("form");

form.setAttribute("method", "post");

form.setAttribute("action", "/orders/" + id + "/cancel");

document.body.appendChild(form);

form.submit();

}

</script>

 

- 구문에서 form 내에 해당하는 내용들을 위해 구문작성을 만들어야 한다.

 

-@PostMapping 방식으로 cancelOrder을 받아와서

redirect으로 화면에 cancel상태의 화면을 출력한다.

 

 

cancel버튼클릭시 화면 및 cancel상태의 목록검색

 

특정이름없이 전체목록출력

Delivery엔티티클래스 세팅

실습

설명

a. @Entity @Getter @Setter 세팅

 

b. 엔티티속성/필드 + 어노테이션 (실습사진참고)설정

-private Long id;

-private Order order;

-private Address address

-private DeliveryStatus status;

 

c.Orderdelivery 연관관계매핑

Order클래스 맵핑실습

설명

@OneToOne

-1:1 매핑이다.

*여기에서 고민해주어야 할 것이 있다.

 하나의 주문은 하나의 배송정보만, 하나의 배송은 하나의 주문정보만 가져야 한다

 이렇게 되어야 1:1 관계가 형성된다.

 

*JPA 에서는 1:1관계에서는 어디든 FOREIGN KEY를 주어도 된다 어디에 두느냐에 따라 장단점이 있다.

-선호하는 스타일은 access를 많이 하는 쪽에 foreign key를 두려고 한다.

-여기 시스템상 배송을 조회하는 것보다 주문을 보면서 배송을 확인한다.

 그래서 주문,Orderforeign key(delivery_id)를 두었다.

 

연관관계주인 정하기

order에도 delivery가 있고, delivery에도 order가 있다.

-Orderforeign key가 있으므로, delivery를 연관관계의 주인으로 정한다.

*1:1관계매핑은 기본편에서 확인할 것

 

그러므로 Order엔티티클래스에

@OneToOne

@JoinColumn(name = "delivery_id")

private Delivery delivery;

 

Delivery엔티티 클래스측에

@OnetoOne(mapped By = "delivery")로 설정

private Order order;

 

d. Address필드 재활용 및 @Embedded(내장값)어노테이션 설정

 

e. DeliveryStatus status 설정 및 DeliveryStatus Enum생성

@Enumerated(EnumType.STRING)어노테이션 설정

-@EnumeratedEnumType에 두가지 종류: ORDINAL, STRING

ORDINAL : 1, 2, 3, 4 숫자형태로 컬럼에 들어간다.

예를들어 1,2 사이에 다른 상태의 값이 생기면 3,4는 뒤로 밀리면서 4,5가 된다.

STRING : 숫자형태순서가 아닌, 중간에 값이 생겨도 밀려나거나 하는 법이 없다.

그래서 꼭 STRING을 써야 한다.

 

DeliveryStatus Enum생성

 

엔티티분석

ORDER

-id

-member : Member

-orderitems : List

-delivery : Delivery

-orderDate : Date

-status : OrderStatus

 

Orderitem

-id

-item : Item

-order : Order

-orderPrice

-count

 

Delivery

-id

-order : Order

-address : Address

-status : DeliveryStatus

 

 

테이블 분석

ORDERS

-MEMBER_ID (FK)

-DELIVERY_ID (FK)

-ORDERDATE

-STATUS

 

ORDER_ITEM

-ORDER_ID(FK)

-ITEM_ID(FK)

-ORDERPRICE

-COUNT

 

DELIVERY

-DELIVERY_ID

-STATUS

-CITY

-STREET

-ZIPCODE

 

 

1. 주문엔티티 추가 개발

 

실습

a. Order클래스에서 

-private List<OrderItem> orderItems = new ArrayList<>();  (OrderItem클래스 생성)

-prviate Delivery delivery; (Delivery 클래스 생성)

-private LocalDateTime orderDate; (주문시간)

*자바8이전엔은 private Date date을 만들어주고, Dateimport 해야했으며,

 날짜관련 어노테이션 매핑을 해주었어야 했다.

 자바8에서는 LocalDateTime를 사용하면 hibernate가 자동으로 위의 행위들을 대신해준다.

-Private OrderStatus status; (@Enumerated(EnumType.STRING)어노테이션 설정해줄 것!)

*(OrderStatus 클래스생성 -> 이것으로 주문상태 Order, Cancel를 관리한다.)

 

OrderStatus클래스 생성

실습

 

b. orderItem 클래스 개발

실습

@ManyToOne@JoinColumn 어노테이션 사용에 대한 설명

orderorderItem 엔티티분석 (양방향연관관계)

-하나의 order과 여러개의 orderItem을 가질 수 있고

 orderItem은 하나의 order만 가질 수 있다.

 매핑에도 order클래스에도 orderitems클래스에도 order가 있다.

 

order과 orderItem 테이블분석

-orderItem( )foreign key가 들어간다.

 order_id가 들어간다. 하나의 주문에 여러개의 orderItem이 들어가기 때문에

-orderItem에서 order가 연관관계의 주인이 된다.

 orderItem에 이어 order측 세팅

 

@OneToMany(mappedBy = "order") -> Order클래스에서 확인

Private List<OrderItem> orderItems = new Arraylist<>();

-order에 의해서 맵핑이 된다는 의미

-@OneToMany : 회원과 주문의 관계, 1대 다 관계를 설정해주는 어노테이션

-@OneToMany (mapped by = "order")

*foreign key가 있는 OrderItem클래스에 있는 order가 연관관계의 주인이다.

*mapped by - orderItem 테이블에 있는 order필드에 의해 맵핑된 거울일 뿐이야라는 뜻

 

 

d.OrderItemprivate Item item과 연동되는 Item클래스 세팅

설명

public abstract class (추상클래스로 만든다. 구현체를 가지고 만들 것이기 때문에)

 

e.Item엔티티분석, 실습 및 Item package 생성 (위의 실습사진 참고)

ITEM 엔티티분석

-id

-name

-price: int

-stockQuantity

-categories : List

 

ITEM 테이블분석

ITEM_ID

-NAME

-PRICE

-STOCKQUANTITY

-DTYPE

-ARTIST

-ETC

-AUTHOR

-ISBN

-DIRECTOR

-ACTOR

 

-stockQuantity 매핑을 해주어야 하고, 밑에 Album, Book, Movie와 상속관계이다.

* 상속관계공부 필요

* private - 속성

* name, price, stockQuantity - 공통속성

 -상속할 Album, Book, Movie은 일일이 만들어주어야 하는 것들이다.

 

Item package 생성

설명

-Item package를 만들어 Item,Album, Book, Movie클래스에 옮긴다.

+ Recent posts