item_reg.html 작성

<!DOCTYPE html>
<html lang="en" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
  <title>상품 등록 페이지</title>
  <div th:replace="/fragments/header.html :: header"></div>
</head>
<body>
<div th:replace="/fragments/nav.html :: nav"></div>

<div class="container">
  <h1>상품 등록</h1>
  <form th:action="@{/item/item_reg}" method="post">
    <div class="mb-3">
      <label for="name" class="form-label">상품명</label>
      <input type="text" class="form-control" id="name" name="name" required>
    </div>
    <div class="mb-3">
      <label for="price" class="form-label">가격</label>
      <input type="number" class="form-control" id="price" name="price" required>
    </div>
    <div class="mb-3">
      <label for="count" class="form-label">재고</label>
      <input type="number" class="form-control" id="count" name="count" required>
    </div>
    <div class="mb-3">
      <label for="content" class="form-label">상품 설명</label>
      <textarea class="form-control" id="content" name="content" required></textarea>
    </div>

    <button type="submit" class="btn btn-primary">상품 등록</button>
  </form>
</div>
</body>
</html>

ItemDto 작성

@Data
public class ItemDto {

    private String name;
    private String content;
    private int price;
    private int count;
    private Member member;

    public Item toEntity(){
        return Item.builder()
                .name(name)
                .content(content)
                .price(price)
                .count(count)
                .member(member)
                .build();
    }
}

ItemController 추가

@Controller
@RequestMapping("/item")
@RequiredArgsConstructor
public class ItemController {

    private final ItemService itemService;

    /**
     * 상품등록 페이지
     */
    @GetMapping("/item_reg")
    public String item_reg(){
        return "item/item_reg";
    }

    @PostMapping("/item_reg")
    public String item_reg(@ModelAttribute ItemDto itemDto, Principal principal){
        itemService.item_reg(itemDto, principal.getName());
        return "redirect:/";
    }
}

/item/item_reg 경로로 GET요청시 item_reg.html 리턴
/item/item_reg 경로로 POST요청시
@ModelAttribute 어노테이션을 이용하여 item_reg.html의 form의 value를
ItemDto와 매핑하고
Principal객체로 현재 사용자 정보를 service로넘겨준뒤
"/" 경로로 redirect한다.

ItemService 추가

ItemService

public interface ItemService {
    List<Item> itemList();
    void item_reg(ItemDto itemDto, String email); // 추가
}

ItemServiceImpl 추가

@Service
@RequiredArgsConstructor
public class ItemServiceImpl implements ItemService {

    private final ItemRepository itemRepository;
    private final MemberRepository memberRepository;

    public List<Item> itemList(){
        return itemRepository.findAll();
    }

    // 추가 
    public void item_reg(ItemDto itemDto, String email){
        Member member = memberRepository.findByEmail(email);
        itemDto.setMember(member);

        itemRepository.save(itemDto.toEntity());
    }

}

controller에서 넘겨준 itemDto와 현재사용자이름으로
MemberRepository에서 조회한 후 itemDto에 member로 추가
toEntity메서드로 변환하여 DB에 save한다.

index.html 추가

    <div sec:authorize="hasAuthority('SELLER')">
        <a class="btn btn-primary" href="/item/item_reg">상품 등록</a>
    </div>

테이블 하단에 상품등록 버튼을 추가해주었다.
sec:authorize="hasAuthority('SELLER')" : 현재 사용자 권한이 SELLER일때만 표시

Junyoung.dev