package com.oracle.oBootJpa03.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import com.oracle.oBootJpa03.domain.item.Book;
import com.oracle.oBootJpa03.domain.item.Item;
import com.oracle.oBootJpa03.form.BookForm;
import com.oracle.oBootJpa03.service.ItemService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequiredArgsConstructor
public class ItemController {
private final ItemService itemService;
// 상품등록폼이동
@GetMapping(value = "/items/new")
public String createForm(Model model) {
System.out.println("ItemController /items/new Start...");
model.addAttribute("form", new BookForm());
return "items/createItemForm";
}
// 상품등록
@PostMapping(value = "/items/save")
public String itemSave(BookForm form) {
System.out.println("ItemController /items/save Start...");
Book book = new Book();
// 1. BookForm -> Book
book.setId(form.getId());
book.setName(form.getName());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
itemService.saveItem(book);
return "redirect:/";
}
// 상품조회
@GetMapping(value = "/items")
public String itemList(Model model) {
System.out.println("ItemController /items Start...");
List<Item> items = itemService.findItems();
model.addAttribute("items", items);
return "items/itemList";
}
// 상품수정폼이동
@GetMapping(value = "/items/{itemId}/edit")
public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {
log.info("itemId->{}",itemId);
Book item = (Book) itemService.findOne(itemId);
BookForm form = new BookForm();
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
form.setAuthor(item.getAuthor());
form.setIsbn(item.getIsbn());
model.addAttribute("form", form);
return "items/updateItemForm";
}
// 상품 수정
@PostMapping(value = "/items/{itemId}/edit")
public String updateItem(@ModelAttribute("form") BookForm form) {
log.info("updateItem itemId->{}",form.getId() );
log.info("updateItem getName->{}",form.getName());
// 1. [controller-->Service ]-->updateItem(id, name , price)
// itemService.updateItem(form.getId(), form.getName(), form.getPrice());
itemService.updateItem(form);
// 2. [Service -->Repository ]--> 수정
return "redirect:/items";
}
}
package com.oracle.oBootJpa03.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.oracle.oBootJpa03.domain.item.Book;
import com.oracle.oBootJpa03.domain.item.Item;
import com.oracle.oBootJpa03.form.BookForm;
import com.oracle.oBootJpa03.repository.ItemRepository;
import lombok.RequiredArgsConstructor;
@Service
@Transactional
@RequiredArgsConstructor
public class ItemService {
private final ItemRepository itemRepository;
// 상품등록
public void saveItem(Item item) {
System.out.println("ItemService saveItem Start...");
itemRepository.itemSave(item);
System.out.println("ItemService saveItem After...");
}
// 상품조회
public List<Item> findItems() {
System.out.println("ItemService findItems Start...");
List<Item> itemList = itemRepository.findAll();
System.out.println("ItemService findItems After itemList.size()->"+itemList.size());
return itemList;
}
// 상품수정폼이동
public Item findOne(Long itemId) {
System.out.println("ItemService findOne Start...");
Item item = itemRepository.findOne(itemId);
System.out.println("ItemService findOne After");
return item;
}
public void updateItem(BookForm form) {
Book book = itemRepository.findOneBook(form.getId());
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
}
}
package com.oracle.oBootJpa03.repository;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import com.oracle.oBootJpa03.domain.item.Book;
import com.oracle.oBootJpa03.domain.item.Item;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class ItemRepository {
private final EntityManager em;
// 상품등록
public void itemSave(Item item) {
System.out.println("ItemRepository itemSave Start...");
em.persist(item);
}
// 상품조회
public List<Item> findAll() {
System.out.println("ItemRepository findAll Start...");
List<Item> itemList = em.createQuery("select i from Item i",Item.class)
.getResultList();
System.out.println("ItemRepository itemList.size()->"+itemList.size());
return itemList;
}
// 상품수정폼이동
public Item findOne(Long id) {
System.out.println("ItemRepository findOne id->"+id);
Item item = em.find(Item.class, id);
System.out.println("ItemRepository findOne After");
return item;
}
// 상품수정
public Book findOneBook(Long id) {
System.out.println("ItemRepository findOneBook id->"+id);
Book book = em.find(Book.class, id);
return book;
}
}
값으로 데이터를 가져오고 보여주는 건 이름으로 보여줌
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<form role="form" action="/orderSave" method="post">
<div class="form-group">
<label for="member">주문회원</label>
<select name="memberId" id="member" class="form-control">
<option value="">회원선택</option>
<option th:each="member : ${members}" th:value="${member.id}" th:text="${member.name}">
</select>
</div>
<div class="form-group">
<label for="item">상품명</label>
<select name="itemId" id="item" class="form-control">
<option value="">상품선택</option>
<option th:each="item : ${items}" th:value="${item.id}" th:text="${item.name}">
</select>
</div>
<div class="form-group">
<label for="count">주문수량</label>
<input type="number" name="count" class="form-control" id="count" placeholder="주문 수량을 입력하세요">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</body>
</html>
package com.oracle.oBootJpa03.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.oracle.oBootJpa03.domain.Member;
import com.oracle.oBootJpa03.domain.item.Item;
import com.oracle.oBootJpa03.service.ItemService;
import com.oracle.oBootJpa03.service.MemberService;
import com.oracle.oBootJpa03.service.OrderService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
private final MemberService memberService;
private final ItemService itemService;
// 회원, 아이템 불러오기
@GetMapping(value = "/order")
public String createOrderForm(Model model) {
log.info("OrderController createOrderForm Start...");
List<Member> members = memberService.findMembers();
List<Item> items = itemService.findItems();
model.addAttribute("members", members);
model.addAttribute("items", items);
return "order/orderForm";
}
}
package com.oracle.oBootJpa03.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.oracle.oBootJpa03.repository.ItemRepository;
import com.oracle.oBootJpa03.repository.MemberRepository;
import com.oracle.oBootJpa03.repository.OrderRepository;
import lombok.RequiredArgsConstructor;
@Service
@Transactional
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
private final MemberRepository memberRepository;
private final ItemRepository itemRepository;
}
package com.oracle.oBootJpa03.repository;
import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class OrderRepository {
private final EntityManager em;
}
package com.oracle.oBootJpa03.domain.item;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import com.oracle.oBootJpa03.domain.Order;
import lombok.Data;
@Entity
@Data
@Table(name = "order_item")
@SequenceGenerator(
name = "order_item_seq",
sequenceName = "order_item_sequence",
initialValue = 1,
allocationSize = 1
)
public class OrderItem {
@Id
@Column(name = "order_item_id")
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "order_item_seq"
)
private Long id;
@ManyToOne
@JoinColumn(name = "item_id")
private Item item; // 주문 상품
@ManyToOne
@JoinColumn(name = "order_id")
private Order order; // 주문
private int orderPrice; // 주문가격
private int count; // 주문수량
}
package com.oracle.oBootJpa03.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.oracle.oBootJpa03.domain.Member;
import com.oracle.oBootJpa03.domain.item.Item;
import com.oracle.oBootJpa03.service.ItemService;
import com.oracle.oBootJpa03.service.MemberService;
import com.oracle.oBootJpa03.service.OrderService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
private final MemberService memberService;
private final ItemService itemService;
// 회원, 아이템 불러오기
@GetMapping(value = "/order")
public String createOrderForm(Model model) {
log.info("OrderController createOrderForm Start...");
List<Member> members = memberService.findMembers();
List<Item> items = itemService.findItems();
model.addAttribute("members", members);
model.addAttribute("items", items);
return "order/orderForm";
}
// 주문 저장
@PostMapping(value = "/orderSave")
public String orderSave(@RequestParam("memberId") Long memberId,
@RequestParam("itemId") Long itemId,
@RequestParam("count") int count) {
log.info("OrderController orderSave start...");
orderService.order(memberId, itemId, count);
return "redirect:/";
}
}
package com.oracle.oBootJpa03.service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.oracle.oBootJpa03.domain.Delivery;
import com.oracle.oBootJpa03.domain.DeliveryStatus;
import com.oracle.oBootJpa03.domain.Member;
import com.oracle.oBootJpa03.domain.Order;
import com.oracle.oBootJpa03.domain.item.Item;
import com.oracle.oBootJpa03.domain.item.OrderItem;
import com.oracle.oBootJpa03.repository.ItemRepository;
import com.oracle.oBootJpa03.repository.MemberRepository;
import com.oracle.oBootJpa03.repository.OrderRepository;
import lombok.RequiredArgsConstructor;
@Service
@Transactional
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
private final MemberRepository memberRepository;
private final ItemRepository itemRepository;
// 1. Delivery Save
// 2. Order Save
// 3. OrderItem Save
// 4. 재고 --> X, OrderItem은 하나만 처리
public void order(Long memberId, Long itemId, int count) {
// 엔티티 조회
Member member = memberRepository.findOne(memberId);
Item item = itemRepository.findOne(itemId);
// 1.배송정보 생성(Member 주소배송 가정)
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
delivery.setStatus(DeliveryStatus.READY); // 배송준비
// 배송정보 저장
orderRepository.saveDelivery(delivery);
System.out.println("OrderService delivery.getId()->"+delivery.getId());
System.out.println("OrderService item.getId()->"+item.getId());
System.out.println("OrderService member.getId()->"+member.getId());
// 2-1. 주문생성(연관관계 형성)
Order order = Order.createOrder(member, delivery);
// 2-2. 주문저장
orderRepository.saveOrder(order);
// 3. 주문상품 생성
// OrderItme orderItem = new OrderItem() --> 연관관계 Mapping 처리 위해
OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);
orderItem.setOrder(order);
orderRepository.saveOrderItem(orderItem);
}
}
package com.oracle.oBootJpa03.repository;
import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import com.oracle.oBootJpa03.domain.Delivery;
import com.oracle.oBootJpa03.domain.Order;
import com.oracle.oBootJpa03.domain.item.OrderItem;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class OrderRepository {
private final EntityManager em;
// 배송 정보 저장
public void saveDelivery(Delivery delivery) {
em.persist(delivery);
}
// 주문 정보 저장
public void saveOrder(Order order) {
em.persist(order);
}
// 주문 상품 저장
public void saveOrderItem(OrderItem orderItem) {
em.persist(orderItem);
}
}
package com.oracle.oBootJpa03.domain;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Data
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
// Member Entity의 member_id에 의해 연결
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
// 배송 정보
@OneToOne
@JoinColumn(name = "delivery_id")
private Delivery delivery;
// 주문 시간
private LocalDateTime orderdate;
// 주문 상태[ ORDER / CANCEL ]
@Enumerated(EnumType.STRING)
private OrderStatus status;
//==연관관계 메서드==//
public void setMember(Member member) {
this.member = member;
member.getOrders().add(this);
}
// 생성자를 만들어 외부에서 저장
public static Order createOrder(Member member, Delivery delivery) {
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
order.setStatus(OrderStatus.ORDER); // 현재 주문 상태
order.setOrderdate(LocalDateTime.now()); // now -> 현재 날짜
// 필요시 재고 처리
// item.removeStock(count)
return order;
}
}
package com.oracle.oBootJpa03.domain.item;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import com.oracle.oBootJpa03.domain.Order;
import lombok.Data;
@Entity
@Data
@Table(name = "order_item")
@SequenceGenerator(
name = "order_item_seq",
sequenceName = "order_item_sequence",
initialValue = 1,
allocationSize = 1
)
public class OrderItem {
protected OrderItem() {
}
@Id
@Column(name = "order_item_id")
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "order_item_seq"
)
private Long id;
@ManyToOne
@JoinColumn(name = "item_id")
private Item item; // 주문 상품
@ManyToOne
@JoinColumn(name = "order_id")
private Order order; // 주문
private int orderPrice; // 주문가격
private int count; // 주문수량
// 생성 메서드( createOrderItem() ): 주문상품, 가격, 수량 정보를 주문상품을 엔티티를 생성
public static OrderItem createOrderItem(Item item, int orderPrice, int count) {
OrderItem orderItem = new OrderItem();
orderItem.setItem(item);
orderItem.setOrderPrice(orderPrice);
orderItem.setCount(count);
return orderItem;
}
}
- Delivery.java, Order.java 에 시퀀스 없어서 @GeneratedValue 선언
- application.yml을 none이 아닌 update로 저장
package com.oracle.oBootJpa03.controller;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.oracle.oBootJpa03.domain.Member;
import com.oracle.oBootJpa03.domain.Order;
import com.oracle.oBootJpa03.domain.OrderSearch;
import com.oracle.oBootJpa03.domain.item.Item;
import com.oracle.oBootJpa03.service.ItemService;
import com.oracle.oBootJpa03.service.MemberService;
import com.oracle.oBootJpa03.service.OrderService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
private final MemberService memberService;
private final ItemService itemService;
// 회원, 아이템 불러오기
@GetMapping(value = "/order")
public String createOrderForm(Model model) {
log.info("OrderController createOrderForm Start...");
List<Member> members = memberService.findMembers();
List<Item> items = itemService.findItems();
model.addAttribute("members", members);
model.addAttribute("items", items);
return "order/orderForm";
}
// 주문 저장
@PostMapping(value = "/orderSave")
public String orderSave(@RequestParam("memberId") Long memberId,
@RequestParam("itemId") Long itemId,
@RequestParam("count") int count) {
log.info("OrderController orderSave start...");
orderService.order(memberId, itemId, count);
return "redirect:/";
}
// 주문내역
@GetMapping(value = "/orders")
public String orderList(@ModelAttribute("orderSearch") OrderSearch search, Model model) {
log.info("OrderController orderList start...");
List<Order> orders = orderService.findOrders();
model.addAttribute("orders", orders);
return "order/orderList";
}
}
package com.oracle.oBootJpa03.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.oracle.oBootJpa03.domain.Delivery;
import com.oracle.oBootJpa03.domain.DeliveryStatus;
import com.oracle.oBootJpa03.domain.Member;
import com.oracle.oBootJpa03.domain.Order;
import com.oracle.oBootJpa03.domain.OrderSearch;
import com.oracle.oBootJpa03.domain.item.Item;
import com.oracle.oBootJpa03.domain.item.OrderItem;
import com.oracle.oBootJpa03.repository.ItemRepository;
import com.oracle.oBootJpa03.repository.MemberRepository;
import com.oracle.oBootJpa03.repository.OrderRepository;
import lombok.RequiredArgsConstructor;
@Service
@Transactional
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
private final MemberRepository memberRepository;
private final ItemRepository itemRepository;
// 1. Delivery Save
// 2. Order Save
// 3. OrderItem Save
// 4. 재고 --> X, OrderItem은 하나만 처리
public void order(Long memberId, Long itemId, int count) {
// 엔티티 조회
Member member = memberRepository.findOne(memberId);
Item item = itemRepository.findOne(itemId);
// 1.배송정보 생성(Member 주소배송 가정)
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
delivery.setStatus(DeliveryStatus.READY); // 배송준비
// 배송정보 저장
orderRepository.saveDelivery(delivery);
System.out.println("OrderService delivery.getId()->"+delivery.getId());
System.out.println("OrderService item.getId()->"+item.getId());
System.out.println("OrderService member.getId()->"+member.getId());
// 2-1. 주문생성(연관관계 형성)
Order order = Order.createOrder(member, delivery);
// 2-2. 주문저장
orderRepository.saveOrder(order);
// 3. 주문상품 생성
// OrderItme orderItem = new OrderItem() --> 연관관계 Mapping 처리 위해
OrderItem orderItem = OrderItem.createOrderItem(item, item.getPrice(), count);
orderItem.setOrder(order);
orderRepository.saveOrderItem(orderItem);
}
// 주문 내역
public List<Order> findOrders() {
System.out.println("OrderService findOrders Start...");
List<Order> findOrderList = orderRepository.findAll();
System.out.println("OrderService findOrders orderList.size()->"+findOrderList.size());
return findOrderList;
}
}
package com.oracle.oBootJpa03.repository;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import com.oracle.oBootJpa03.domain.Delivery;
import com.oracle.oBootJpa03.domain.Order;
import com.oracle.oBootJpa03.domain.item.OrderItem;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class OrderRepository {
private final EntityManager em;
// 배송 정보 저장
public void saveDelivery(Delivery delivery) {
em.persist(delivery);
}
// 주문 정보 저장
public void saveOrder(Order order) {
em.persist(order);
}
// 주문 상품 저장
public void saveOrderItem(OrderItem orderItem) {
em.persist(orderItem);
}
// 주문 내역
public List<Order> findAll() {
List<Order> orderList = em.createQuery("select o from Order o", Order.class)
.getResultList();
System.out.println("OrderRepository orderList.size()->"+orderList.size());
return orderList;
}
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<table border="1">
<thead>
<tr>
<th>#</th>
<th>회원명</th>
<th>배송지</th>
<th>상태</th>
<th>일시</th>
</tr>
</thead>
<tbody>
<tr th:each="order : ${orders}">
<td th:text="${order.id}"></td>
<td th:text="${order.member.name}"></td>
<td th:text="${order.delivery.address.city}"></td>
<td th:text="${order.status}"></td>
<td th:text="${order.orderDate}"></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
commit이 들어가는 곳에만 Transactional를 걸어주고 아닌 곳에는 readOnly를 걸어줌
모든 엔티티를 같이 로딩하는 것
장점 : 연관된 엔티티를 모두 가져옴
단점 : 실무에서 엔티티간의 관계가 복잡해질수록 조인으로 인한 성능 저하를 피할 수 없음
주문내역 실행 시켰을 때 sql
select order0_.order_id as order_id1_4_, order0_.delivery_id as delivery_id4_4_, order0_.member_id as member_id5_4_, order0_.orderdate as orderdate2_4_, order0_.status as status3_4_ from orders order0_
select delivery0_.delivery_id as delivery_id1_0_0_, delivery0_.city as city2_0_0_, delivery0_.street as street3_0_0_, delivery0_.zipcode as zipcode4_0_0_, delivery0_.status as status5_0_0_ from delivery delivery0_ where delivery0_.delivery_id=?
select member0_.member_id as member_id1_2_0_, member0_.city as city2_2_0_, member0_.street as street3_2_0_, member0_.zipcode as zipcode4_2_0_, member0_.name as name5_2_0_ from member3 member0_ where member0_.member_id=?
select delivery0_.delivery_id as delivery_id1_0_0_, delivery0_.city as city2_0_0_, delivery0_.street as street3_0_0_, delivery0_.zipcode as zipcode4_0_0_, delivery0_.status as status5_0_0_ from delivery delivery0_ where delivery0_.delivery_id=?
select member0_.member_id as member_id1_2_0_, member0_.city as city2_2_0_, member0_.street as street3_2_0_, member0_.zipcode as zipcode4_2_0_, member0_.name as name5_2_0_ from member3 member0_ where member0_.member_id=?
가능한 객체의 초기화를 지연시키는데 사용하는 패턴
장점
1. 다른 접근 방식보다 훨씬 적은 초기의 로딩 시간
2. 다른 접근 방식에 비해 메모리 소비량 감소
단점 : 초기화가 지연되면 원하지 않는 순간 성능에 영향을 줄 수 있음
필요한 sql만 실행
select member0_.member_id as member_id1_2_0_, member0_.city as city2_2_0_, member0_.street as street3_2_0_, member0_.zipcode as zipcode4_2_0_, member0_.name as name5_2_0_ from member3 member0_ where member0_.member_id=?
select delivery0_.delivery_id as delivery_id1_0_0_, delivery0_.city as city2_0_0_, delivery0_.street as street3_0_0_, delivery0_.zipcode as zipcode4_0_0_, delivery0_.status as status5_0_0_ from delivery delivery0_ where delivery0_.delivery_id=?
select member0_.member_id as member_id1_2_0_, member0_.city as city2_2_0_, member0_.street as street3_2_0_, member0_.zipcode as zipcode4_2_0_, member0_.name as name5_2_0_ from member3 member0_ where member0_.member_id=?
select delivery0_.delivery_id as delivery_id1_0_0_, delivery0_.city as city2_0_0_, delivery0_.street as street3_0_0_, delivery0_.zipcode as zipcode4_0_0_, delivery0_.status as status5_0_0_ from delivery delivery0_ where delivery0_.delivery_id=?