로그 출력
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger log = LoggerFactory.getLogger(getClass());
@Slf4j // 롬복 사용 시, @Slf4j 어노테이션으로 등록이 가능하다
📍home.html
<head th:replace="fragments/header :: header">
<div th:replace="fragments/bodyHeader :: bodyHeader" />
templates/fragments package 생성
header,bodyHeader 등 작성하여 사용한다.
html 변경 시 recompile로 확인 ctrl+shift+f5
폼 객체를 사용해서 화면 계층과 서비스 계층을 명확하게 분리 !
public String create(@Valid MemberForm memberForm){
}
@Valid
Spring에서는 메서드 레벨 유효성 검증을 위해 @Valid 어노테이션을 사용또한 유효성 검사를 위해 멤버 속성을 표시하는 데에도 이를 사용합니다. 그러나 @Valid 어노테이션은 그룹 유효성 검사를 지원하지 않습니다.
조회한 상품을 뷰에 전달하기 위해 모델(Model) 객체에 보관
-> 실행할 뷰 이름을 반환
폼 객체 vs 엔티티 직접 사용
엔티티 : 요구사항이 복잡해질 경우, 종속적으로 변하며 유지보수 어려움
=> 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직 X
화면 / API = 폼 객체나 DTO 사용
public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {
...
}
public String updateItem(@ModelAttribute("form") BookForm form) {
...
}
@PathVariable
: Rest API 호출 시, URI 값에 가변형 변수 전달해서 처리하는 방식
@ModelAttribute
: Http Body 내용과 Http 파라미터 값들을 Getter,Setter,생성자를 통해 주입하기 위해 사용
=> 일반 변수 전달 불가능 only model 객체를 통해서 전달해야 함
영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.
@Transactional
void update(Item itemParam) {
//itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티 조회
findItem.setPrice(itemParam.getPrice()); //데이터 수정
}
@Transactional
void update(Item itemParam) {
Item mergeItem = em.merge(itemParam);
}
- 병합 동작 방식
1. 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다.
2. 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다.(병합한다.)
3. 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행
엔티티를 변경할 때는 항상 변경 감지를 사용
주문 폼 이동
1. 메인 화면에서 상품 주문을 선택하면 /order 를 GET 방식으로 호출
= OrderController 의 createForm() 메서드
2. 주문할 고객정보와 상품 정보가 필요하므로 model 객체에 담아서 뷰에 넘겨줌