JPA1 - 웹 계층 개발

young·2023년 5월 15일
0

Spring Boot

목록 보기
13/19
post-thumbnail

🖇️홈 화면과 레이아웃

로그 출력

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 사용

🖇️상품 등록

  1. 상품 등록 폼에서 데이터를 입력하고 Submit 버튼을 클릭 시 /items/new 를 POST 방식으로 요청
  2. 상품 저장이 끝나면 상품 목록 화면 redirect:/items 으로 리다이렉트

🖇️상품 목록

  • model 에 담아둔 상품 목록인 items 를 꺼내서 상품 정보를 출력

🖇️상품 수정

상품 수정 폼 이동

  1. 수정 버튼 클릭 시, /items/{itemId}/edit URL을 GET방식으로 요청
  2. updateItemForm() 메서드를 실행 시, itemService.findOne(itemId)호출해서 수정할 상품 조회
  3. 조회 결과 model 객체에 담아 items/updateItemForm에 전달
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 객체를 통해서 전달해야 함

상품 수정 실행

  1. 상품 수정 폼에서 정보를 수정 후, Submit 버튼을 선택
  2. /items/{itemId}/edit URL을 POST 방식으로 요청하고updateItem() 메서드를 실행
  3. 이때 컨트롤러에 파라미터로 넘어온 item 엔티티 인스턴스는 현재 준영속 상태
    => 영속성 컨텍스트의 지원을 받을 수 없고 데이터를 수정해도 변경 감지 기능은 동작X

🖇️변경 감지와 병합(merge)

준영속 엔티티?

영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다.

  • 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준영속 엔티티로 볼 수 있다.
  1. 변경 감지 기능
 @Transactional
void update(Item itemParam) { 
//itemParam: 파리미터로 넘어온 준영속 상태의 엔티티
    Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티 조회
    findItem.setPrice(itemParam.getPrice()); //데이터 수정
    }
  • 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법
    1. 트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택
    2. 트랜잭션 커밋 시점에 변경 감지(Dirty Checking) 동작
    3. 데이터베이스에 UPDATE SQL 실행
  1. 병합 사용
@Transactional
void update(Item itemParam) { 
	Item mergeItem = em.merge(itemParam);
}
  • 병합 동작 방식
    1. 준영속 엔티티의 식별자 값으로 영속 엔티티를 조회한다.
    2. 영속 엔티티의 값을 준영속 엔티티의 값으로 모두 교체한다.(병합한다.)
    3. 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행

⚠️ Merge사용하는것보다 변경감지 사용 추천 !

엔티티를 변경할 때는 항상 변경 감지를 사용

  • 컨트롤러에서 어설프게 엔티티를 생성 X
  • 트랜잭션이 있는 서비스 계층에 식별자(id)와 변경할 데이터를 명확하게 전달 (파라미터 or dto)
  • 트랜잭션이 있는 서비스 계층에서 영속 상태의 엔티티를 조회하고, 엔티티의 데이터를 직접 변경
  • 트랜잭션 커밋 시점에 변경 감지가 실행됨

🖇️상품 주문

주문 폼 이동
1. 메인 화면에서 상품 주문을 선택하면 /orderGET 방식으로 호출
= OrderController 의 createForm() 메서드
2. 주문할 고객정보와 상품 정보가 필요하므로 model 객체에 담아서 뷰에 넘겨줌

🖇️주문 목록 검색, 취소

  • 주문이 끝나면 상품 주문 내역이 있는 /orders URL로 리다이렉트
profile
ฅʕ•̫͡•ʔฅ

0개의 댓글