Store 엔티티
package com.metacoding.storev1.store;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor // JPA가 ObjectMapping을 위해 new할 때 사용함.
@Table(name = "store_tb")
@Entity // 설정파일에서 테이블을 생성해준다.
public class Store {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer stock; // 재고
private Integer price;
public void 재고감소(int qty) {
this.stock = this.stock - qty;
}
}
핵심 요약
- JPA 엔티티 매핑
@Entity
: JPA가 관리하는 객체임을 선언.@Table(name = "store_tb")
: 실제 테이블명을store_tb
로 지정.@Id
:id
를 기본 키(PK)로 설정.@GeneratedValue(strategy = GenerationType.IDENTITY)
: DB에서 자동 증가(AUTO_INCREMENT).
- JPA에서 기본 생성자 필수
@NoArgsConstructor
: JPA가 내부적으로 리플렉션을 사용할 때 기본 생성자가 필요하므로 추가.
- Getter 제공
@Getter
: 필드 값을 읽을 수 있도록 Lombok을 사용하여 자동 생성.
StoreController
package com.metacoding.storev1.store;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import jakarta.servlet.http.HttpServletRequest;
@Controller // IoC(제어의 역전) => HashSet
public class StoreController {
private StoreService storeService;
public StoreController(StoreService storeService) {
this.storeService = storeService;
}
@GetMapping("/")
public String list(HttpServletRequest request) { // MVC
List<Store> storeList = storeService.상품목록();
request.setAttribute("models", storeList);
return "store/list";
}
@GetMapping("/store/{id}")
public String detail(@PathVariable("id") int id, HttpServletRequest request) {
Store store = storeService.상세보기(id);
request.setAttribute("model", store);
return "store/detail";
}
@GetMapping("/store/{id}/update-form")
public String updateForm(@PathVariable("id") int id, HttpServletRequest request) {
request.setAttribute("model", storeService.상세보기(id));
return "store/update-form";
}
// 2번 : board 프로젝트의 BoardController 참고
@PostMapping("/store/{id}/delete")
public String delete(@PathVariable("id") int id) {
storeService.상품삭제(id);
return "redirect:/";
}
@GetMapping("/store/save-form")
public String saveForm() {
return "store/save-form";
}
@PostMapping("/store/save")
public String save(@RequestParam("name") String name, @RequestParam("stock") int stock,
@RequestParam("price") int price) {
storeService.상품등록(name, stock, price);
return "redirect:/";
}
@PostMapping("/store/{id}/update")
public String update(@PathVariable("id") int id,
@RequestParam("name") String name,
@RequestParam("stock") int stock,
@RequestParam("price") int price) {
storeService.상품수정(id, name, stock, price);
return "redirect:/store/" + id;
}
}
기능 | HTTP 메서드 | URL | 설명 |
상품 목록 조회 | GET | / | 모든 상품을 조회 |
상품 상세 조회 | GET | /store/{id} | 특정 상품을 조회 |
상품 등록 페이지 | GET | /store/save-form | 상품 등록 페이지 표시 |
상품 등록 | POST | /store/save | 상품을 등록 |
상품 수정 페이지 | GET | /store/{id}/update-form | 상품 수정 페이지 표시 |
상품 수정 | POST | /store/{id}/update | 상품 정보를 수정 |
상품 삭제 | POST | /store/{id}/delete | 특정 상품을 삭제 |
StoreRepository
package com.metacoding.storev1.store;
import java.util.List;
import org.springframework.stereotype.Repository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
@Repository
public class StoreRepository {
private EntityManager em;
public StoreRepository(EntityManager em) {
this.em = em;
}
// 1번 : board 프로젝트의 BoardRepository 참고
public void deleteByid(int id) {
Query query = em.createNativeQuery("delete from store_tb where id = ?");
query.setParameter(1, id);
query.executeUpdate();
}
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 Store findById(int id) {
Query query = em.createNativeQuery("select * from store_tb where id = ?", Store.class);
query.setParameter(1, id);
try {
return (Store) query.getSingleResult();
} catch (Exception e) { // NoResultException
return null;
}
}
public List<Store> findAll() {
// 조건 : 오브젝트 매핑은 @Entity가 붙어야지만 가능하다. (디폴트 생성자를 호출)
Query query = em.createNativeQuery("select * from store_tb order by id desc", Store.class);
return query.getResultList();
}
public void updateById(int id, String name, int stock, int price) {
Query query = em.createNativeQuery("update store_tb set name = ?, stock = ?, price=? where id = ?");
query.setParameter(1, name);
query.setParameter(2, stock);
query.setParameter(3, price);
query.setParameter(4, id);
query.executeUpdate();
}
}
CRUD(생성, 조회, 수정, 삭제) 작업을 처리
StoreService
package com.metacoding.storev1.store;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class StoreService {
private StoreRepository storeRepository;
public StoreService(StoreRepository storeRepository) {
this.storeRepository = storeRepository;
}
// 3번 : board 프로젝트의 BoardService 참고
@Transactional // insert, delete, update시에 사용 : 함수 종료시 commit 됨
public void 상품삭제(int id) {
// 1. 상품 있어?
Store store = storeRepository.findById(id);
if (store == null)
throw new RuntimeException("상품없어");
// 3. 삭제
storeRepository.deleteByid(id); // write (DML = insert, delete, update)
}
@Transactional
public void 상품등록(String name, int stock, int price) {
storeRepository.save(name, stock, price);
}
public List<Store> 상품목록() {
List<Store> storeList = storeRepository.findAll();
return storeList;
}
public Store 상세보기(int id) {
Store store = storeRepository.findById(id);
return store;
}
@Transactional
public void 상품수정(int id, String name, String stock, String price) {
// 1. 상품 조회
Store store = storeRepository.findById(id);
// 2. 없으면 예외 터트리기
if (store == null)
throw new RuntimeException("상품없어");
// 3. 상품 수정
storeRepository.updateById(id, name, stock, price);
}
}
- 상품 삭제: 상품이 존재하는지 확인하고, 없으면 예외를 던진 후 삭제 처리.
- 상품 등록:
storeRepository.save()
를 통해 상품을 등록.
- 상품 목록:
storeRepository.findAll()
로 전체 상품 목록을 조회.
- 상품 상세보기:
storeRepository.findById()
로 특정 상품을 조회.
- 상품 수정: 상품 존재 여부를 확인 후 수정 처리.
Storev1Application
package com.metacoding.storev1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Storev1Application {
public static void main(String[] args) {
SpringApplication.run(Storev1Application.class, args);
}
}
Share article