국비학원_71일차(Spring JPA5)

써니·2022년 11월 2일
0

spring

목록 보기
13/23

Spring JPA

🔻oBootJpa03

✍상품수정

[com.oracle.oBootJpa03.controller]

  • ItemController.java
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";

    }
}

[com.oracle.oBootJpa03.service]

  • ItemService.java
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());
	}
}

[com.oracle.oBootJpa03.repository]

  • ItemRepository.java
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;
    }
}



🧾주문폼

[templates.order]

  • orderFrom.html
    값으로 데이터를 가져오고 보여주는 건 이름으로 보여줌
<!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>

[com.oracle.oBootJpa03.controller]

  • OrderController.java
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";
	}
}

[com.oracle.oBootJpa03.service]

  • OrderService.java
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;
}

[com.oracle.oBootJpa03.repository]

  • OrderRepository.java
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;
}




💾주문저장

[com.oracle.oBootJpa03.domain.item]

  • OrderItem.java
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; // 주문수량
}

[com.oracle.oBootJpa03.controller]

  • OrderController.java
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:/";
	}
}

[com.oracle.oBootJpa03.service]

  • OrderService.java
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);
		
	}
}

[com.oracle.oBootJpa03.repository]

  • OrderRepository.java
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);
	}
}

[com.oracle.oBootJpa03.domain]

  • Order.java
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;
	}
}

[com.oracle.oBootJpa03.domain.order]

  • OrderItem.java
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로 저장




📝주문내역

[com.oracle.oBootJpa03.controller]

  • OrderController.java
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";
	}
}

[com.oracle.oBootJpa03.service]

  • OrderService.java
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;
	}
}

[com.oracle.oBootJpa03.repository]

  • OrderRepository.java
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;
	}
}

[templates.order]

  • orderList.html
<!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>


📈Service 부분 성능 향상

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=?

0개의 댓글