header
<!DOCTYPE html>
<html lang="en">
<head>
<title>Store</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/">Home</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/join-form">회원가입</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/login-form">로그인</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/store/list">상품목록</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/store/save-form">상품등록</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">구매목록</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/logout">로그아웃</a>
</li>
</ul>
</div>
</div>
</nav>
<!--네브바종료-->
StoreController
package com.metacoding.storev2.store;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@RequiredArgsConstructor
@Controller
public class StoreController {
private final StoreService storeService;
@GetMapping("/store/save-form")
public String saveForm() {
return "store/save-form";
}
@PostMapping("/store/save")
public String save(StoreRequest.SaveDTO saveDTO) {
System.out.println("name: " + saveDTO.getName());
System.out.println("stock: " + saveDTO.getStock());
System.out.println("price: " + saveDTO.getPrice());
storeService.상품등록(saveDTO);
return "redirect:/";
}
@GetMapping("/store/list")
public String list(HttpServletRequest request) {
List<Store> storeList = storeService.상품목록();
request.setAttribute("models", storeList);
return "store/list";
}
}
StoreService
package com.metacoding.storev2.store;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@RequiredArgsConstructor
@Service
public class StoreService {
private final StoreRepository storeRepository;
@Transactional
public void 상품등록(StoreRequest.SaveDTO saveDTO) {
storeRepository.save(saveDTO.getName(), saveDTO.getStock(), saveDTO.getPrice());
}
public List<Store> 상품목록() {
List<Store> storeList = storeRepository.findAll();
return storeList;
}
}
StoreRepository
package com.metacoding.storev2.store;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@RequiredArgsConstructor
@Repository
public class StoreRepository {
private final EntityManager em;
public void save(String name, int stock, int price) {
Query query = em.createNativeQuery("insert into store_tb (name, stock, price) values (?, ?, ?)");
query.setParameter(1, name);
query.setParameter(2, stock);
query.setParameter(3, price);
query.executeUpdate();
}
public List<Store> findAll() {
Query query = em.createNativeQuery("select * from store_tb order by id desc", Store.class);
return query.getResultList();
}
}
store/list
{{> layout/header}}
<div class="container mt-2">
<table class="table table-hover">
<thead>
<tr>
<th>번호</th>
<th>상품명</th>
<th>상세보기</th>
</tr>
</thead>
<tbody>
{{#models}}
<tr>
<td>{{id}}</td>
<td>{{name}}</td>
<td><a href="#">상세보기</a></td>
</tr>
{{/models}}
</tbody>
</table>
</div>
</body>
</html>
Share article