오늘 구현한 기능(Commerce)

Youngseon Kim·2023년 7월 24일
0

쇼핑몰에 등록된 상품을 검색하는 기능

  1. ProductRepository에 쿼리 메서드 생성
List<Product> findByNameContainingIgnoreCase(String keyword)

리포지토리 메서드의 생성 규칙

FindBy : SQL문의 where절 역할을 수행하는 구문이다. findby 뒤에 엔티티의 필드값을 입력

(Is)Containing(=Contains) : 칼럼값에서 일부 일치 여부를 확인하는 조건자 키워드이다. SQL쿼리문에서 값의 일부를 포함하는 값을 추출할 때 사용하는 '%' 키워드와 동일한 역할을 하는 키워드이다.

IgnoreCase : 쿼리 일치가 대소문자를 구분하지 않도록 한다.  
  1. 입력으로 받은 keyword를 사용하여 상품 이름을 검색하는 메서드 구현
List<ProductResponseDto> searchProductsByName(String keyword)
{
        LOGGER.info("[searchProductsByName] keyword : {}", keyword);
        List<Product> foundProducts = productRepository.findByNameContainingIgnoreCase(keyword);

        List<ProductResponseDto> productResponseDtos = foundProducts.stream()
                .map(product -> {
                    ProductResponseDto productResponseDto = new ProductResponseDto();
                    productResponseDto.setNumber(product.getNumber());
                    productResponseDto.setName(product.getName());
                    productResponseDto.setPrice(product.getPrice());
                    productResponseDto.setStock(product.getStock());
                    return productResponseDto;
                })
                .collect(Collectors.toList());

        return productResponseDtos;
    }
@Override: 이 메서드가 인터페이스나 상위 클래스의 메서드를 오버라이드(재정의)함을 나타냅니다.

public List<ProductResponseDto> searchProductsByName(String keyword):

String keyword: 검색할 상품 이름에 포함될 키워드를 전달받습니다.
List<ProductResponseDto>: 검색 결과로 반환할 상품 목록을 담은 리스트를 반환합니다.
LOGGER.info("[searchProductsByName] keyword : {}", keyword);:

검색 키워드를 로그에 기록합니다. 이를 통해 메서드가 어떤 키워드로 호출되었는지 확인할 수 있습니다.
List<Product> foundProducts = productRepository.findByNameContainingIgnoreCase(keyword);:

productRepository.findByNameContainingIgnoreCase(keyword): JPA ProductRepository를 이용하여 상품명에서 키워드를 포함한 상품들을 검색합니다.
List<Product>: 검색 결과로 얻은 Product 엔티티들을 담은 리스트를 반환합니다.
List<ProductResponseDto> productResponseDtos = foundProducts.stream() ... collect(Collectors.toList());:

검색된 상품 엔티티들을 ProductResponseDto로 변환하여 새로운 리스트인 productResponseDtos를 생성합니다.
foundProducts.stream(): foundProducts 리스트를 스트림으로 변환하여 각 요소에 대해 변환 작업을 수행합니다.
map(product -> { ... }): 각 상품 엔티티를 ProductResponseDto로 변환하는 작업을 수행합니다. 상품 엔티티의 필드 값을 ProductResponseDto에 대응하는 필드에 설정합니다.
collect(Collectors.toList()): 변환된 ProductResponseDto들을 리스트로 수집합니다.
return productResponseDtos;: 변환된 ProductResponseDto 목록을 반환합니다. 이렇게 함으로써 검색된 상품들의 정보를 클라이언트에게 전달할 수 있습니다.

3.상품을 검색하는 기능을 제공하는 HTTP GET 요청 핸들러 메서드 구현

@GetMapping("/search")
    public ResponseEntity<List<ProductResponseDto>> searchProducts(@RequestParam String keyword) {
        List'<'ProductResponseDto'>' products = productService.searchProductsByName(keyword);
        return ResponseEntity.status(HttpStatus.OK).body(products);
     }  
@GetMapping("/search"):
HTTP GET 요청을 처리하는 핸들러 메서드를 지정합니다.
클라이언트에서 /product/search 경로로 GET 요청이 오면 이 메서드가 실행됩니다.
public ResponseEntity<List<'ProductResponseDto>> searchProducts(@RequestParam String keyword):

@RequestParam String keyword: 요청 파라미터 중 keyword 값을 받아옵니다. 클라이언트에서 keyword라는 이름으로 파라미터를 전달해야 합니다.
ResponseEntity<List<ProductResponseDto'>>: HTTP 응답을 생성하는 객체입니다. List<ProductResponseDto'> 타입의 상품 목록을 응답 본문에 담아서 반환합니다.
List<ProductResponseDto'> products = productService.searchProductsByName(keyword);:

productService.searchProductsByName(keyword)를 호출하여 상품 검색 기능을 수행합니다.
keyword를 사용하여 상품 이름을 검색하고, 검색된 상품들을 List<ProductResponseDto'> 형태로 받아옵니다.
return ResponseEntity.status(HttpStatus.OK).body(products);:

검색된 상품들을 HTTP 응답으로 반환합니다.
HttpStatus.OK는 200 OK 응답 코드를 나타냅니다. 즉, 요청이 성공적으로 처리되었음을 의미합니다.
body(products): 검색된 상품들을 응답 본문에 담아서 반환합니다. 이렇게 함으로써 클라이언트는 검색 결과를 받을 수 있습니다.  
코드를 입력하세요

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

많은 도움이 되었습니다, 감사합니다.

답글 달기