inblog logo
|
harimmon
    스프링부트

    [스프링부트] 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

    RSS·Powered by Inblog