[백엔드 개발 : ProductManagement] 상품 조회/수정/삭제 구현

2025. 3. 19. 22:22· 프로젝트/clone coding
목차
  1. 상품 조회하기
  2. 상품 번호 기준으로 하나의 상품 조회
  3. 전체 상품 목록 조회
  4. 검색 조회 - 상품 이름 부분 검색
  5. 상품 수정하기
  6. 상품 번호 기준으로 나머지 정보 수정
  7. 상품 삭제하기
  8. 상품 번호 기준으로 특정 상품 삭제

프로젝트 개요 : 이것이 취업을 위한 백엔드 개발이다 클론코딩 - 상품관리 애플리케이션
프로젝트 환경 : IntelliJ, SpringBoot, MySQL
프로젝트 코드 : https://github.com/smkim9202/ProductManagement

상품 조회하기

상품 번호 기준으로 하나의 상품 조회

ListProductRepository.java

    public Product findById(Long id){
        Product foundProduct = null;
        for (Product product : products) {
            if (product.sameId(id)) {
                foundProduct = product;
                break;
            }
        }
        if (foundProduct == null) {
            throw new NoSuchElementException();
        }
         return foundProduct;
    }
findById 메서드
Product가 들어 있는 리스트에서 상품번호 기준으로 하나의 Product를 뽑는 메서드
파라미터로 받은 id와 일치하는 id를 가진 Product를 찾아 반환 => Product에 smaeId 메서드 추가 필요
만약 찾지 못하면 NoSuchElementException이라는 예외를 던짐

 

Product.java

    public Boolean sameId(Long id) {
        return this.id.equals(id);
    }
sameId 메서드
파라미터로 받은 id값을 Product 인스턴스의 id와 비교하여 같으면 참, 다르면 거짓이 반환되는 메서드

 

SimpleProductService.java

    public ProductDto findByid(Long id){
        Product product = listProductRepository.findById(id);
        ProductDto productDto = modelMapper.map(product, ProductDto.class);
        return productDto;
    }

 

ProductController.java

    @RequestMapping(value = "/products/{id}", method = RequestMethod.GET)
    public ProductDto findProductById(@PathVariable Long id){
        return simpleProductService.findByid(id);
    }
/{id}
패스 베리어블
{}안에 있는 값과 매개변수의 변수 이름이 같으면 요청된 값이 매개변수로 들어와서 실행 

 

전체 상품 목록 조회

ListProductRepository.java

    public List<Product> findAll() {
        return products;
    }

 

SimpleProductService.java

    public List<ProductDto> findAll(){
        List<Product> products = listProductRepository.findAll();
        List<ProductDto> productDtos = new ArrayList<>();
        for (Product product : products) {
            productDtos.add(modelMapper.map(product, ProductDto.class));
        }
        return productDtos;
    }
Product 리스트를 ProdductDto 리스트로 변환하여 보내기 위해 for문 사용 

 

ProductController.java

    @RequestMapping(value = "/products", method = RequestMethod.GET)
    public List<ProductDto> findAllProduct(){
        return simpleProductService.findAll();
    }
상품추가와 경로는 같으나 HTTP 메서드가 다름 : /products
추가 : POST
전체 조회 : GET

 

검색 조회 - 상품 이름 부분 검색

Product.java

    public Boolean containsName(String name){
        return this.name.contains(name);
    }
containsName 메서드
파라미터로 받은 name값을 Product 인스턴스와 비교하여 포함되어 있으면 참, 포함되어 있지 않으면 거짓

 

ListProductRepository.java

    public List<Product> findByNameContaining(String name){
        List<Product> foundProducts = new ArrayList<>();
        for (Product product : products) {
            if (product.containsName(name)) {
                foundProducts.add(product);
            }
        }
        return foundProducts;
    }

 

simpleProductService.java

    public List<ProductDto> findByNameContaining(String name){
        List<Product> products = listProductRepository.findByNameContaining(name);
        List<ProductDto> productDtos = new ArrayList<>();
        for (Product product : products) {
            productDtos.add(modelMapper.map(product, ProductDto.class));
        }
        return productDtos;
    }

 

ProductController.java

    @RequestMapping(value = "/products", method = RequestMethod.GET)
    public List<ProductDto> findAllProduct(@RequestParam(required = false) String name){
        if(null == name){
            return simpleProductService.findAll();
        }
        return simpleProductService.findByNameContaining(name);
    }
상품 전체 조회와 경로도 HTTP 메서드도 같음 : /products, GET
@RequestParam은 기본 속성이 파라미터를 필수로 받는 것으로 필수가 아니면 required속성의 값을 false로 명시
전체 조회 : name이라는 쿼리 파라미터가 넘어 오지 않으면 기존과 동일하게 전체 목록 조회
검색 조회 : name이라는 쿼리 파라미터가 넘어 오면 이름 검색 조회

 

상품 수정하기

상품 번호 기준으로 나머지 정보 수정

ProductController.java

    @RequestMapping(value = "/products/{id}", method = RequestMethod.PUT)
    public ProductDto updateProduct(@PathVariable Long id, @RequestBody ProductDto productDto){
        productDto.setId(id);
        return simpleProductService.update(productDto);
    }
상품번호 조회와 경로는 같으나 HTTP 메서드가 다름 :  /products/{id}
상품번호 조회 : GET
상품 수정 : PUT

상품 호출하고, 호출된 결과 반환 : DTO
상품 수정 : Entity

 

SimpleProductService.java

    public ProductDto update(ProductDto productDto){
        Product product = modelMapper.map(productDto, Product.class);
        Product updateProduct = listProductRepository.update(product);
        ProductDto updateProductDto = modelMapper.map(updateProduct, ProductDto.class);
        return updateProductDto;
    }

 

ListProductRepository.java

    public Product update(Product product){
        Integer indexToModify = products.indexOf(product);
        products.set(indexToModify, product);
        return product;
    }
리스트의 indexOf 메서드
리스트의 요소 중 매개변수로 받은 인스턴스와 동등한 인스턴스의 index를 반환 
equals = 동등한 인스턴스 => 상품 객체의 동등성 사용하기 위해서는 equals 오버라이딩 필요

 

Product.java

id  동등성 추가 :  command+N -> equals() and hashCode() - Next - id 필드 체크 후 Next

 

상품 삭제하기

상품 번호 기준으로 특정 상품 삭제

ProductController.java

    @RequestMapping(value = "/products/{id}", method = RequestMethod.DELETE)
    public void deleteProduct(@PathVariable Long id){
        simpleProductService.delete(id);
    }
상품번호 조회, 수정과 경로는 같으나 HTTP 메서드가 다름 :  /products/{id}
상품번호 조회 : GET
상품 수정 : PUT
상품 삭제 : DELETE

 

SimpleProductService.java

    public void delete(Long id){
        listProductRepository.delete(id);
    }

 

ListPRoductRepository.java

    public void delete(Long id){
        Product product = this.findById(id);
        products.remove(product);
    }
리스트의 remove 메서드
리스트 요소 중 동등한(equals) 요소를 찾아서 지워주는 기능

Soft Delete
실무에서 사용자에게는 데이터가 삭제된 것처럼 보이지만, 내부적으로는 삭제하지 않는 경우를 말함
- 조회시 삭제된 것처럼 보이다 삭제 취소시 조회되도록 하고 싶은 경우나 서비스 내에서 휴면계정으로 보이게 할 경우등 서비스 요구사항에 따라 원상 복구 시켜야 할 가능성이 있어서 사용
- Boolean 타입의 필드 중 하나를 추가하여 해당 필드가 참이면 삭제된 것처럼 조회하는 등의 방법으로 구현

 

 

'프로젝트 > clone coding' 카테고리의 다른 글

[백엔드 개발 : ProductManagement] 전역 예외 핸들러 추가  (0) 2025.03.27
[백엔드 개발 : ProductManagement] 유효성 검사 추가  (0) 2025.03.20
[백엔드 개발 : ProductManagement] DTO와 getter, setter  (0) 2025.03.18
[백엔드 개발 : ProductManagement] 상품 추가 구현(프로젝트 구조 잡기)  (0) 2025.03.17
[백엔드 개발 : ProductManagement] 상품관리 애플리케이션 정의  (0) 2025.03.17
  1. 상품 조회하기
  2. 상품 번호 기준으로 하나의 상품 조회
  3. 전체 상품 목록 조회
  4. 검색 조회 - 상품 이름 부분 검색
  5. 상품 수정하기
  6. 상품 번호 기준으로 나머지 정보 수정
  7. 상품 삭제하기
  8. 상품 번호 기준으로 특정 상품 삭제
'프로젝트/clone coding' 카테고리의 다른 글
  • [백엔드 개발 : ProductManagement] 전역 예외 핸들러 추가
  • [백엔드 개발 : ProductManagement] 유효성 검사 추가
  • [백엔드 개발 : ProductManagement] DTO와 getter, setter
  • [백엔드 개발 : ProductManagement] 상품 추가 구현(프로젝트 구조 잡기)
개발원슝이
개발원슝이
꾸준히 개발공부를 합니다.
개발원슝이
꾸준히 개발슝이
개발원슝이
전체
오늘
어제
  • ALL (236)
    • 프로젝트 (34)
      • clone coding (19)
      • mini project (5)
      • Team project(with KIC) (10)
    • 문제 (37)
      • 백준 (7)
      • 프로그래머스 (14)
      • 정보처리기사실기 (16)
    • 설치 (9)
    • 개발 기초 (13)
    • 프로그래밍언어 (119)
      • HTML (16)
      • CSS (17)
      • JavaScript (17)
      • JAVA (13)
      • JSP (10)
      • Python (22)
      • C언어 (24)
    • 프레임워크 (6)
      • Spring (3)
      • Django (3)
    • DB (2)
      • MySQL (2)
    • AWS (1)
    • 오류 (2)
    • 이것저것 (6)
    • 전공자 개발 (2)
    • 비전공자 개발 (5)

블로그 메뉴

  • 네이버블로그(강의노트)
  • GitHub
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • 파이썬공부
  • 따배씨
  • 생활코딩
  • 점프 투 파이썬
  • 홍정모의 따라하며 배우는 C언어
  • 인프런
  • 홍정모교수님
  • javascript
  • 코딩테스트

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
개발원슝이
[백엔드 개발 : ProductManagement] 상품 조회/수정/삭제 구현
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.