본문 바로가기

spring boot

실전! 스프링 부트와 JPA 활용1 - 7주차

마지막!

 

7주차

1. 홈 화면과 레이아웃

 

home.html로 이동하는 HomeController 등록

html에는 타임리프 템플릿을 등록한다.

html, css는 그닥 안중요하니까 패스

css가 적용이 안되는 문제가 있었는데 https://getbootstrap.com/docs/4.3/getting-started/download/

 

Download

Download Bootstrap to get the compiled CSS and JavaScript, source code, or include it with your favorite package managers like npm, RubyGems, and more.

getbootstrap.com

여기서 알맞은 버전(4.3.1) 설치하고 다시 실행시키니까 됐다.


2. 회원 등록

 

폼 객체를 이용하여 화면 계층과 서비스 계층을 명확하게 분리함.


3. 회원 목록 조회

 

package jpabook.jpashop.controller;
@Controller
@RequiredArgsConstructor
public class MemberController {
 //추가
 @GetMapping(value = "/members")
 public String list(Model model) {
 List<Member> members = memberService.findMembers();
 model.addAttribute("members", members); 
 return "members/memberList";
 }
}

조회한 상품을 뷰에 전달하기 위해 스프링 MVC가 제공하는 모델 객체에 보관한다.

그리고 실행할 뷰 이름을 반환한다.

요구사항이 단순하면 폼 객체 없이 엔티티를 직접 사용해도 되지만, 복잡할 수록 엔티티의 유지보수가 어려워진다.

특히 실무에서는 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야 한다.

즉, 화면이나 API에 맞는 폼 객체나 DTO를 사용한다.


4&5. 상품 등록 & 상품 목록

 

회원과 비슷하다.


6. 상품 수정

package jpabook.jpashop.web;
import jpabook.jpashop.domain.item.Book;
import jpabook.jpashop.domain.item.Item;
import jpabook.jpashop.service.ItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;import org.springframework.web.bind.annotation.*;
import java.util.List;
@Controller
@RequiredArgsConstructor
public class ItemController {
 /**
 * 상품 수정 폼
 */
 @GetMapping(value = "/items/{itemId}/edit")
 public String updateItemForm(@PathVariable("itemId") Long itemId, Model 
model) {
 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) {
 Book book = new Book();
 book.setId(form.getId());
 book.setName(form.getName());
 book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuantity());
 book.setAuthor(form.getAuthor());
 book.setIsbn(form.getIsbn());
 itemService.saveItem(book);
 return "redirect:/items";
 }
}

7. 변경 감지와 병합(merge)

 

준영속 엔티티 : 영속성 컨텍스트가 더는 관리하지 않는 엔티티. 즉, 이미 DB에 한번 저장되어서 식별자가 존재한다.

(위에서 itemService.saveItem(book)에서 수정을 시도하는 Book 객체)

이러한 준영속 엔티티를  수정하는 방법은 변경 감지 기능 or 병합(merge) 기능 사용 2가지가 있다.

 

① 변경 감지 기능 사용

@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한
다.
 findItem.setPrice(itemParam.getPrice()); //데이터를 수정한다.
}

② 병합 사용

@Transactional
void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
 Item mergeItem = em.merge(itemParam); // 영속 상태로 변경
}

엔티티를 변경할 때는 항상 변경 감지를 사용하도록 한다.


8&9. 상품 주문 & 주문 목록 검색, 취소

 

위와 비슷.

성공1
성공2...안예뻐!


오류 수정

 

중간에 css 적용이 잘 안되길래...out폴더를 실수로 삭제했다ㅜ

복구가 안되구 멀쩡하던 로컬호스트 연결도 안되고 멘붕이였는데 다행히 오른쪽 위 초록 망치(bulid) 버튼을 누르면 다시 생성되는 폴더였다 휴^^

css적용은 out폴더랑 상관없고 그냥 버전 + 다시 실행 문제인듯

에러ㅜㅜ

There is already 'Controller' bean method

중복되는 method가 있음. terminal에서 다 알려주니까 찾아서 고치거나 삭제하자.