Contents
1단계 순서 및 중요 내용 정리- 들어가기 전, 간단한 정리
이름 : gwaill nara / 과일나라
중요 흐름
요청 >> controller >> Service >> Repository >> DB
작업순서
DB >> Repository >> Service >> Controller >> 고객
: 작업 순서는 Controller부터 가는 것이 있고 Repository에서 가는 것이 있는데
이번에는 바로 위의 순서를 따랐다.
⭐ 중요 특징
1) Repository : 쿼리
💫중요 쿼리(”” 편의상 생략)
- Update 해당_tb set 인수=?, … where id=?
- Insert into 해당_tb(인수들, created_at) values(?,?…,now())
- delete from 해당_tb where id=?
- select * from 해당_tb order by id desc
2) Service : 연결, 서비스,
-transitional(안으로 보면 2가지 정도의 단계이나 밖에서 봤을 때 하나의 일 ⇒ 그래서 잠깐 멈춰,일을 동기적으로? 순차적으로 해결)
3) Controller 요청에 대한 뷰 반환 및 길잡이
- Postmapping : 자료 서버에 입력/생성
- getmapping : 자료 서버에 요청
1단계 순서 및 중요 내용 정리
- 프로젝트 생성 및 환경설정
-의존
-야물 및 테이블 생성
-MySQL Workbench에 데이터베이스(fruitmarket) 생성
- view 생성 및 view 연결
-뷰/페이지에 따른 순서보다 기능별 생성에 따른 순서를 따르는 것이 디버깅하기 쉽다.
-해당 뷰와 기능별 url 연결, 입력시켜주기. 
1) 메인페이지 : 상품목록보기

(1) Repository
-제품을 리스트로 담아서 다 가져와
public List<Product> findAll() {
Query query = em.createNativeQuery("select * from product_tb order by id desc", Product.class);
return query.getResultList();
}
(2) Service
-해당 제품의 정보를 전부 List에 담아와. 그리고 리턴할 때는 그 리스트의 값을 하나씩 스트림에 뿌려서 가공해서 객체로 다시 만들어 하나씩 컬렉션에 담아줘
//상품 목록보기
public List<ProductResponse.ListDTO> getProductList(){
List<Product> productList = productRepository.findAll();
return productList.stream().map(ProductResponse.ListDTO::new)
.collect(Collectors.toList());
}
(3)Controller
-해당 url이 오면 return 값으로 가줘
-요청 값을 받아와서 리스트에 담을 건데
응답 DTO에 해당 제품LIST를 가져올거야. 그것들의 이름과 속성은 productlist야
@GetMapping({"/product", "/"})
public String list(HttpServletRequest request){
List<ProductResponse.ListDTO> productList = productService.getProductList();
request.setAttribute("productList", productList);
return "product/list";
}
2) 상품 등록하기
(1)Repository
-받아온 새로운 상품의 정보들(dto)을 디비에 입력.
//상품등록
public void save(ProductRequest.SaveDTO reqDTO){
Query query = em.createNativeQuery("insert into product_tb(name, price,qty,created_at) values (?,?,?,now())");
query.setParameter(1, reqDTO.getName());
query.setParameter(2, reqDTO.getPrice());
query.setParameter(3, reqDTO.getQty());
query.executeUpdate();
}
(2)Service
-메서드 이름 헷갈리지 않게 이해하기 쉽게 만들자(addProduct)
-db에 영향 있는 거니까 @Transactional 걸어주고 dto로 상품 담아서 레파지토리에 저장.
//상품 등록하기
@Transactional
public void addProduct(ProductRequest.SaveDTO reqDTO){
productRepository.save(reqDTO);
}
(3)Controller
-새로운 상품 등록하기 위해 요청이 들어오면 그걸 저장 dto에 담아 서비스로 던짐.
-폼은 해당 url 요청이 오면 해당 페이지 보여줌.(담을 정보는 없음.)
//상품등록하기
@PostMapping("/product/save")
public String save(ProductRequest.SaveDTO reqDTO){
productService.addProduct(reqDTO);
return "redirect:/";
}
@GetMapping("/product/save-form")
public String saveForm(){
return "/product/save-form";
}
3) 상품 상세보기
(1)Repository
-해당 id를 통해 제품의 정보들을 찾아와줘
//상품상세보기
public Product findById(int id){
Query query = em.createNativeQuery("select * from product_tb where id=?", Product.class);
query.setParameter(1,id);
return (Product) query.getSingleResult();
}
(2)Service
-id를 통해 정보들을 dto에 받아와서 레파지토리에 던짐
//상품 상세보기
public ProductResponse.DetailDTO getProductDetail(Integer id){
Product product = productRepository.findById(id);
return new ProductResponse.DetailDTO(product);
}
(3)Controller
-id와 요청이 들어오면 그것을 dto로 담았고 그것을 product라고 속성을 정해주자. 그리고 그것을 서비스에 던짐.
//상품상세보기
@GetMapping("/product/{id}")
public String detail(@PathVariable Integer id, HttpServletRequest request){
ProductResponse.DetailDTO product = productService.getProductDetail(id);
request.setAttribute("product",product);
return "product/detail";
}
4) 상품 수정하기
(1)Repository
-해당 id의 수정의 내용을 받아와 db에 쿼리 입력
//상품 수정하기
public void updateById(Integer id, ProductRequest.UpdateDTO requestDTO){
Query query = em.createNativeQuery("update product_tb set price=?, qty=? where id=?");
query.setParameter(1, requestDTO.getPrice());
query.setParameter(2, requestDTO.getQty());
query.setParameter(3, id);
query.executeUpdate();
}
(2)Service
-해당 id의 제품 수정 내용을 받아와서 레파지토리에 던짐.
//상품 수정하기
@Transactional
public void changeProduct(Integer id, ProductRequest.UpdateDTO requestDTO){
productRepository.updateById(id,requestDTO);
}
public Product findById(Integer id) {
Product product = productRepository.findById(id);
return product;
}
(3)Controller
-변경 전 id의 해당하는 제품의 정보를 가져와. 그것을 제품(product)의 이름, 속성으로 정하자.
-해당 id의 제품의 변경된 내용을 받아와서 dto로 받아서 서비스로 던져.
//상품 수정하기
@GetMapping("/product/{id}/update-form")
public String updateForm(@PathVariable Integer id, HttpServletRequest request){
Product product = productService.findById(id);
request.setAttribute("product", product);
return "/product/update-form";
}
@PostMapping("/product/{id}/update")
public String update(@PathVariable Integer id, ProductRequest.UpdateDTO requestDTO){
productService.changeProduct(id, requestDTO);
return "redirect:/product";
}
5) 상품 삭제하기
(1)Repository
-해당 id의 상품 디비에서 삭제해줘를 쿼리로 db에 전달.
//상품 삭제하기
public void deleteById(Integer id){
Query query = em.createNativeQuery("delete from product_tb where id=?");
query.setParameter(1,id);
query.executeUpdate();
}
(2)Service
해당 id의 제품을 삭제할 건데 그 정보를 레파지토리에 전달
//상품 삭제하기
@Transactional
public void deleteProduct(Integer id){
productRepository.deleteById(id);
}
-v
(3)Controller
해당 id의 제품의 삭제 요청이 들어오면,그것을 id로 구분하여 찾아서 service에 던짐.
//상품 삭제하기
@PostMapping("/product/{id}/delete")
public String delete(@PathVariable Integer id){
productService.deleteProduct(id);
return "redirect:/product";
}
Share article