[스프링부트] 21. 상점 v1 최종 (Store)

백하림's avatar
Mar 21, 2025
[스프링부트] 21. 상점 v1 최종 (Store)

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; } }
💡

핵심 요약

  1. JPA 엔티티 매핑
      • @Entity: JPA가 관리하는 객체임을 선언.
      • @Table(name = "store_tb"): 실제 테이블명을 store_tb로 지정.
      • @Id: id를 기본 키(PK)로 설정.
      • @GeneratedValue(strategy = GenerationType.IDENTITY): DB에서 자동 증가(AUTO_INCREMENT).
  1. JPA에서 기본 생성자 필수
      • @NoArgsConstructor: JPA가 내부적으로 리플렉션을 사용할 때 기본 생성자가 필요하므로 추가.
  1. 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

harimmon