Feat/product search redis size#121#122
Conversation
fix: 상품 수정 로직 수정(CachePut 삭제, CacheEvict으로 대체)
fix: 인기검색어와 상품 검색 충돌 해결
🤖 AI 코드리뷰
안녕하세요! 가즈아님, 이번 PR은 정말 인상 깊습니다. 단순히 기능 구현을 넘어, 실무에서 사용되는 다양한 캐시 전략(L1/L2 Composite Cache)과 성능 테스트(K6) 도입까지 시도하셨군요. 시니어 개발자로서 이런 도전을 하는 주니어 분을 보면 정말 가슴이 뜁겁니다. 요구사항의 핵심인 v1, v2 검색 API 공존, QueryDSL 동적 쿼리, 인기 검색어 Redis Sorted Set 구현은 물론이고, K6 부하 테스트 스크립트까지 꼼꼼하게 작성해주신 점이 아주 훌륭합니다. 코드를 꼼꼼히 리뷰해보았고, 더욱 성장할 수 있는 포인트들을 정리해보았습니다. 📋 과제 요구사항 준수 여부
🟢 잘된 점
🔴 필수 수정1. 보안상 치명적인 인가(Authorization) 누락 문제 // SecurityConfig.java
.requestMatchers(HttpMethod.PUT, "/api/products/**").permitAll() // <- 보안 이슈이렇게 되면 악의적인 사용자가 상품의 가격을 0원으로 바꾸거나 재고를 마음대로 조작할 수 있습니다. 실무에서는 절대
🟡 권장 개선1. 상품 수정 시 캐시 Evict(삭제) 처리 누락
// ProductCommandService.java
@CacheEvict(value = "productDetail", key = "#productId") // 추가
public ProductUpdateResponse updateProduct(Long productId, ProductUpdateRequest request) {
// ... 비즈니스 로직 ...
}2. 페이징 처리 시 페이지 번호 파라미터 중복 문제
// 변경 전
public ResponseEntity<ApiResponse<Page<GetAllProductResponse>>> search(
@Valid SearchProductRequest searchRequest,
@RequestParam(defaultValue = "1") int page, // 중복
Pageable pageable) {
// 변경 후 (Pageable에 초기값 설정을 위임)
public ResponseEntity<ApiResponse<Page<GetAllProductResponse>>> search(
@Valid SearchProductRequest searchRequest,
@PageableDefault(page = 0, size = 10) Pageable pageable) {
// Spring Data JPA는 page가 0부터 시작하므로, 클라이언트가 1을 넘기면 -1 처리가 필요할 수 있습니다.
// 하지만 API 설계상 0부터 시작함을 명시하는 것이 RESTful합니다.3. K6 테스트 스크립트의 하드코딩된 URL 분리
const BASE_URL = __ENV.BASE_URL || 'http://host.docker.internal:8090';
const url = `${BASE_URL}/api/products/search/${version}?keyword=${keyword}`;💡 학습 포인트
🤔 생각해보기현재 도입하신 **L1(Caffeine
|
🤖 AI 코드리뷰
📋 과제 요구사항 준수 여부
🟢 잘된 점
🟡 개선 제안1. 상품 수정 시 캐시 Evict(삭제) 처리 누락
@CacheEvict(value = "productDetail", key = "#productId") // 추가
public ProductUpdateResponse updateProduct(Long productId, ProductUpdateRequest request) {
// ... 비즈니스 로직 ...
}2. 페이징 처리 시 파라미터 중복 및 관례 위배
🔴 보안 / 성능 주의1. 인가(Authorization) 누락 문제 미해결
💡 학습 포인트
🤔 생각해보기현재 도입하신 L1(Caffeine) / L2(Redis) Composite Cache 구조에서, 상품 수정(PUT) API가 1초에 100번 호출된다면 캐시 정합성을 지키기 위해
🔄 이전 피드백 반영 여부
|
💡 개요
상품 검색과 필터링 구현입니다.
Closes: [Feat] 상품 검색 및 필터링 구현 #121