From c1f242c518c77f449e20a036ccc5c3b66fee9449 Mon Sep 17 00:00:00 2001 From: sik-kk Date: Fri, 29 Aug 2025 23:40:10 +0900 Subject: [PATCH] =?UTF-8?q?MYCE-300:refactor/review=20-=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20(#716)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션… * MYCE-141 feat: 3요소(Cushion,SizeFit,Stability) 평가 통계 api 개발 파일 수정 및 product와 연결 * Dosik feat/reviews (#350) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * MYCE-141 feat: 3요소(Cushion,SizeFit,Stability) 평가 통계 api 개발 파일 수정 및 product와 연결 * Dosik feat/reviews (#354) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * MYCE-141 feat: 3요소(Cushion,SizeFit,Stability) 평가 통계 api 개발 파일 수정 및 product와 연결 * Dosik feat/reviews (#355) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * MYCE-118 feat: 장바구니 상품 수량 변경/선택/해제 구현 (#283) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상… * MYCE-141 feat: 3요소(Cushion,SizeFit,Stability) 평가 통계 api 개발 파일 수정 및 product와 연결 * MYCE-141 feat: 3요소(Cushion,SizeFit,Stability) 평가 통계 api 개발 파일 수정 및 product와 연결 * Dosik feat/reviews (#358) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-141 feat: 3요소(Cushion,SizeFit,Stability) 평가 통계 api 개발 파일 수정 및 product와 연결 * MYCE-181: feat/reviewValidationEnhancement-3요소 평가 필수 검증 강화 * MYCE-195: feat/reviewDuplicateValidation - 중복 리뷰 작성 방지 * Delete src/main/resources/application-dev.properties * MYCE-198: feat/reviewImageUpload-리뷰이미지업로드 * Dosik feat/reviews (#393) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-198: feat/reviewImageUpload-리뷰이미지업로드 * Dosik feat/reviews (#395) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-198: feat/reviewImageUpload-리뷰이미지업로드 * Dosik feat/reviews (#396) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-198: feat/reviewImageUpload-리뷰이미지업로드 * MYCE-198: feat/reviewImageUpload-리뷰이미지업로드 * MYCE-207:feat/reviewUpdate-리뷰수정 api 구현 * Dosik feat/reviews (#427) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-207:feat/reviewUpdate-리뷰수정 api 구현 * Dosik feat/reviews (#433) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-207:feat/reviewUpdate-리뷰수정 api 구현 * Dosik feat/reviews (#446) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-207:feat/reviewUpdate-리뷰수정 api 구현 * MYCE-207:feat/reviewUpdate-리뷰수정 api 구현 * MYCE-218:feat/reviewDelete-리뷰삭제 api 구현 * feat: 리뷰 삭제 및 통계 기능 구현 - 사용자용 리뷰 삭제 API (전체/이미지만/일괄 삭제) - 관리자용 리뷰 통계 조회 API - 소프트 삭제 패턴으로 데이터 안전성 확보 - QueryDSL 기반 효율적인 통계 쿼리 구현 - 권한 기반 접근 제어 및 예외 처리 - 포괄적인 단위 테스트 작성 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * Dosik feat/reviews (#500) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * fix: GitHub CI 빌드 오류 해결을 위한 동기화 - ReviewService.java 파일 동기화로 변수 선언 문제 해결 - 로컬에서는 정상 컴파일되지만 GitHub CI에서 실패하는 이슈 수정 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude * Dosik feat/reviews (#504) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * Update ReviewService.java * MYCE-218:feat/reviewDelete-리뷰삭제 api 구현 * Dosik feat/reviews (#517) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-218:feat/reviewDelete-리뷰삭제 api 구현 * Dosik feat/reviews (#518) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * Dosik feat/reviews (#523) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-218:feat/reviewDelete-리뷰삭제 api 구현 * MYCE-218:feat/reviewDelete-리뷰삭제 api 구현 * Dosik feat/reviews (#590) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-218:feat/reviewDelete-리뷰삭제 api 구현 * Dosik feat/reviews (#592) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-219:feat/reviewFilter -리뷰 필터링 * MYCE-219 : feat/review - reviewfilter 리뷰 필터링 (#594) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.git… * Dosik feat/reviews (#600) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * Update WebConfig.java * MYCE-219:feat/reviewFilter -리뷰 필터링 * MYCE-219:feat/reviewFilter -리뷰 필터링 * MYCE-219:feat/reviewFilter -리뷰 필터링 * Dosik feat/reviews (#604) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-219:feat/reviewFilter -리뷰 필터링 * Dosik feat/reviews (#605) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * MYCE-270-feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 (#610) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <6… * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * Dosik feat/reviews (#614) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * Dosik feat/reviews (#634) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * Dosik feat/reviews (#635) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * Dosik feat/reviews (#636) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * Dosik feat/reviews (#637) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * MYCE-270:feat/reviewPurchaseVerification - 리뷰 작성 시 구매 검증 서비스 구현 * Exceoption 파일 추가 수정 및 각종 파일 수정 * WebCongif.java 파일 수정 * MYCE-281:feat/reviewReport-리뷰 신고 기능 api 구현 * MYCE-281:feat/reviewReport-리뷰 신고 기능 api 구현 (#651) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply… * MYCE-281:feat/reviewReport-리뷰 신고 기능 api 구현 * MYCE-284:feat/reviewPoints-리뷰 작성 시 포인트 적립 * MYCE-284:feat/reviewPoints-리뷰 작성 시 포인트 적립 * DataInitializerConfig.java 파일 삭제 및 Review3ElementStatisticsService.java 파일 수정 * MYCE-295:feat/reviewUserprofile - 리뷰 목록에 사용자 정보 추가 * MYCE-295:feat/reviewUserprofile - 리뷰 목록에 사용자 정보 추가 * MYCE-295:feat/reviewUserprofile - 리뷰 목록에 사용자 정보 추가 (#672) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemania… * MYCE-295:feat/reviewUserprofile - 리뷰 목록에 사용자 정보 추가 * MYCE-298:rafactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 * MYVE-298:refactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 (#688) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codeman… * MYCE-298:rafactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 * Dosik feat/reviews (#690) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-298:rafactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 * MYCE-298:rafactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 * Dosik feat/reviews (#696) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * Dosik feat/reviews (#697) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(3요소 평가 통계 API개발) * 리뷰 기능 구현(3요소 평가 통계 API개발) * Dosik feat/reviews (#319) * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * MYCE-79: 리뷰 관련 코드 임시 저장 * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * Fix test failures and SSL configuration - Add missing containsString import to test classes - Fix toBuilder configuration in ReviewCreateRequest - Add application-test.properties for test environment - Resolve 27 failing tests * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * 리뷰 기능 구현(리뷰작성, 상세 리뷰 조회, 상품별 리뷰 목록조회) * MYCE-116 feat: 장바구니 상품 추가 구현 (#247) * MYCE-116 feat: 장바구니 상품 추가 구현 (#246) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * MYCE-45 feat: admin api 403 오류 수정 (#243) * MYCE-45 feat: admin api 403 오류 수정 (#242) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 application-test ssl 비활성화; * MYCE-46 build.gradle testLogging 추가' * dotEnv 사용 제거 * MYCE-46 FeedShopApplication dotEnv 주석 제거' * MYCE-46 myPage Badge, point, coupon 파일 생성' * Update ci.yml 공백 오타 수정 * Update ci.yml projectKey 오타 수정 * Update ci.yml * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * Myce 46 feat use mypage domain 생성 (#114) * MYCE-46 myPage Badge, point, coupon 파일 생성' 공백 오타 수정 * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-15 feat: 회원가입 및 이메일 인증 기능 구현 (#173) (#174) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * MYCE-80 feat: 판매자 상품 등록 API 구현 (#168) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 회원 탈퇴 기능 구현 * MYCE-83 feat: 상품 상세 조회 API 구현 (#181) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 (#179) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * MYCE-83 feat: 상품 상세 조회 API 구현 (#180) * MYCE-82 feat: 상품 목록 조회 API 구현 (#177) * Cart & Order 초기 패키지 설계 수정 (Product & Store 초기 패키지) * Cart, Order, Product, Store TODO 추가 * cart, order, product, store 초기 코드 적용 * cart order product store entity 추가 * cart, order, product, store - exception 패키지 제거 * feat/createProduct 구현 * feat: createProduct 누락 코드 추가 및 리팩토링 * Product entity private DiscountType discountType = DiscountType.NONE 기본값 수정 * cart, order, store 도메인 presentation > api 분리 및 삭제 * MYCE-82 feat: 상품 목록 조회 API 개발 (PR-302) * MYCE-82 fix: GetMapping 누락 수정, SecurityConfig /api/products/** 추가(비로그인 유저도 상품 목록은 볼 수있다) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * Create pull_request_template.md (#178) 팀 프로젝트 진행에 있어서 공통 PR 양식 완성 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 등록 테스트 케이스 fail case 수정 (#183) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * MYCE-83 fix: 테스트 코드 추가, SonarQube 해결 (#184) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 (#185) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) (#186) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * Api Response Format, SwaggerConfig, SizeConverter 추가 (#193) * MYCE-83 feat: 상품 상세 조회 API 구현 * MYCE-83 fix: 상품 상세 조회 product_options의 date 불필요 삭제, * MYCE-83 fix: 상품 상세 조회 productListResponse hasOptions 삭제, * MYCE-83 fix: 상품 상세 조회 productOption 응답값 추가, * MYCE-83 fix: 상품 상세 조회 productOptionInfo, productImageInfo 네이밍 및 경로 수정 * 테스트 코드 추가 * 상품등록 id 검증 수정 * 중복 코드 수정 * disocunt type columndefinition 수정 * 상품 등록 테스트 코드 수정 * 테스트 코드 추가, SonarQube 해결 * Product Option 색상, 성별, 사이즈 type을 string으로 변경 * 상품 상세 조회 MultipleBagFetchException 오류 수정(테스트 코드 포함) * ApiResponse 적용, SwaggerConfig 추가 * Api Response Format 수정, 사이즈 컨버터 추가. --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-84 feat: 상품 수정 기능 구현 (#197) * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 (#203) * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 (#228) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * enum column length 여유있게 수정 (#234) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 entity description length = 1000, getMainImageUrl 수정 (#235) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 회원 탈퇴 기능 추가 수정 * feat: UserService 개선 및 테스트 수정 UserService의 예외 처리, 코드 명확성 및 보안을 개선했습니다. - UserException을 도입하여 사용자 관련 예외 처리를 명확히 했습니다. - 이메일 인증 URL을 application-dev.properties로 외부화했습니다. - signUp 메소드에서 이미 암호화된 비밀번호를 올바르게 처리하도록 로직을 개선했습니다. - withdrawUser 및 adminWithdrawUserByEmail 메소드에 관리자 권한 검사를 추가하여 보안을 강화했습니다. - 권한 없는 탈퇴 시도에 대한 로깅을 개선했습니다. - UserServiceTest를 UserException 변경 사항에 맞춰 업데이트하고, 관리자 역할을 올바르게 Mocking하며, 비밀번호 암호화 테스트 로직을 수정했습니다. * Update ci.yml (#237) jwt_secret 환경 변수 주입 추가 * Update ci.yml (#238) 백엔드 배포 주소인 APP_VERIFICATION_URL 추가 * Update ci.yml * Update ci.yml (#240) APP_VERIFICATION_URL 추가 * MYCE-47 feat: 회원 탈퇴 기능 구현 (#201) * MYCE-47 feat: 회원 탈퇴 기능 구현 (#200) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * MYCE-47 refactor: 회원 탈퇴 기능 추가 수정 (#236) * Create sync-to-jira.yml 깃허브 액션을 통해서 깃허브 이슈 생성 시 자동으로 지라 이슈 생성 * Update and rename sync-to-jira.yml to create-jira-issue.yml yml 파일 수정 * Update create-jira-issue.yml project key 값 * Create gradle.yml * Update gradle.yml * Update gradle.yml * Update and rename gradle.yml to main.yml * Update main.yml * Update main.yml * Update main.yml * Update and rename main.yml to ci.yml jacoco 테스트 커버리지 리포트를 별도로 업로드 cache: 'gradle' 사용 테스트와 빌드를 명시적으로 분리 * Update ci.yml 프로젝트명 명시적 설정 * Update ci.yml Gradle Clean 추가 * Update settings.gradle shopChat -> feedShop * MYCE-46 myPage Badge, point, coupon 파일 생성' * ci.yml 충돌 해결; * MYCE-46 myPage Badge, point, coupon 파일 생성' * MYCE-15 feat: 이메일 인증을 통한 회원가입 기능 구현 * MYCE-15 test: 회원가입 및 이메일 인증 로직에 맞춘 UserServiceTest 리팩토링 및 케이스 추가 * 불필요 라이브러리 제거; * CI 관련 설정 재추가; * CI test오류 발생 부분 수정 * MYCE-15 refactor: SonarCube CodeCoverage 측정 보완 * 회원 탈퇴 기능 구현 * 회원 탈퇴 기능 구현 * 회원 탈퇴 UserServiceTest 수정 * SwaggerConfig 추가' * 회원 탈퇴 기능 추가 수정 * Update ci.yml * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 * UserException 추가 * ErrorCode추가 * ErrorCode 추가 * Fix: JWT 역할 매핑 오류로 인한 관리자 API 403 에러 수정 및 사용자 관련 예외 처리 시스템 개선 * Update .gitignore and stop tracking application-test.properties * Add application-dev.properties to .gitignore --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> * Delete src/test/resources/application-test.properties application-test 삭제 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * fix : 테스트 코드 수정 (#248) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 (soft delete 미구현) * 테스트 코드 수정 (soft delete 미구현) (#204) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Exception SonarQube 해결, Category, Color Enum 수정 * Exception SonarQube 해결, Category, Color Enum 수정 (#226) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 테스트 코드 수정 * 테스트 코드 수정 (#227) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * 테스트 코드 수정 (soft delete 미구현) * Exception SonarQube 해결, Category, Color Enum 수정 * 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Category, Color 테스트 수정 * enum column length 여유있게 수정 * 상품 entity description length = 1000, getMainImageUrl 수정 * cart 관련 커밋 * MYCE-116 feat: 장바구니 상품 추가 구현 1차 * MYCE-116 fix: cart , user 1:1 연결 및 수정 * Product, Cart 테스트 코드 수정 * 테스트코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Update CartItemResponse.java * 불필요 테스트 제거 (#249) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭제 기능 구현 * MYCE-85 feat: 상품 삭제 기능 구현 (#202) * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 (#196) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * Product Service 테스트 오류 수정 * Product Service 테스트 오류 수정 (#198) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 (#199) * Update ci.yml (#195) gradlew 실행 시 sonarqube -> sonar * test 코드 수정 * MYCE-84 feat: 상품 수정 기능 구현 1차 * MYCE-84 feat: 상품 수정 기능 구현 2차 * MYCE-84 fix: 옵션 및 이미지 수정 트랜잭션 오류 수정 * MYCE-84 fix: 테스트 코드 수정 * Product Service 테스트 오류 수정 * 상품 수정 컨트롤러 우회 판매자 검증 방어 코드 추가 --------- Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> * MYCE-85 feat: 상품 삭… * MYCE-298:rafactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 * MYCE-298:rafactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 * MYCE-298:rafactor/review - 스웨거 작업 및 리뷰 서비스 CRUD 분리 * MYCE-300:rafactor/review - 리뷰 컨트롤러 테스트 추가 --------- Co-authored-by: minchan kim <78453968+udune@users.noreply.github.com> Co-authored-by: 정승민 <67104714+Codemaniac7@users.noreply.github.com> Co-authored-by: Nero <149581532+dbp-jack@users.noreply.github.com> Co-authored-by: Claude --- .../dto/request/ReviewCreateRequest.java | 10 + .../dto/request/ReviewUpdateRequest.java | 10 + .../dto/response/ReportedReviewResponse.java | 39 +- .../Review3ElementStatisticsResponse.java | 12 + .../dto/response/ReviewCreateResponse.java | 11 + .../dto/response/ReviewDeleteResponse.java | 9 + .../response/ReviewImageDeleteResponse.java | 11 + .../dto/response/ReviewImageResponse.java | 11 + .../dto/response/ReviewListResponse.java | 15 + .../dto/response/ReviewReportResponse.java | 14 +- .../dto/response/ReviewResponse.java | 28 + .../dto/response/ReviewUpdateResponse.java | 11 + .../service/ReviewCreateService.java | 248 ++++ .../service/ReviewDeleteService.java | 275 ++++ .../service/ReviewReadService.java | 397 ++++++ .../application/service/ReviewService.java | 1123 ++--------------- .../service/ReviewUpdateService.java | 366 ++++++ .../presentation/ReviewAdminController.java | 176 ++- .../review/presentation/ReviewController.java | 153 ++- .../ReviewReportAdminController.java | 92 +- .../presentation/ReviewReportController.java | 45 +- .../presentation/ReviewUserController.java | 321 ++++- .../service/ReviewCreateServiceTest.java | 428 +++++++ .../service/ReviewDeleteServiceTest.java | 380 ++++-- .../service/ReviewServiceTest.java | 616 +-------- .../service/ReviewUpdateServiceTest.java | 554 +++----- .../presentation/ReviewControllerTest.java | 421 ++++++ .../1e12e4b9-9fee-47a4-bc4c-609eb2826dd6.jpeg | Bin 94834 -> 0 bytes .../63bbca4b-0ac3-4bc1-a6a3-b9e28e0b7e43.jpeg | Bin 94834 -> 0 bytes .../f274ed41-fa92-4479-9185-7a0350332b28.jpeg | Bin 94834 -> 0 bytes .../02483e36-9fef-495f-a314-20e7659a51a2.jpeg | Bin 94834 -> 0 bytes .../170534a1-49d5-4e46-9a8b-223e6d93e099.jpeg | Bin 94834 -> 0 bytes .../2b114403-2ec9-4aeb-9d2a-c8725ab37c40.jpeg | Bin 94834 -> 0 bytes 33 files changed, 3576 insertions(+), 2200 deletions(-) create mode 100644 src/main/java/com/cMall/feedShop/review/application/service/ReviewCreateService.java create mode 100644 src/main/java/com/cMall/feedShop/review/application/service/ReviewDeleteService.java create mode 100644 src/main/java/com/cMall/feedShop/review/application/service/ReviewReadService.java create mode 100644 src/main/java/com/cMall/feedShop/review/application/service/ReviewUpdateService.java create mode 100644 src/test/java/com/cMall/feedShop/review/application/service/ReviewCreateServiceTest.java create mode 100644 src/test/java/com/cMall/feedShop/review/presentation/ReviewControllerTest.java delete mode 100644 uploads/reviews/2025/07/31/1e12e4b9-9fee-47a4-bc4c-609eb2826dd6.jpeg delete mode 100644 uploads/reviews/2025/07/31/63bbca4b-0ac3-4bc1-a6a3-b9e28e0b7e43.jpeg delete mode 100644 uploads/reviews/2025/07/31/f274ed41-fa92-4479-9185-7a0350332b28.jpeg delete mode 100644 uploads/reviews/2025/08/05/02483e36-9fef-495f-a314-20e7659a51a2.jpeg delete mode 100644 uploads/reviews/2025/08/05/170534a1-49d5-4e46-9a8b-223e6d93e099.jpeg delete mode 100644 uploads/reviews/2025/08/05/2b114403-2ec9-4aeb-9d2a-c8725ab37c40.jpeg diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewCreateRequest.java b/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewCreateRequest.java index 9dc87aab0..de7503904 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewCreateRequest.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewCreateRequest.java @@ -7,6 +7,7 @@ import com.cMall.feedShop.review.domain.validation.ReviewElements; // ✅ 추가 import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.*; import lombok.*; import org.springframework.web.multipart.MultipartFile; @@ -18,33 +19,42 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @JsonDeserialize(builder = ReviewCreateRequest.ReviewCreateRequestBuilder.class) @ValidReviewElements +@Schema(description = "리뷰 작성 요청") public class ReviewCreateRequest implements ReviewElements { // ✅ implements 추가 + @Schema(description = "리뷰 제목", example = "정말 편한 운동화에요!", maxLength = 100) @NotBlank(message = "리뷰 제목은 필수입니다.") @Size(max = 100, message = "리뷰 제목은 100자를 초과할 수 없습니다.") private final String title; + @Schema(description = "평점 (1-5점)", example = "5", minimum = "1", maximum = "5") @NotNull(message = "평점은 필수입니다.") @Min(value = 1, message = "평점은 1점 이상이어야 합니다.") @Max(value = 5, message = "평점은 5점 이하여야 합니다.") private final Integer rating; + @Schema(description = "사이즈 착용감 (SMALL: 작음, NORMAL: 적당함, BIG: 큼)", example = "NORMAL") @NotNull(message = "사이즈 착용감은 필수입니다.") private final SizeFit sizeFit; + @Schema(description = "쿠션감 (HARD: 딱딱함, MEDIUM: 보통, SOFT: 부드러움)", example = "MEDIUM") @NotNull(message = "쿠션감은 필수입니다.") private final Cushion cushion; + @Schema(description = "안정성 (UNSTABLE: 불안정, NORMAL: 보통, STABLE: 안정적)", example = "STABLE") @NotNull(message = "안정성은 필수입니다.") private final Stability stability; + @Schema(description = "리뷰 내용 (상세한 후기)", example = "3개월 동안 착용해봤는데 정말 편하고 내구성도 좋아요. 디자인도 깔끔하고 어떤 옷에나 잘 어울립니다.", minLength = 10, maxLength = 1000) @NotBlank(message = "리뷰 내용은 필수입니다.") @Size(min = 10, max = 1000, message = "리뷰 내용은 10자 이상 1000자 이하여야 합니다.") private final String content; + @Schema(description = "리뷰를 작성할 상품 ID", example = "1") @NotNull(message = "상품 ID는 필수입니다.") private final Long productId; + @Schema(description = "리뷰 이미지 파일들 (선택사항, 최대 5개)", type = "array", format = "binary") // 이미지는 별도 처리 (MultipartFile은 불변 객체가 아니므로) private final List images; diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewUpdateRequest.java b/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewUpdateRequest.java index fa839d291..47aedb195 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewUpdateRequest.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/request/ReviewUpdateRequest.java @@ -7,6 +7,7 @@ import com.cMall.feedShop.review.domain.validation.ReviewElements; // ✅ 추가 import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.*; import lombok.*; import org.springframework.web.multipart.MultipartFile; @@ -26,33 +27,42 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @JsonDeserialize(builder = ReviewUpdateRequest.ReviewUpdateRequestBuilder.class) @ValidReviewElements +@Schema(description = "리뷰 수정 요청") public class ReviewUpdateRequest implements ReviewElements { // ✅ implements 추가 + @Schema(description = "수정할 리뷰 제목", example = "수정된 리뷰 제목", maxLength = 100) @NotBlank(message = "리뷰 제목은 필수입니다.") @Size(max = 100, message = "리뷰 제목은 100자를 초과할 수 없습니다.") private final String title; + @Schema(description = "수정할 평점 (1-5점)", example = "4", minimum = "1", maximum = "5") @NotNull(message = "평점은 필수입니다.") @Min(value = 1, message = "평점은 1점 이상이어야 합니다.") @Max(value = 5, message = "평점은 5점 이하여야 합니다.") private final Integer rating; + @Schema(description = "수정할 사이즈 착용감", example = "BIG") @NotNull(message = "사이즈 착용감은 필수입니다.") private final SizeFit sizeFit; + @Schema(description = "수정할 쿠션감", example = "SOFT") @NotNull(message = "쿠션감은 필수입니다.") private final Cushion cushion; + @Schema(description = "수정할 안정성", example = "NORMAL") @NotNull(message = "안정성은 필수입니다.") private final Stability stability; + @Schema(description = "수정할 리뷰 내용", example = "추가 사용 후 수정된 후기입니다. 여전히 좋은 제품이에요!", minLength = 10, maxLength = 1000) @NotBlank(message = "리뷰 내용은 필수입니다.") @Size(min = 10, max = 1000, message = "리뷰 내용은 10자 이상 1000자 이하여야 합니다.") private final String content; + @Schema(description = "새로 추가할 이미지 파일들 (선택사항)", type = "array", format = "binary") // 새로 추가할 이미지들 private final List newImages; + @Schema(description = "삭제할 기존 이미지 ID 목록 (선택사항)", example = "[1, 2, 3]") // 삭제할 기존 이미지 ID 목록 private final List deleteImageIds; diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReportedReviewResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReportedReviewResponse.java index d7d0cc914..d4888bfb4 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReportedReviewResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReportedReviewResponse.java @@ -14,64 +14,65 @@ @Schema(description = "신고된 리뷰 정보 (관리자용)") public class ReportedReviewResponse { - @Schema(description = "리뷰 ID") + @Schema(description = "신고된 리뷰 ID", example = "123") private Long reviewId; - @Schema(description = "리뷰 제목") + @Schema(description = "리뷰 제목", example = "정말 좋은 상품이에요!") private String title; - @Schema(description = "리뷰 내용") + @Schema(description = "리뷰 내용 (일부만 표시됨)", example = "좋은 상품이지만 배송이 너무 느렸습니다...") private String content; - @Schema(description = "작성자 ID") + @Schema(description = "리뷰 작성자 ID", example = "456") private Long writerId; - @Schema(description = "작성자 이름") + @Schema(description = "리뷰 작성자 이름", example = "김사용자") private String writerName; - @Schema(description = "상품 ID") + @Schema(description = "상품 ID", example = "1") private Long productId; - @Schema(description = "상품명") + @Schema(description = "상품명", example = "나이키 에어조던 1") private String productName; - @Schema(description = "리뷰 상태") + @Schema(description = "리뷰 상태 (공개/비공개)", example = "ACTIVE") private ReviewStatus status; - @Schema(description = "총 신고 수") + @Schema(description = "총 신고 수", example = "5") private Long totalReportCount; - @Schema(description = "처리되지 않은 신고 수") + @Schema(description = "미처리 신고 수", example = "3") private Long unprocessedReportCount; - @Schema(description = "신고 목록") + @Schema(description = "신고 내역 목록") private List reports; - @Schema(description = "리뷰 작성일") + @Schema(description = "리뷰 작성일시", example = "2025-08-28T10:30:00") private LocalDateTime reviewCreatedAt; @Getter @Builder + @Schema(description = "신고 상세 정보") public static class ReportInfo { - @Schema(description = "신고 ID") + @Schema(description = "신고 ID", example = "1") private Long reportId; - @Schema(description = "신고자 ID") + @Schema(description = "신고자 ID", example = "789") private Long reporterId; - @Schema(description = "신고자 이름") + @Schema(description = "신고자 이름", example = "이신고자") private String reporterName; - @Schema(description = "신고 사유") + @Schema(description = "신고 사유", example = "INAPPROPRIATE_CONTENT") private ReportReason reason; - @Schema(description = "신고 상세 설명") + @Schema(description = "신고 상세 설명", example = "부적절한 내용이 포함되어 신고합니다.") private String description; - @Schema(description = "처리 여부") + @Schema(description = "관리자 처리 여부", example = "false") private Boolean isProcessed; - @Schema(description = "신고 일시") + @Schema(description = "신고 일시", example = "2025-08-28T14:20:00") private LocalDateTime createdAt; } } \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/Review3ElementStatisticsResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/Review3ElementStatisticsResponse.java index cf9f73129..eab8af1bc 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/Review3ElementStatisticsResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/Review3ElementStatisticsResponse.java @@ -3,6 +3,7 @@ import com.cMall.feedShop.review.domain.enums.Cushion; import com.cMall.feedShop.review.domain.enums.SizeFit; import com.cMall.feedShop.review.domain.enums.Stability; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; @@ -10,23 +11,34 @@ @Getter @Builder +@Schema(description = "상품별 3요소 평가 통계 응늵") public class Review3ElementStatisticsResponse { + @Schema(description = "전체 리뷰 수", example = "150") private Long totalReviews; + @Schema(description = "쿠션감 통계") // Cushion 통계 private CushionStatistics cushionStatistics; + @Schema(description = "사이즈 착용감 통계") // SizeFit 통계 private SizeFitStatistics sizeFitStatistics; + @Schema(description = "안정성 통계") // Stability 통계 private StabilityStatistics stabilityStatistics; @Getter @Builder + @Schema(description = "쿠션감 통계 정보") public static class CushionStatistics { + @Schema(description = "쿠션감 옵션별 개수 분포") private Map distribution; // 각 옵션별 개수 + + @Schema(description = "쿠션감 옵션별 비율 (백분율)") private Map percentage; // 각 옵션별 비율 + + @Schema(description = "가장 많이 선택된 쿠션감", example = "MEDIUM") private Cushion mostSelected; // 가장 많이 선택된 옵션 private Double averageScore; // 평균 점수 (1-5점으로 환산) } diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewCreateResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewCreateResponse.java index 901615fa0..eebda42c2 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewCreateResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewCreateResponse.java @@ -1,5 +1,6 @@ package com.cMall.feedShop.review.application.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; @@ -7,11 +8,21 @@ @Getter @Builder +@Schema(description = "리뷰 작성 성공 응늵") public class ReviewCreateResponse { + @Schema(description = "생성된 리뷰 ID", example = "123") private Long reviewId; + + @Schema(description = "성공 메시지", example = "리뷰가 성공적으로 작성되었습니다.") private String message; + + @Schema(description = "업로드된 이미지 URL 목록", example = "[\"/api/reviews/images/2025/08/28/abc123.jpg\"]") private List imageUrls; + + @Schema(description = "이번에 적립된 포인트", example = "10") private Integer pointsEarned; // 이번에 적립된 포인트 + + @Schema(description = "현재 총 보유 포인트", example = "150") private Integer currentPoints; // 현재 총 보유 포인트 public static ReviewCreateResponse of(Long reviewId) { diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewDeleteResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewDeleteResponse.java index 3cc77d773..cf541c26d 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewDeleteResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewDeleteResponse.java @@ -1,5 +1,6 @@ package com.cMall.feedShop.review.application.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -12,11 +13,19 @@ @Builder @NoArgsConstructor @AllArgsConstructor +@Schema(description = "리뷰 삭제 성공 응늵") public class ReviewDeleteResponse { + @Schema(description = "삭제된 리뷰 ID", example = "123") private Long deletedReviewId; + + @Schema(description = "이미지 삭제 여부", example = "true") private boolean imagesDeleted; + + @Schema(description = "삭제된 이미지 개수", example = "3") private int deletedImageCount; + + @Schema(description = "성공 메시지", example = "리뷰가 성공적으로 삭제되었습니다.") private String message; /** diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageDeleteResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageDeleteResponse.java index f19cdd415..e08ccbf12 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageDeleteResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageDeleteResponse.java @@ -1,5 +1,6 @@ package com.cMall.feedShop.review.application.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -14,12 +15,22 @@ @Builder @NoArgsConstructor @AllArgsConstructor +@Schema(description = "리뷰 이미지 삭제 성공 응늵") public class ReviewImageDeleteResponse { + @Schema(description = "리뷰 ID", example = "123") private Long reviewId; + + @Schema(description = "삭제된 이미지 ID 목록", example = "[1, 2, 3]") private List deletedImageIds; + + @Schema(description = "삭제된 이미지 개수", example = "3") private int deletedImageCount; + + @Schema(description = "남은 이미지 개수", example = "2") private int remainingImageCount; + + @Schema(description = "성공 메시지", example = "3개의 이미지가 성공적으로 삭제되었습니다.") private String message; /** diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageResponse.java index 52d32626c..c293153dd 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewImageResponse.java @@ -1,14 +1,25 @@ package com.cMall.feedShop.review.application.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; @Getter @Builder +@Schema(description = "리뷰 이미지 정보") public class ReviewImageResponse { + @Schema(description = "리뷰 이미지 ID", example = "1") private Long reviewImageId; + + @Schema(description = "원본 파일명", example = "review_image.jpg") private String originalFilename; + + @Schema(description = "이미지 접근 URL", example = "/api/reviews/images/2025/08/28/abc123.jpg") private String imageUrl; + + @Schema(description = "이미지 순서", example = "1") private Integer imageOrder; + + @Schema(description = "파일 크기 (bytes)", example = "1048576") private Long fileSize; } \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewListResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewListResponse.java index e5a460405..b31a61b04 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewListResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewListResponse.java @@ -1,5 +1,6 @@ package com.cMall.feedShop.review.application.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; import org.springframework.data.domain.Page; @@ -8,13 +9,27 @@ @Getter @Builder +@Schema(description = "리뷰 목록 응늵 (페이지네이션 포함)") public class ReviewListResponse { + @Schema(description = "리뷰 목록") private List reviews; + + @Schema(description = "전체 리뷰 개수", example = "150") private long totalElements; + + @Schema(description = "전체 페이지 수", example = "8") private int totalPages; + + @Schema(description = "페이지 크기", example = "20") private int size; + + @Schema(description = "현재 페이지 번호 (0부터 시작)", example = "0") private int number; + + @Schema(description = "평균 평점", example = "4.2") private Double averageRating; + + @Schema(description = "전체 리뷰 수", example = "150") private Long totalReviews; public static ReviewListResponse of(Page reviewPage, Double averageRating, Long totalReviews) { diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewReportResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewReportResponse.java index f3a68598f..e68ceb2a3 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewReportResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewReportResponse.java @@ -12,24 +12,24 @@ @Schema(description = "리뷰 신고 응답") public class ReviewReportResponse { - @Schema(description = "신고 ID") + @Schema(description = "신고 ID", example = "1") private Long reportId; - @Schema(description = "리뷰 ID") + @Schema(description = "신고된 리뷰 ID", example = "123") private Long reviewId; - @Schema(description = "신고자 ID") + @Schema(description = "신고자 ID", example = "456") private Long reporterId; - @Schema(description = "신고 사유") + @Schema(description = "신고 사유", example = "ABUSIVE_LANGUAGE") private ReportReason reason; - @Schema(description = "신고 상세 설명") + @Schema(description = "신고 상세 설명", example = "욕설이 포함된 리뷰입니다.") private String description; - @Schema(description = "처리 여부") + @Schema(description = "관리자 처리 여부", example = "false") private Boolean isProcessed; - @Schema(description = "신고 일시") + @Schema(description = "신고 일시", example = "2025-08-28T10:30:00") private LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewResponse.java index 9d2c604c1..d1d64fd2f 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewResponse.java @@ -4,6 +4,7 @@ import com.cMall.feedShop.review.domain.enums.Cushion; import com.cMall.feedShop.review.domain.enums.SizeFit; import com.cMall.feedShop.review.domain.enums.Stability; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; @@ -12,28 +13,55 @@ @Getter @Builder +@Schema(description = "리뷰 상세 정보 응답") public class ReviewResponse { + @Schema(description = "리뷰 ID", example = "123") private Long reviewId; + @Schema(description = "리뷰 제목", example = "정말 편한 운동화에요!") private String title; + @Schema(description = "평점 (1-5점)", example = "5") private Integer rating; + @Schema(description = "사이즈 착용감", example = "NORMAL") private SizeFit sizeFit; + @Schema(description = "쿠션감", example = "MEDIUM") private Cushion cushion; + @Schema(description = "안정성", example = "STABLE") private Stability stability; + @Schema(description = "리뷰 내용", example = "3개월 동안 착용해봤는데 정말 편하고 내구성도 좋아요.") private String content; + @Schema(description = "리뷰 점수", example = "15") private Integer points; + @Schema(description = "리뷰 작성자 ID", example = "456") private Long userId; + @Schema(description = "리뷰 작성자 이름", example = "김사용자") private String userName; // 사용자 신체 정보 추가 + @Schema(description = "사용자 키 (cm)", example = "175") private Integer userHeight; + + @Schema(description = "사용자 몸무게 (kg)", example = "70") private Integer userWeight; + + @Schema(description = "사용자 발 사이즈 (mm)", example = "260") private Integer userFootSize; + + @Schema(description = "사용자 발 폭", example = "NORMAL") private String userFootWidth; + @Schema(description = "리뷰 대상 상품 ID", example = "1") private Long productId; + + @Schema(description = "리뷰 작성 일시", example = "2025-08-28T10:30:00") private LocalDateTime createdAt; + + @Schema(description = "리뷰 수정 일시", example = "2025-08-28T15:45:00") private LocalDateTime updatedAt; + + @Schema(description = "리뷰 이미지 목록") private List images; + + @Schema(description = "이미지 보유 여부", example = "true") private boolean hasImages; public static ReviewResponse from(Review review, List imageList) { diff --git a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewUpdateResponse.java b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewUpdateResponse.java index 741f7ca5e..8fd87768c 100644 --- a/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewUpdateResponse.java +++ b/src/main/java/com/cMall/feedShop/review/application/dto/response/ReviewUpdateResponse.java @@ -1,5 +1,6 @@ package com.cMall.feedShop.review.application.dto.response; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; @@ -15,12 +16,22 @@ */ @Getter @Builder +@Schema(description = "리뷰 수정 성공 응늵") public class ReviewUpdateResponse { + @Schema(description = "수정된 리뷰 ID", example = "123") private Long reviewId; + + @Schema(description = "성공 메시지", example = "리뷰가 성공적으로 수정되었습니다.") private String message; + + @Schema(description = "새로 추가된 이미지 URL 목록", example = "[\"/api/reviews/images/2025/08/28/new_image.jpg\"]") private List newImageUrls; // 새로 추가된 이미지들의 URL + + @Schema(description = "삭제된 이미지 ID 목록", example = "[1, 2, 3]") private List deletedImageIds; // 삭제된 이미지들의 ID + + @Schema(description = "수정 후 총 이미지 개수", example = "3") private int totalImageCount; // 수정 후 총 이미지 개수 /** diff --git a/src/main/java/com/cMall/feedShop/review/application/service/ReviewCreateService.java b/src/main/java/com/cMall/feedShop/review/application/service/ReviewCreateService.java new file mode 100644 index 000000000..0088b618f --- /dev/null +++ b/src/main/java/com/cMall/feedShop/review/application/service/ReviewCreateService.java @@ -0,0 +1,248 @@ +package com.cMall.feedShop.review.application.service; + +import com.cMall.feedShop.common.dto.UploadResult; +import com.cMall.feedShop.common.storage.StorageService; +import com.cMall.feedShop.common.storage.UploadDirectory; +import com.cMall.feedShop.product.domain.model.Product; +import com.cMall.feedShop.product.domain.repository.ProductRepository; +import com.cMall.feedShop.review.application.dto.request.ReviewCreateRequest; +import com.cMall.feedShop.review.application.dto.response.ReviewCreateResponse; +import com.cMall.feedShop.review.domain.Review; +import com.cMall.feedShop.review.domain.repository.ReviewImageRepository; +import com.cMall.feedShop.review.domain.repository.ReviewRepository; +import com.cMall.feedShop.review.domain.service.ReviewDuplicationValidator; +import com.cMall.feedShop.review.domain.service.ReviewPurchaseVerificationService; +import com.cMall.feedShop.user.application.service.BadgeService; +import com.cMall.feedShop.user.application.service.PointService; +import com.cMall.feedShop.user.application.service.UserLevelService; +import com.cMall.feedShop.user.domain.model.ActivityType; +import com.cMall.feedShop.user.domain.model.User; +import com.cMall.feedShop.user.domain.repository.UserRepository; +import jakarta.persistence.EntityNotFoundException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +@Transactional(readOnly = true) +public class ReviewCreateService { + + private final ReviewRepository reviewRepository; + private final UserRepository userRepository; + private final ProductRepository productRepository; + private final ReviewDuplicationValidator duplicationValidator; + private final ReviewPurchaseVerificationService purchaseVerificationService; + private final ReviewImageService reviewImageService; + private final ReviewImageRepository reviewImageRepository; + private final BadgeService badgeService; + private final UserLevelService userLevelService; + private final PointService pointService; + + // 선택적 의존성 주입으로 변경 (GCP만) + @Autowired(required = false) + private StorageService gcpStorageService; + + // 수동 생성자 (필수 의존성만) + public ReviewCreateService( + ReviewRepository reviewRepository, + UserRepository userRepository, + ProductRepository productRepository, + ReviewDuplicationValidator duplicationValidator, + ReviewPurchaseVerificationService purchaseVerificationService, + ReviewImageService reviewImageService, + ReviewImageRepository reviewImageRepository, + BadgeService badgeService, + UserLevelService userLevelService, + PointService pointService) { + + this.reviewRepository = reviewRepository; + this.userRepository = userRepository; + this.productRepository = productRepository; + this.duplicationValidator = duplicationValidator; + this.purchaseVerificationService = purchaseVerificationService; + this.reviewImageService = reviewImageService; + this.reviewImageRepository = reviewImageRepository; + this.badgeService = badgeService; + this.userLevelService = userLevelService; + this.pointService = pointService; + } + + /** + * 리뷰 생성 (DTO 불변성 적용) + * + * @param request 불변 리뷰 생성 요청 DTO + * @param images 업로드할 이미지 파일들 (별도 파라미터) + * @return 생성된 리뷰 응답 + */ + @Transactional + public ReviewCreateResponse createReview(ReviewCreateRequest request, List images) { + // 현재 로그인한 사용자 가져오기 + User user = getCurrentUserFromSecurity(); + + // Product 조회 + Product product = productRepository.findById(request.getProductId()) + .orElseThrow(() -> new EntityNotFoundException("상품을 찾을 수 없습니다: " + request.getProductId())); + + // 중복 리뷰 검증 + duplicationValidator.validateNoDuplicateActiveReview(user.getId(), product.getProductId()); + + // 구매이력 검증 + purchaseVerificationService.validateUserPurchasedProduct(user, product.getProductId()); + + // ✅ DTO에서 직접 값 추출 (불변 필드) + Review review = Review.builder() + .title(request.getTitle()) + .rating(request.getRating()) + .sizeFit(request.getSizeFit()) + .cushion(request.getCushion()) + .stability(request.getStability()) + .content(request.getContent()) + .user(user) + .product(product) + .build(); + + // Review 저장 + Review savedReview = reviewRepository.save(review); + + // GCP Storage만 사용하도록 단순화 + List imageUrls = new ArrayList<>(); + if (images != null && !images.isEmpty()) { + try { + log.info("이미지 업로드 시작: {} 개의 파일", images.size()); + + // GCP Storage 서비스만 사용 + if (gcpStorageService != null) { + log.info("GCP Storage 서비스 사용"); + List uploadResults = gcpStorageService.uploadFilesWithDetails(images, UploadDirectory.REVIEWS); + + if (!uploadResults.isEmpty()) { + // UploadResult를 ReviewImage로 저장 + saveReviewImagesFromUploadResults(savedReview, uploadResults); + + // URL만 추출해서 응답용으로 사용 + imageUrls = uploadResults.stream() + .map(UploadResult::getFilePath) + .collect(Collectors.toList()); + } + } else { + log.warn("GCP Storage 서비스가 없습니다. 이미지 없이 리뷰만 저장합니다."); + } + + log.info("이미지 업로드 완료: {}", imageUrls); + } catch (Exception e) { + log.error("이미지 업로드 실패했지만 리뷰는 저장됩니다.", e); + // 이미지 실패해도 리뷰는 정상 저장되도록 예외를 던지지 않음 + } + } + + // ✅ 로컬 이미지 처리도 별도 파라미터로 처리 + if (images != null && !images.isEmpty()) { + reviewImageService.saveReviewImages(savedReview, images); + log.info("리뷰 이미지 업로드 완료 (기존 방식): reviewId={}, imageCount={}", + savedReview.getReviewId(), images.size()); + } + + // 리뷰 작성 포인트 적립 + int pointsEarned = awardPointsForReview(user, savedReview.getReviewId()); + + // 뱃지 자동 수여 체크 + checkAndAwardBadgesAfterReview(user.getId(), savedReview.getReviewId()); + + // 기본 응답 반환 (currentPoints는 Controller에서 별도 처리) + return ReviewCreateResponse.builder() + .reviewId(savedReview.getReviewId()) + .message("리뷰가 성공적으로 등록되었습니다.") + .imageUrls(imageUrls) + .pointsEarned(pointsEarned) + .currentPoints(null) // Controller에서 설정될 예정 + .build(); + } + + /** + * 현재 로그인한 사용자 조회 (Spring Security 기반) + */ + private User getCurrentUserFromSecurity() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + log.info("현재 인증 정보: {}", authentication); + log.info("인증됨: {}", authentication != null ? authentication.isAuthenticated() : false); + log.info("인증 타입: {}", authentication != null ? authentication.getClass().getName() : "null"); + + if (authentication == null || !authentication.isAuthenticated()) { + log.error("인증 정보가 없거나 인증되지 않음: {}", authentication); + throw new RuntimeException("인증이 필요합니다"); + } + + Object principal = authentication.getPrincipal(); + log.info("Principal: {}", principal); + log.info("Principal 타입: {}", principal.getClass().getName()); + + String username; + if (principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + log.info("UserDetails에서 username 추출: {}", username); + } else if (principal instanceof User) { + username = ((User) principal).getEmail(); + log.info("User에서 email 추출: {}", username); + } else { + username = principal.toString(); + log.info("toString()에서 username 추출: {}", username); + } + + log.info("사용자 loginId로 조회 시도: {}", username); + return userRepository.findByLoginId(username) + .orElseThrow(() -> new EntityNotFoundException("사용자를 찾을 수 없습니다: " + username)); + } + + /** + * UploadResult를 ReviewImage로 저장하는 헬퍼 메서드 + */ + private void saveReviewImagesFromUploadResults(Review review, List uploadResults) { + // TODO: ReviewImage 엔티티 저장 로직 구현 + log.info("ReviewImage 저장: reviewId={}, imageCount={}", review.getReviewId(), uploadResults.size()); + } + + /** + * 리뷰 작성 포인트 지급 + */ + private int awardPointsForReview(User user, Long reviewId) { + try { + pointService.earnPoints(user, 100, "리뷰 작성 보상", reviewId); + log.info("리뷰 작성 포인트 적립 완료: userId={}, reviewId={}, points={}", + user.getId(), reviewId, 100); + return 100; + } catch (Exception e) { + log.error("리뷰 작성 포인트 적립 실패: userId={}, reviewId={}, error={}", + user.getId(), reviewId, e.getMessage(), e); + return 0; + } + } + + /** + * 리뷰 작성 후 뱃지 자동 수여 체크 + */ + private void checkAndAwardBadgesAfterReview(Long userId, Long reviewId) { + try { + // 리뷰 관련 뱃지들 체크 + badgeService.checkAndAwardReviewBadges(userId, reviewId); + + // 레벨 업 체크 + userLevelService.recordActivity(userId, ActivityType.REVIEW_CREATION, + "리뷰 작성", reviewId, "REVIEW"); + + log.info("뱃지 및 레벨 체크 완료: userId={}", userId); + } catch (Exception e) { + log.error("뱃지 및 레벨 체크 실패: userId={}, error={}", userId, e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/application/service/ReviewDeleteService.java b/src/main/java/com/cMall/feedShop/review/application/service/ReviewDeleteService.java new file mode 100644 index 000000000..06ca81c22 --- /dev/null +++ b/src/main/java/com/cMall/feedShop/review/application/service/ReviewDeleteService.java @@ -0,0 +1,275 @@ +package com.cMall.feedShop.review.application.service; + +import com.cMall.feedShop.common.exception.BusinessException; +import com.cMall.feedShop.common.exception.ErrorCode; +import com.cMall.feedShop.common.storage.StorageService; +import com.cMall.feedShop.review.application.dto.response.ReviewDeleteResponse; +import com.cMall.feedShop.review.application.dto.response.ReviewImageDeleteResponse; +import com.cMall.feedShop.review.domain.Review; +import com.cMall.feedShop.review.domain.ReviewImage; +import com.cMall.feedShop.review.domain.exception.ReviewAccessDeniedException; +import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; +import com.cMall.feedShop.review.domain.repository.ReviewImageRepository; +import com.cMall.feedShop.review.domain.repository.ReviewRepository; +import com.cMall.feedShop.user.domain.model.User; +import com.cMall.feedShop.user.domain.repository.UserRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +@Transactional(readOnly = true) +public class ReviewDeleteService { + + private final ReviewRepository reviewRepository; + private final UserRepository userRepository; + private final ReviewImageService reviewImageService; + private final ReviewImageRepository reviewImageRepository; + + // 선택적 의존성 주입으로 변경 (GCP만) + @Autowired(required = false) + private StorageService gcpStorageService; + + // 수동 생성자 (필수 의존성만) + public ReviewDeleteService( + ReviewRepository reviewRepository, + UserRepository userRepository, + ReviewImageService reviewImageService, + ReviewImageRepository reviewImageRepository) { + + this.reviewRepository = reviewRepository; + this.userRepository = userRepository; + this.reviewImageService = reviewImageService; + this.reviewImageRepository = reviewImageRepository; + } + + /** + * 리뷰 전체 삭제 (리뷰 + 모든 이미지) + */ + @Transactional + public ReviewDeleteResponse deleteReview(Long reviewId) { + log.info("리뷰 전체 삭제 시작: reviewId={}", reviewId); + + // 현재 사용자 정보 가져오기 + User currentUser = getCurrentUserFromSecurity(); + + // 리뷰 조회 및 검증 + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); + + // 삭제 권한 확인 + validateDeletePermission(review, currentUser.getId()); + + // 연관된 이미지들 먼저 삭제 + int deletedImageCount = 0; + boolean imagesDeleted = false; + + try { + List reviewImages = reviewImageRepository.findByReviewReviewIdAndDeletedFalse(reviewId); + + if (!reviewImages.isEmpty()) { + // 각 이미지 파일 삭제 (GCP Storage에서) + for (ReviewImage image : reviewImages) { + try { + if (gcpStorageService != null) { + boolean fileDeleted = gcpStorageService.deleteFile(image.getFilePath()); + if (fileDeleted) { + image.delete(); // 소프트 삭제 + deletedImageCount++; + } + } else { + image.delete(); // GCP 없어도 DB에서는 삭제 처리 + deletedImageCount++; + } + } catch (Exception e) { + log.warn("이미지 파일 삭제 실패: imageId={}, filePath={}", + image.getReviewImageId(), image.getFilePath(), e); + } + } + + reviewImageRepository.saveAll(reviewImages); + imagesDeleted = deletedImageCount > 0; + + log.info("리뷰 이미지 삭제 완료: reviewId={}, 삭제된 이미지 수={}", reviewId, deletedImageCount); + } + + } catch (Exception e) { + log.error("리뷰 이미지 삭제 중 오류 발생: reviewId={}", reviewId, e); + // 이미지 삭제 실패해도 리뷰 삭제는 진행 + } + + // 리뷰 소프트 삭제 + review.markAsDeleted(); + reviewRepository.save(review); + + log.info("리뷰 전체 삭제 완료: reviewId={}, 삭제된 이미지 수={}", reviewId, deletedImageCount); + + return ReviewDeleteResponse.of(reviewId, imagesDeleted, deletedImageCount); + } + + /** + * 리뷰 이미지 일괄 삭제 + */ + @Transactional + public ReviewImageDeleteResponse deleteReviewImages(Long reviewId, List imageIds) { + log.info("리뷰 이미지 일괄 삭제 시작: reviewId={}, imageIds={}", reviewId, imageIds); + + // 현재 사용자 정보 가져오기 + User currentUser = getCurrentUserFromSecurity(); + + // 리뷰 조회 및 권한 검증 + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); + + validateUpdatePermission(review, currentUser.getId()); + + List deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, imageIds); + int remainingImageCount = reviewImageService.getActiveImageCount(reviewId); + + log.info("리뷰 이미지 일괄 삭제 완료: reviewId={}, 삭제된 이미지 수={}, 남은 이미지 수={}", + reviewId, deletedImageIds.size(), remainingImageCount); + + return ReviewImageDeleteResponse.of(reviewId, deletedImageIds, remainingImageCount); + } + + /** + * 리뷰 이미지 개별 삭제 + */ + @Transactional + public ReviewImageDeleteResponse deleteReviewImage(Long reviewId, Long imageId) { + log.info("리뷰 이미지 개별 삭제 시작: reviewId={}, imageId={}", reviewId, imageId); + + // 현재 사용자 정보 가져오기 + User currentUser = getCurrentUserFromSecurity(); + + // 리뷰 조회 및 권한 검증 + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); + + validateUpdatePermission(review, currentUser.getId()); + + List deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, List.of(imageId)); + int remainingImageCount = reviewImageService.getActiveImageCount(reviewId); + + if (deletedImageIds.isEmpty()) { + throw new BusinessException(ErrorCode.IMAGE_NOT_FOUND, "삭제할 이미지를 찾을 수 없습니다."); + } + + log.info("리뷰 이미지 개별 삭제 완료: reviewId={}, imageId={}, 남은 이미지 수={}", + reviewId, imageId, remainingImageCount); + + return ReviewImageDeleteResponse.ofSingle(reviewId, imageId, remainingImageCount); + } + + /** + * 리뷰의 모든 이미지 삭제 (리뷰 텍스트는 유지) + */ + @Transactional + public ReviewImageDeleteResponse deleteAllReviewImages(Long reviewId) { + log.info("리뷰 모든 이미지 삭제 시작: reviewId={}", reviewId); + + // 현재 사용자 정보 가져오기 + User currentUser = getCurrentUserFromSecurity(); + + // 리뷰 조회 및 권한 검증 + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); + + validateUpdatePermission(review, currentUser.getId()); + + // 모든 활성 이미지 조회 + List allImages = reviewImageRepository.findByReviewReviewIdAndDeletedFalse(reviewId); + List allImageIds = allImages.stream() + .map(ReviewImage::getReviewImageId) + .toList(); + + if (allImageIds.isEmpty()) { + log.info("삭제할 이미지가 없습니다: reviewId={}", reviewId); + return ReviewImageDeleteResponse.ofAll(reviewId, List.of()); + } + + List deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, allImageIds); + + log.info("리뷰 모든 이미지 삭제 완료: reviewId={}, 삭제된 이미지 수={}", + reviewId, deletedImageIds.size()); + + return ReviewImageDeleteResponse.ofAll(reviewId, deletedImageIds); + } + + /** + * 현재 로그인한 사용자 정보 가져오기 + */ + private User getCurrentUserFromSecurity() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || !authentication.isAuthenticated()) { + throw new BusinessException(ErrorCode.UNAUTHORIZED, "로그인이 필요합니다."); + } + + String userEmail = getUserEmailFromAuthentication(authentication); + return findUserByEmail(userEmail); + } + + /** + * Authentication에서 사용자 이메일 추출 + */ + private String getUserEmailFromAuthentication(Authentication authentication) { + Object principal = authentication.getPrincipal(); + + if (principal instanceof User) { + return ((User) principal).getEmail(); + } else if (principal instanceof UserDetails) { + return ((UserDetails) principal).getUsername(); + } else { + return authentication.getName(); + } + } + + /** + * 이메일로 사용자 조회 + */ + private User findUserByEmail(String email) { + return userRepository.findByEmail(email) + .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND, "사용자를 찾을 수 없습니다: " + email)); + } + + /** + * 리뷰 삭제 권한 검증 + */ + private void validateDeletePermission(Review review, Long userId) { + // 리뷰가 활성 상태인지 확인 + if (!review.isActive()) { + throw new BusinessException(ErrorCode.REVIEW_NOT_FOUND, "이미 삭제된 리뷰입니다."); + } + + // 본인이 작성한 리뷰인지 확인 + if (!review.isOwnedBy(userId)) { + throw new ReviewAccessDeniedException("본인이 작성한 리뷰만 삭제할 수 있습니다."); + } + + log.debug("리뷰 삭제 권한 확인 완료: reviewId={}, userId={}", review.getReviewId(), userId); + } + + /** + * 리뷰 수정 권한 검증 (이미지 삭제 시 사용) + */ + private void validateUpdatePermission(Review review, Long userId) { + // 리뷰가 활성 상태인지 확인 + if (!review.isActive()) { + throw new BusinessException(ErrorCode.REVIEW_NOT_FOUND, "삭제되었거나 숨김 처리된 리뷰는 수정할 수 없습니다."); + } + // 본인이 작성한 리뷰인지 확인 + if (!review.isOwnedBy(userId)) { + throw new ReviewAccessDeniedException("본인이 작성한 리뷰만 수정할 수 있습니다."); + } + + log.debug("리뷰 수정 권한 확인 완료: reviewId={}, userId={}", review.getReviewId(), userId); + } +} \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/application/service/ReviewReadService.java b/src/main/java/com/cMall/feedShop/review/application/service/ReviewReadService.java new file mode 100644 index 000000000..c0352dac3 --- /dev/null +++ b/src/main/java/com/cMall/feedShop/review/application/service/ReviewReadService.java @@ -0,0 +1,397 @@ +package com.cMall.feedShop.review.application.service; + +import com.cMall.feedShop.common.exception.BusinessException; +import com.cMall.feedShop.common.exception.ErrorCode; +import com.cMall.feedShop.product.domain.repository.ProductRepository; +import com.cMall.feedShop.review.application.dto.response.ReviewListResponse; +import com.cMall.feedShop.review.application.dto.response.ReviewResponse; +import com.cMall.feedShop.review.application.dto.response.ReviewImageResponse; +import com.cMall.feedShop.review.domain.Review; +import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; +import com.cMall.feedShop.review.domain.repository.ReviewRepository; +import com.cMall.feedShop.review.domain.enums.Cushion; +import com.cMall.feedShop.review.domain.enums.SizeFit; +import com.cMall.feedShop.review.domain.enums.Stability; +import com.cMall.feedShop.user.domain.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class ReviewReadService { + + private final ReviewRepository reviewRepository; + private final UserRepository userRepository; + private final ProductRepository productRepository; + private final ReviewImageService reviewImageService; + + /** + * 상품별 리뷰 목록 조회 + * + * @param productId 상품 ID + * @param page 페이지 번호 + * @param size 페이지 크기 + * @param sort 정렬 방식 ("points", "latest" 등) + * @return 리뷰 목록 응답 + */ + public ReviewListResponse getProductReviews(Long productId, int page, int size, String sort) { + log.info("상품 리뷰 목록 조회 시작: 상품ID={}, 페이지={}, 크기={}, 정렬={}", productId, page, size, sort); + + try { + + // 페이지 검증 및 기본값 설정 + page = Math.max(0, page); + size = (size < 1 || size > 100) ? 20 : size; + + Pageable pageable = PageRequest.of(page, size); + + Page reviewPage; + if ("points".equals(sort)) { + reviewPage = reviewRepository.findActiveReviewsByProductIdOrderByPoints(productId, pageable); + } else { + reviewPage = reviewRepository.findActiveReviewsByProductId(productId, pageable); + } + + List reviewResponses = convertReviewsToResponses(reviewPage.getContent()); + Page reviewResponsePage = new PageImpl<>( + reviewResponses, pageable, reviewPage.getTotalElements()); + + // 통계 정보 조회 + Double averageRating = reviewRepository.findAverageRatingByProductId(productId); + Long totalReviews = reviewRepository.countActiveReviewsByProductId(productId); + + log.info("리뷰 목록 조회 완료: 총 {}개, 평균 평점 {}", totalReviews, averageRating); + + return ReviewListResponse.of(reviewResponsePage, averageRating, totalReviews); + + } catch (Exception e) { + log.error("상품 리뷰 목록 조회 중 오류 발생: 상품ID={}, 에러={}", productId, e.getMessage(), e); + throw new RuntimeException("리뷰 목록 조회에 실패했습니다: " + e.getMessage(), e); + } + } + + /** + * 필터링이 적용된 상품별 리뷰 목록 조회 + */ + public ReviewListResponse getProductReviewsWithFilters(Long productId, int page, int size, String sort, + Integer rating, String sizeFit, String cushion, String stability) { + log.info("필터링된 상품 리뷰 목록 조회 시작: 상품ID={}, 평점={}, 착용감={}, 쿠션감={}, 안정성={}", + productId, rating, sizeFit, cushion, stability); + + try { + // 페이지 검증 및 기본값 설정 + page = Math.max(0, page); + size = (size < 1 || size > 100) ? 20 : size; + + Pageable pageable = PageRequest.of(page, size); + + // 문자열을 enum으로 변환 + SizeFit sizeFitEnum = sizeFit != null ? SizeFit.valueOf(sizeFit.toUpperCase()) : null; + Cushion cushionEnum = cushion != null ? Cushion.valueOf(cushion.toUpperCase()) : null; + Stability stabilityEnum = stability != null ? Stability.valueOf(stability.toUpperCase()) : null; + + Page reviewPage = reviewRepository.findActiveReviewsByProductIdWithFilters( + productId, rating, sizeFitEnum, cushionEnum, stabilityEnum, pageable); + + List reviewResponses = convertReviewsToResponses(reviewPage.getContent()); + Page reviewResponsePage = new PageImpl<>( + reviewResponses, pageable, reviewPage.getTotalElements()); + + // 통계 정보 조회 (전체 리뷰 기준) + Double averageRating = reviewRepository.findAverageRatingByProductId(productId); + Long totalReviews = reviewRepository.countActiveReviewsByProductId(productId); + + log.info("필터링된 리뷰 목록 조회 완료: 필터링된 {}개, 전체 {}개", reviewPage.getTotalElements(), totalReviews); + + return ReviewListResponse.of(reviewResponsePage, averageRating, totalReviews); + + } catch (IllegalArgumentException e) { + log.error("잘못된 필터 값: {}", e.getMessage()); + throw new BusinessException(ErrorCode.INVALID_INPUT_VALUE, "잘못된 필터 값입니다: " + e.getMessage()); + } catch (Exception e) { + log.error("필터링된 상품 리뷰 목록 조회 중 오류 발생: 상품ID={}, 에러={}", productId, e.getMessage(), e); + throw new RuntimeException("필터링된 리뷰 목록 조회에 실패했습니다: " + e.getMessage(), e); + } + } + + /** + * 리뷰 상세 조회 + */ + public ReviewResponse getReview(Long reviewId) { + log.info("리뷰 상세 조회: ID={}", reviewId); + + Review review = reviewRepository.findByIdWithUserProfile(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); + + if (!review.isActive()) { + throw new ReviewNotFoundException("삭제되었거나 숨김 처리된 리뷰입니다."); + } + + return createReviewResponseSafely(review); + } + + /** + * 사용자의 리뷰 목록 조회 (마이페이지용) + */ + public List getUserReviews(Long userId, int page, int size) { + // TODO: SPRINT 3에서 구현 예정 + log.info("사용자 리뷰 목록 조회 요청: userId={}, page={}, size={}", userId, page, size); + return List.of(); // 임시 반환 + } + + /** + * 리뷰 수정 가능 여부 확인 + */ + public boolean canUpdateReview(Long reviewId, Long userId) { + try { + Review review = reviewRepository.findById(reviewId).orElse(null); + if (review == null) { + return false; + } + return review.canBeUpdatedBy(userId); + } catch (Exception e) { + log.error("리뷰 수정 가능 여부 확인 실패: reviewId={}, userId={}", reviewId, userId, e); + return false; + + } + } + + /** + * 사용자별 삭제된 리뷰 목록 조회 + */ + public List getUserDeletedReviews(Long userId) { + log.info("사용자 삭제된 리뷰 목록 조회: userId={}", userId); + + List deletedReviews = reviewRepository.findDeletedReviewsByUserId(userId); + + List responses = deletedReviews.stream() + .map(this::createReviewResponseSafely) + .toList(); + + log.info("사용자 삭제된 리뷰 조회 완료: userId={}, 개수={}", userId, responses.size()); + + return responses; + } + + /** + * 특정 기간 내 삭제된 리뷰들 조회 (관리자용) + */ + public List getDeletedReviewsBetween(LocalDateTime startDate, LocalDateTime endDate) { + log.info("기간별 삭제된 리뷰 조회: {} ~ {}", startDate, endDate); + + List deletedReviews = reviewRepository.findDeletedReviewsBetween(startDate, endDate); + + List responses = deletedReviews.stream() + .map(this::createReviewResponseSafely) + .toList(); + + log.info("기간별 삭제된 리뷰 조회 완료: 기간={} ~ {}, 개수={}", + startDate, endDate, responses.size()); + + return responses; + } + + /** + * 상품별 리뷰 통계 조회 (활성/삭제/전체 개수) + */ + public ReviewStatsResponse getProductReviewStats(Long productId) { + log.info("상품 리뷰 통계 조회: productId={}", productId); + + Long activeCount = reviewRepository.countActiveReviewsByProductId(productId); + Long deletedCount = reviewRepository.countDeletedReviewsByProductId(productId); + Long totalCount = reviewRepository.countAllReviewsByProductId(productId); + Double averageRating = reviewRepository.findAverageRatingByProductId(productId); + + if (averageRating == null) { + averageRating = 0.0; + } + + // 삭제율 계산 + double deletionRate = totalCount > 0 ? (double) deletedCount / totalCount * 100 : 0.0; + + ReviewStatsResponse response = ReviewStatsResponse.builder() + .productId(productId) + .activeReviewCount(activeCount) + .deletedReviewCount(deletedCount) + .totalReviewCount(totalCount) + .averageRating(averageRating) + .deletionRate(deletionRate) + .generatedAt(LocalDateTime.now()) + .build(); + + log.info("상품 리뷰 통계 조회 완료: productId={}, active={}, deleted={}, total={}, avg={}", + productId, activeCount, deletedCount, totalCount, averageRating); + + return response; + } + + /** + * 사용자별 삭제된 리뷰 개수 조회 + */ + public Long getUserDeletedReviewCount(Long userId) { + log.info("사용자 삭제된 리뷰 개수 조회: userId={}", userId); + + Long deletedCount = reviewRepository.countDeletedReviewsByUserId(userId); + + log.info("사용자 삭제된 리뷰 개수 조회 완료: userId={}, 삭제된 개수={}", userId, deletedCount); + + return deletedCount; + } + + /** + * 최근 30일간 삭제된 리뷰 통계 + */ + public PeriodReviewStatsResponse getRecentDeletedReviewStats() { + LocalDateTime endDate = LocalDateTime.now(); + LocalDateTime startDate = endDate.minusDays(30); + + return getDeletedReviewStatsBetween(startDate, endDate); + } + + /** + * 특정 기간 삭제된 리뷰 통계 + */ + public PeriodReviewStatsResponse getDeletedReviewStatsBetween(LocalDateTime startDate, LocalDateTime endDate) { + log.info("기간별 삭제된 리뷰 통계 조회: {} ~ {}", startDate, endDate); + + List deletedReviews = reviewRepository.findDeletedReviewsBetween(startDate, endDate); + + long totalDeleted = deletedReviews.size(); + long uniqueUsers = deletedReviews.stream() + .mapToLong(review -> review.getUser().getId()) + .distinct() + .count(); + long uniqueProducts = deletedReviews.stream() + .mapToLong(review -> review.getProduct().getProductId()) + .distinct() + .count(); + + double averageRatingOfDeleted = deletedReviews.stream() + .mapToDouble(Review::getRating) + .average() + .orElse(0.0); + + PeriodReviewStatsResponse response = PeriodReviewStatsResponse.builder() + .startDate(startDate) + .endDate(endDate) + .totalDeletedCount(totalDeleted) + .uniqueUserCount(uniqueUsers) + .uniqueProductCount(uniqueProducts) + .averageRatingOfDeleted(averageRatingOfDeleted) + .deletedReviews(deletedReviews.stream() + .map(review -> PeriodReviewStatsResponse.DeletedReviewSummary.builder() + .reviewId(review.getReviewId()) + .userId(review.getUser().getId()) + .productId(review.getProduct().getProductId()) + .rating(review.getRating()) + .title(review.getTitle()) + .deletedAt(review.getUpdatedAt()) + .build()) + .toList()) + .build(); + + log.info("기간별 삭제된 리뷰 통계 조회 완료: 기간={} ~ {}, 총 삭제={}, 사용자={}, 상품={}", + startDate, endDate, totalDeleted, uniqueUsers, uniqueProducts); + + return response; + } + + /** + * 리뷰 목록을 응답으로 변환하는 메서드 + */ + private List convertReviewsToResponses(List reviews) { + return reviews.stream() + .map(this::createReviewResponseSafely) + .toList(); + } + + /** + * 단일 리뷰를 안전하게 응답으로 변환 + */ + private ReviewResponse createReviewResponseSafely(Review review) { + List images = List.of(); // 기본값 + + // 이미지 조회 시도 + try { + images = reviewImageService.getReviewImages(review.getReviewId()); + log.info("✅ 리뷰 이미지 조회 성공: reviewId={}, 이미지 수={}", review.getReviewId(), images.size()); + + // 이미지 URL 로깅 + if (!images.isEmpty()) { + images.forEach(image -> + log.info("🖼️ 최종 이미지 URL: reviewImageId={}, url={}", image.getReviewImageId(), image.getImageUrl()) + ); + } + } catch (Exception e) { + log.warn("이미지 조회 실패, 빈 리스트 사용: reviewId={}, 에러={}", review.getReviewId(), e.getMessage()); + } + + // 응답 생성 시도 + try { + return ReviewResponse.from(review, images); + } catch (Exception e) { + log.warn("이미지 포함 응답 생성 실패, 기본 응답 생성: reviewId={}, 에러={}", review.getReviewId(), e.getMessage()); + return ReviewResponse.from(review); + } + } + + // ============= 필요한 응답 DTO들 (내부 클래스) ============= + + /** + * 상품별 리뷰 통계 응답 DTO + */ + @lombok.Getter + @lombok.Builder + @lombok.AllArgsConstructor + @lombok.NoArgsConstructor + public static class ReviewStatsResponse { + private Long productId; + private Long activeReviewCount; + private Long deletedReviewCount; + private Long totalReviewCount; + private Double averageRating; + private Double deletionRate; + private LocalDateTime generatedAt; + } + + /** + * 기간별 리뷰 통계 응답 DTO + */ + @lombok.Getter + @lombok.Builder + @lombok.AllArgsConstructor + @lombok.NoArgsConstructor + public static class PeriodReviewStatsResponse { + private LocalDateTime startDate; + private LocalDateTime endDate; + private Long totalDeletedCount; + private Long uniqueUserCount; + private Long uniqueProductCount; + private Double averageRatingOfDeleted; + private List deletedReviews; + + @lombok.Getter + @lombok.Builder + @lombok.AllArgsConstructor + @lombok.NoArgsConstructor + public static class DeletedReviewSummary { + private Long reviewId; + private Long userId; + private Long productId; + private Integer rating; + private String title; + private LocalDateTime deletedAt; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/application/service/ReviewService.java b/src/main/java/com/cMall/feedShop/review/application/service/ReviewService.java index 3482c9b17..b911d9f82 100644 --- a/src/main/java/com/cMall/feedShop/review/application/service/ReviewService.java +++ b/src/main/java/com/cMall/feedShop/review/application/service/ReviewService.java @@ -1,106 +1,34 @@ package com.cMall.feedShop.review.application.service; -import com.cMall.feedShop.common.dto.UploadResult; -import com.cMall.feedShop.common.exception.BusinessException; -import com.cMall.feedShop.common.exception.ErrorCode; -import com.cMall.feedShop.common.storage.StorageService; -import com.cMall.feedShop.common.storage.UploadDirectory; -import com.cMall.feedShop.product.domain.model.Product; -import com.cMall.feedShop.product.domain.repository.ProductRepository; import com.cMall.feedShop.review.application.dto.request.ReviewCreateRequest; import com.cMall.feedShop.review.application.dto.request.ReviewUpdateRequest; import com.cMall.feedShop.review.application.dto.response.*; -import com.cMall.feedShop.review.application.dto.response.ReviewDeleteResponse; -import com.cMall.feedShop.review.application.dto.response.ReviewImageDeleteResponse; -import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; -import com.cMall.feedShop.review.domain.exception.ReviewAccessDeniedException; -import com.cMall.feedShop.review.domain.Review; -import com.cMall.feedShop.review.domain.ReviewImage; -import com.cMall.feedShop.review.domain.repository.ReviewRepository; -import com.cMall.feedShop.review.domain.repository.ReviewImageRepository; -import com.cMall.feedShop.review.domain.service.ReviewDuplicationValidator; -import com.cMall.feedShop.review.domain.service.ReviewPurchaseVerificationService; -import com.cMall.feedShop.review.domain.enums.Cushion; -import com.cMall.feedShop.review.domain.enums.SizeFit; -import com.cMall.feedShop.review.domain.enums.Stability; -import com.cMall.feedShop.user.domain.model.User; -import com.cMall.feedShop.user.domain.repository.UserRepository; -import com.cMall.feedShop.user.application.service.BadgeService; -import com.cMall.feedShop.user.application.service.UserLevelService; -import com.cMall.feedShop.user.application.service.PointService; -import com.cMall.feedShop.user.domain.model.ActivityType; -import jakarta.persistence.EntityNotFoundException; - +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; - -import org.springframework.data.domain.PageImpl; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import java.util.ArrayList; -import java.util.List; import java.time.LocalDateTime; -import java.util.Optional; -import java.util.stream.Collectors; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import java.util.List; +/** + * 리뷰 서비스 Facade + * 기존 ReviewService의 모든 기능을 CRUD별 서비스로 위임하여 처리 + * 기존 코드와의 호환성을 유지하면서 서비스를 분리한 구조 + */ @Slf4j @Service +@RequiredArgsConstructor @Transactional(readOnly = true) public class ReviewService { - private final ReviewRepository reviewRepository; - private final UserRepository userRepository; - private final ProductRepository productRepository; - private final ReviewDuplicationValidator duplicationValidator; - private final ReviewPurchaseVerificationService purchaseVerificationService; - private final ReviewImageService reviewImageService; - private final ReviewImageRepository reviewImageRepository; - private final BadgeService badgeService; - private final UserLevelService userLevelService; - private final PointService pointService; - - // 선택적 의존성 주입으로 변경 (GCP만) - @Autowired(required = false) - private StorageService gcpStorageService; - - // 수동 생성자 (필수 의존성만) - public ReviewService( - ReviewRepository reviewRepository, - UserRepository userRepository, - ProductRepository productRepository, - ReviewDuplicationValidator duplicationValidator, - ReviewPurchaseVerificationService purchaseVerificationService, - ReviewImageService reviewImageService, - ReviewImageRepository reviewImageRepository, - BadgeService badgeService, - UserLevelService userLevelService, - PointService pointService) { - - this.reviewRepository = reviewRepository; - this.userRepository = userRepository; - this.productRepository = productRepository; - this.duplicationValidator = duplicationValidator; - this.purchaseVerificationService = purchaseVerificationService; - this.reviewImageService = reviewImageService; - this.reviewImageRepository = reviewImageRepository; - this.badgeService = badgeService; - this.userLevelService = userLevelService; - this.pointService = pointService; - - } + private final ReviewCreateService reviewCreateService; + private final ReviewReadService reviewReadService; + private final ReviewUpdateService reviewUpdateService; + private final ReviewDeleteService reviewDeleteService; + // =================== CREATE 관련 메서드들 =================== /** * 리뷰 생성 (DTO 불변성 적용) @@ -111,662 +39,163 @@ public ReviewService( */ @Transactional public ReviewCreateResponse createReview(ReviewCreateRequest request, List images) { - // 현재 로그인한 사용자 가져오기 - User user = getCurrentUserFromSecurity(); - - // Product 조회 - Product product = productRepository.findById(request.getProductId()) - .orElseThrow(() -> new EntityNotFoundException("상품을 찾을 수 없습니다: " + request.getProductId())); - - // 중복 리뷰 검증 - duplicationValidator.validateNoDuplicateActiveReview(user.getId(), product.getProductId()); - - // 구매이력 검증 - purchaseVerificationService.validateUserPurchasedProduct(user, product.getProductId()); - - // ✅ DTO에서 직접 값 추출 (불변 필드) - Review review = Review.builder() - .title(request.getTitle()) - .rating(request.getRating()) - .sizeFit(request.getSizeFit()) - .cushion(request.getCushion()) - .stability(request.getStability()) - .content(request.getContent()) - .user(user) - .product(product) - .build(); - - // Review 저장 - Review savedReview = reviewRepository.save(review); - - // GCP Storage만 사용하도록 단순화 - List imageUrls = new ArrayList<>(); - if (images != null && !images.isEmpty()) { - try { - log.info("이미지 업로드 시작: {} 개의 파일", images.size()); - - // GCP Storage 서비스만 사용 - if (gcpStorageService != null) { - log.info("GCP Storage 서비스 사용"); - List uploadResults = gcpStorageService.uploadFilesWithDetails(images, UploadDirectory.REVIEWS); - - if (!uploadResults.isEmpty()) { - // UploadResult를 ReviewImage로 저장 - saveReviewImagesFromUploadResults(savedReview, uploadResults); - - // URL만 추출해서 응답용으로 사용 - imageUrls = uploadResults.stream() - .map(UploadResult::getFilePath) - .collect(Collectors.toList()); - } - } else { - log.warn("GCP Storage 서비스가 없습니다. 이미지 없이 리뷰만 저장합니다."); - } - - log.info("이미지 업로드 완료: {}", imageUrls); - } catch (Exception e) { - log.error("이미지 업로드 실패했지만 리뷰는 저장됩니다.", e); - // 이미지 실패해도 리뷰는 정상 저장되도록 예외를 던지지 않음 - } - } - - // ✅ 로컬 이미지 처리도 별도 파라미터로 처리 - if (images != null && !images.isEmpty()) { - reviewImageService.saveReviewImages(savedReview, images); - log.info("리뷰 이미지 업로드 완료 (기존 방식): reviewId={}, imageCount={}", - savedReview.getReviewId(), images.size()); - } - - // 리뷰 작성 포인트 적립 - int pointsEarned = awardPointsForReview(user, savedReview.getReviewId()); - - // 뱃지 자동 수여 체크 - checkAndAwardBadgesAfterReview(user.getId()); - - // 기본 응답 반환 (currentPoints는 Controller에서 별도 처리) - return ReviewCreateResponse.builder() - .reviewId(savedReview.getReviewId()) - .message("리뷰가 성공적으로 등록되었습니다.") - .imageUrls(imageUrls) - .pointsEarned(pointsEarned) - .currentPoints(null) // Controller에서 설정될 예정 - .build(); + log.info("Facade: 리뷰 생성 요청 위임 - CreateService로 전달"); + return reviewCreateService.createReview(request, images); } - // =================== 리뷰 수정 메서드 =================== + // =================== READ 관련 메서드들 =================== /** - * 리뷰 수정 (이미지 포함) - DTO 불변성 적용 - * - * @param reviewId 수정할 리뷰 ID - * @param request 불변 리뷰 수정 요청 DTO - * @param newImages 새로 추가할 이미지들 (별도 파라미터) - * @return 수정 결과 응답 - */ - @Transactional - public ReviewUpdateResponse updateReview(Long reviewId, ReviewUpdateRequest request, - List newImages) { - - log.info("리뷰 수정 시작: reviewId={}", reviewId); - - // 1. 현재 로그인한 사용자 정보 가져오기 - User currentUser = getCurrentUserFromSecurity(); - - // 2. 수정할 리뷰 조회 - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); - - // 3. 수정 권한 확인 - validateUpdatePermission(review, currentUser.getId()); - - // 4. ✅ DTO에서 직접 값 추출하여 리뷰 기본 정보 수정 - review.updateReviewInfo( - request.getTitle(), - request.getRating(), - request.getContent(), - request.getSizeFit(), - request.getCushion(), - request.getStability() - ); - - // 5. 이미지 수정 처리 - List newImageUrls = new ArrayList<>(); - List deletedImageIds = new ArrayList<>(); - - try { - // ✅ DTO에서 삭제할 이미지 ID 목록 추출 - if (request.getDeleteImageIds() != null && !request.getDeleteImageIds().isEmpty()) { - deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, request.getDeleteImageIds()); - log.info("이미지 삭제 완료: reviewId={}, 삭제된 개수={}", reviewId, deletedImageIds.size()); - } - - // 새 이미지 추가 처리 (별도 파라미터) - if (newImages != null && !newImages.isEmpty()) { - newImageUrls = addNewImages(review, newImages); - log.info("새 이미지 추가 완료: reviewId={}, 추가된 개수={}", reviewId, newImageUrls.size()); - } - - } catch (Exception e) { - log.error("이미지 처리 중 오류 발생: reviewId={}, error={}", reviewId, e.getMessage(), e); - // 이미지 처리 실패 시에도 리뷰 텍스트 수정은 유지하고 경고만 로그 - log.warn("이미지 처리는 실패했지만 리뷰 내용 수정은 완료되었습니다."); - } - - // 6. 리뷰 저장 - Review updatedReview = reviewRepository.save(review); - - // 7. 최종 이미지 개수 확인 - int totalImageCount = reviewImageService.getActiveImageCount(reviewId); - - log.info("리뷰 수정 완료: reviewId={}, 총 이미지 수={}", reviewId, totalImageCount); - // GitHub CI 빌드 오류 해결을 위한 동기화 - - return ReviewUpdateResponse.of( - updatedReview.getReviewId(), - newImageUrls, - deletedImageIds, - totalImageCount - ); - } - - /** - * 현재 로그인한 사용자 정보 가져오기 - */ - private User getCurrentUserFromSecurity() { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - - if (authentication == null || !authentication.isAuthenticated()) { - throw new BusinessException(ErrorCode.UNAUTHORIZED, "로그인이 필요합니다."); - } - - String userEmail = getUserEmailFromAuthentication(authentication); - return findUserByEmail(userEmail); - } - - /** - * Authentication에서 사용자 이메일 추출 + * 상품별 리뷰 목록 조회 */ - private String getUserEmailFromAuthentication(Authentication authentication) { - Object principal = authentication.getPrincipal(); - - if (principal instanceof User) { - return ((User) principal).getEmail(); - } else if (principal instanceof UserDetails) { - return ((UserDetails) principal).getUsername(); - } else { - return authentication.getName(); - } + public ReviewListResponse getProductReviews(Long productId, int page, int size, String sort) { + log.info("Facade: 상품별 리뷰 목록 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getProductReviews(productId, page, size, sort); } /** - * 리뷰 수정 권한 검증 + * 필터링이 적용된 상품별 리뷰 목록 조회 */ - private void validateUpdatePermission(Review review, Long userId) { - // 리뷰가 활성 상태인지 확인 - if (!review.isActive()) { - throw new BusinessException(ErrorCode.REVIEW_NOT_FOUND, "삭제되었거나 숨김 처리된 리뷰는 수정할 수 없습니다."); - } - // 본인이 작성한 리뷰인지 확인 - if (!review.isOwnedBy(userId)) { - throw new ReviewAccessDeniedException("본인이 작성한 리뷰만 수정할 수 있습니다."); - } - - log.debug("리뷰 수정 권한 확인 완료: reviewId={}, userId={}", review.getReviewId(), userId); + public ReviewListResponse getProductReviewsWithFilters(Long productId, int page, int size, String sort, + Integer rating, String sizeFit, String cushion, String stability) { + log.info("Facade: 필터링된 상품별 리뷰 목록 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getProductReviewsWithFilters(productId, page, size, sort, rating, sizeFit, cushion, stability); } /** - * 새 이미지들 추가 처리 + * 리뷰 상세 조회 */ - private List addNewImages(Review review, List newImages) { - List newImageUrls = new ArrayList<>(); - - if (newImages == null || newImages.isEmpty()) { - return newImageUrls; - } - - try { - // GCP Storage 사용 - if (gcpStorageService != null) { - log.info("GCP Storage로 새 이미지 업로드 시작: reviewId={}, 이미지 수={}", - review.getReviewId(), newImages.size()); - - List uploadResults = - gcpStorageService.uploadFilesWithDetails(newImages, UploadDirectory.REVIEWS); - - if (!uploadResults.isEmpty()) { - // UploadResult를 ReviewImage로 저장 - saveReviewImagesFromUploadResults(review, uploadResults); - - // URL 추출 - newImageUrls = uploadResults.stream() - .map(UploadResult::getFilePath) - .collect(Collectors.toList()); - } - } else { - // GCP Storage가 없을 때 기존 로컬 방식 사용 - log.info("로컬 이미지 처리 시작: reviewId={}, 이미지 수={}", - review.getReviewId(), newImages.size()); - - List savedImages = reviewImageService.saveReviewImages(review, newImages); - - // 로컬 이미지 URL 생성 (기본 URL + 파일 경로) - newImageUrls = savedImages.stream() - .map(image -> "/uploads/images/reviews/" + image.getFilePath()) - .collect(Collectors.toList()); - - log.info("로컬 이미지 업로드 완료: reviewId={}, 저장된 이미지 수={}", - review.getReviewId(), savedImages.size()); - } - - } catch (Exception e) { - log.error("새 이미지 추가 실패: reviewId={}", review.getReviewId(), e); - throw new BusinessException(ErrorCode.FILE_UPLOAD_ERROR, "이미지 업로드에 실패했습니다: " + e.getMessage()); - } - - return newImageUrls; + public ReviewResponse getReview(Long reviewId) { + log.info("Facade: 리뷰 상세 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getReview(reviewId); } /** - * 리뷰 수정 (간단 버전 - 이미지 없이) + * 사용자의 리뷰 목록 조회 (마이페이지용) */ - @Transactional - public void updateReviewSimple(Long reviewId, ReviewUpdateRequest request) { - updateReview(reviewId, request, null); + public List getUserReviews(Long userId, int page, int size) { + log.info("Facade: 사용자 리뷰 목록 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getUserReviews(userId, page, size); } /** - * 리뷰 제목만 수정 + * 리뷰 수정 가능 여부 확인 */ - @Transactional - public void updateReviewTitle(Long reviewId, String newTitle) { - User currentUser = getCurrentUserFromSecurity(); - - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("리뷰를 찾을 수 없습니다.")); - - validateUpdatePermission(review, currentUser.getId()); - - review.updateTitle(newTitle); - reviewRepository.save(review); - - log.info("리뷰 제목 수정 완료: reviewId={}, newTitle={}", reviewId, newTitle); + public boolean canUpdateReview(Long reviewId, Long userId) { + log.debug("Facade: 리뷰 수정 가능 여부 확인 요청 위임 - ReadService로 전달"); + return reviewReadService.canUpdateReview(reviewId, userId); } /** - * 리뷰 평점만 수정 + * 사용자별 삭제된 리뷰 목록 조회 */ - @Transactional - public void updateReviewRating(Long reviewId, Integer newRating) { - User currentUser = getCurrentUserFromSecurity(); - - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("리뷰를 찾을 수 없습니다.")); - - validateUpdatePermission(review, currentUser.getId()); - - review.updateRating(newRating); - reviewRepository.save(review); - - log.info("리뷰 평점 수정 완료: reviewId={}, newRating={}", reviewId, newRating); + public List getUserDeletedReviews(Long userId) { + log.info("Facade: 사용자 삭제된 리뷰 목록 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getUserDeletedReviews(userId); } /** - * 리뷰 내용만 수정 + * 특정 기간 내 삭제된 리뷰들 조회 (관리자용) */ - @Transactional - public void updateReviewContent(Long reviewId, String newContent) { - User currentUser = getCurrentUserFromSecurity(); - - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("리뷰를 찾을 수 없습니다.")); - - validateUpdatePermission(review, currentUser.getId()); - - review.updateContent(newContent); - reviewRepository.save(review); - - log.info("리뷰 내용 수정 완료: reviewId={}", reviewId); - } - - // 업로드 결과를 기존 ReviewImage 엔티티로 저장 - private void saveReviewImagesFromUploadResults(Review review, List uploadResults) { - log.info("업로드 결과를 ReviewImage 엔티티로 저장 시작: reviewId={}, resultCount={}", - review.getReviewId(), uploadResults.size()); - - try { - for (int i = 0; i < uploadResults.size(); i++) { - UploadResult result = uploadResults.get(i); - - ReviewImage reviewImage = ReviewImage.builder() - .review(review) - .originalFilename(result.getOriginalFilename()) - .storedFilename(result.getStoredFilename()) - .filePath(result.getFilePath()) - .fileSize(result.getFileSize()) - .contentType(result.getContentType()) - .imageOrder(i) - .build(); - - ReviewImage savedImage = reviewImageRepository.save(reviewImage); - - log.debug("ReviewImage 저장 완료: id={}, url={}, imageOrder={}", - savedImage.getReviewImageId(), result.getFilePath(), i); - } - - log.info("업로드 결과 저장 완료: reviewId={}, 저장된 이미지 수={}", - review.getReviewId(), uploadResults.size()); - - } catch (Exception e) { - log.error("업로드 결과 저장 실패: reviewId={}", review.getReviewId(), e); - - // 이미 업로드된 GCP Storage 파일들 삭제 (롤백) - List imageUrls = uploadResults.stream() - .map(UploadResult::getFilePath) - .collect(Collectors.toList()); - rollbackUploadedImages(imageUrls); - - throw new RuntimeException("리뷰 이미지 저장에 실패했습니다", e); - } + public List getDeletedReviewsBetween(LocalDateTime startDate, LocalDateTime endDate) { + log.info("Facade: 기간별 삭제된 리뷰 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getDeletedReviewsBetween(startDate, endDate); } /** - * 업로드된 이미지들을 GCP Storage에서 삭제 (롤백용) + * 상품별 리뷰 통계 조회 (활성/삭제/전체 개수) */ - private void rollbackUploadedImages(List imageUrls) { - log.warn("이미지 저장 실패로 인한 GCP Storage 파일 삭제 시작: {} 개의 파일", imageUrls.size()); - - for (String imageUrl : imageUrls) { - try { - // GCP Storage만 사용 - if (gcpStorageService != null) { - boolean deleted = gcpStorageService.deleteFile(imageUrl); - if (deleted) { - log.info("롤백: GCP Storage 파일 삭제 성공: {}", imageUrl); - } else { - log.warn("롤백: GCP Storage 파일 삭제 실패: {}", imageUrl); - } - } else { - log.warn("롤백: GCP Storage 서비스가 없습니다: {}", imageUrl); - } - } catch (Exception e) { - log.error("롤백: 파일 삭제 중 오류: {}", imageUrl, e); - } - } + public ReviewReadService.ReviewStatsResponse getProductReviewStats(Long productId) { + log.info("Facade: 상품 리뷰 통계 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getProductReviewStats(productId); } /** - * 임시 테스트용 사용자 반환 (개발 환경용) + * 사용자별 삭제된 리뷰 개수 조회 */ - private User getTestUser() { - // DB에서 첫 번째 사용자를 가져와서 테스트용으로 사용 - List allUsers = userRepository.findAll(); - if (allUsers.isEmpty()) { - throw new BusinessException(ErrorCode.USER_NOT_FOUND, "테스트용 사용자가 없습니다. 사용자를 먼저 생성해주세요."); - } - User testUser = allUsers.get(0); - log.info("테스트용 사용자 사용: email={}, id={}", testUser.getEmail(), testUser.getId()); - return testUser; + public Long getUserDeletedReviewCount(Long userId) { + log.info("Facade: 사용자 삭제된 리뷰 개수 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getUserDeletedReviewCount(userId); } /** - * 여러 방법으로 사용자 조회 시도 + * 최근 30일간 삭제된 리뷰 통계 */ - private User findUserByEmail(String userEmail) { - log.info("사용자 조회 시작: email='{}'", userEmail); - - // 1. 기본 조회 - Optional userOptional = userRepository.findByEmail(userEmail); - if (userOptional.isPresent()) { - log.info("기본 조회 성공"); - return userOptional.get(); - } - - // 3. 직접 대소문자 무시 조회 - List allUsers = userRepository.findAll(); - for (User user : allUsers) { - if (user.getEmail().equalsIgnoreCase(userEmail)) { - log.warn("대소문자 차이로 사용자 발견! DB: '{}', 요청: '{}'", user.getEmail(), userEmail); - return user; - } - } - - // 4. 모든 방법 실패 - log.error("모든 방법으로 사용자 조회 실패: email='{}'", userEmail); - throw new BusinessException(ErrorCode.USER_NOT_FOUND, "사용자를 찾을 수 없습니다: " + userEmail); + public ReviewReadService.PeriodReviewStatsResponse getRecentDeletedReviewStats() { + log.info("Facade: 최근 삭제된 리뷰 통계 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getRecentDeletedReviewStats(); } /** - * 상품별 리뷰 목록 조회 + * 특정 기간 삭제된 리뷰 통계 */ - @Transactional(readOnly = true) - public ReviewListResponse getProductReviews(Long productId, int page, int size, String sort) { - log.info("상품 리뷰 목록 조회 시작: 상품ID={}, 페이지={}, 크기={}, 정렬={}", productId, page, size, sort); - - try { - - // 페이지 검증 및 기본값 설정 - page = Math.max(0, page); - size = (size < 1 || size > 100) ? 20 : size; - - Pageable pageable = PageRequest.of(page, size); - - Page reviewPage; - if ("points".equals(sort)) { - reviewPage = reviewRepository.findActiveReviewsByProductIdOrderByPoints(productId, pageable); - } else { - reviewPage = reviewRepository.findActiveReviewsByProductId(productId, pageable); - } - - List reviewResponses = convertReviewsToResponses(reviewPage.getContent()); - Page reviewResponsePage = new PageImpl<>( - reviewResponses, pageable, reviewPage.getTotalElements()); - - // 통계 정보 조회 - Double averageRating = reviewRepository.findAverageRatingByProductId(productId); - Long totalReviews = reviewRepository.countActiveReviewsByProductId(productId); - - log.info("리뷰 목록 조회 완료: 총 {}개, 평균 평점 {}", totalReviews, averageRating); - - return ReviewListResponse.of(reviewResponsePage, averageRating, totalReviews); - - } catch (Exception e) { - log.error("상품 리뷰 목록 조회 중 오류 발생: 상품ID={}, 에러={}", productId, e.getMessage(), e); - throw new RuntimeException("리뷰 목록 조회에 실패했습니다: " + e.getMessage(), e); - } + public ReviewReadService.PeriodReviewStatsResponse getDeletedReviewStatsBetween(LocalDateTime startDate, LocalDateTime endDate) { + log.info("Facade: 기간별 삭제된 리뷰 통계 조회 요청 위임 - ReadService로 전달"); + return reviewReadService.getDeletedReviewStatsBetween(startDate, endDate); } - /** - * 필터링이 적용된 상품별 리뷰 목록 조회 - */ - @Transactional(readOnly = true) - public ReviewListResponse getProductReviewsWithFilters(Long productId, int page, int size, String sort, - Integer rating, String sizeFit, String cushion, String stability) { - log.info("필터링된 상품 리뷰 목록 조회 시작: 상품ID={}, 평점={}, 착용감={}, 쿠션감={}, 안정성={}", - productId, rating, sizeFit, cushion, stability); - - try { - // 페이지 검증 및 기본값 설정 - page = Math.max(0, page); - size = (size < 1 || size > 100) ? 20 : size; - - Pageable pageable = PageRequest.of(page, size); - - // 문자열을 enum으로 변환 - SizeFit sizeFitEnum = sizeFit != null ? SizeFit.valueOf(sizeFit.toUpperCase()) : null; - Cushion cushionEnum = cushion != null ? Cushion.valueOf(cushion.toUpperCase()) : null; - Stability stabilityEnum = stability != null ? Stability.valueOf(stability.toUpperCase()) : null; - - Page reviewPage = reviewRepository.findActiveReviewsByProductIdWithFilters( - productId, rating, sizeFitEnum, cushionEnum, stabilityEnum, pageable); - - List reviewResponses = convertReviewsToResponses(reviewPage.getContent()); - Page reviewResponsePage = new PageImpl<>( - reviewResponses, pageable, reviewPage.getTotalElements()); - - // 통계 정보 조회 (전체 리뷰 기준) - Double averageRating = reviewRepository.findAverageRatingByProductId(productId); - Long totalReviews = reviewRepository.countActiveReviewsByProductId(productId); - - log.info("필터링된 리뷰 목록 조회 완료: 필터링된 {}개, 전체 {}개", reviewPage.getTotalElements(), totalReviews); - - return ReviewListResponse.of(reviewResponsePage, averageRating, totalReviews); - - } catch (IllegalArgumentException e) { - log.error("잘못된 필터 값: {}", e.getMessage()); - throw new BusinessException(ErrorCode.INVALID_INPUT_VALUE, "잘못된 필터 값입니다: " + e.getMessage()); - } catch (Exception e) { - log.error("필터링된 상품 리뷰 목록 조회 중 오류 발생: 상품ID={}, 에러={}", productId, e.getMessage(), e); - throw new RuntimeException("필터링된 리뷰 목록 조회에 실패했습니다: " + e.getMessage(), e); - } - } + // =================== UPDATE 관련 메서드들 =================== /** - * 리뷰 상세 조회 + * 리뷰 수정 (이미지 포함) - DTO 불변성 적용 + * + * @param reviewId 수정할 리뷰 ID + * @param request 불변 리뷰 수정 요청 DTO + * @param newImages 새로 추가할 이미지들 (별도 파라미터) + * @return 수정 결과 응답 */ - @Transactional(readOnly = true) - public ReviewResponse getReview(Long reviewId) { - log.info("리뷰 상세 조회: ID={}", reviewId); - - Review review = reviewRepository.findByIdWithUserProfile(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); - - if (!review.isActive()) { - throw new ReviewNotFoundException("삭제되었거나 숨김 처리된 리뷰입니다."); - } - - return createReviewResponseSafely(review); + @Transactional + public ReviewUpdateResponse updateReview(Long reviewId, ReviewUpdateRequest request, + List newImages) { + log.info("Facade: 리뷰 수정 요청 위임 - UpdateService로 전달"); + return reviewUpdateService.updateReview(reviewId, request, newImages); } /** - * 리뷰 목록을 응답으로 변환하는 메서드 + * 리뷰 수정 (간단 버전 - 이미지 없이) */ - private List convertReviewsToResponses(List reviews) { - return reviews.stream() - .map(this::createReviewResponseSafely) - .toList(); + @Transactional + public void updateReviewSimple(Long reviewId, ReviewUpdateRequest request) { + log.info("Facade: 리뷰 간단 수정 요청 위임 - UpdateService로 전달"); + reviewUpdateService.updateReviewSimple(reviewId, request); } /** - * 단일 리뷰를 안전하게 응답으로 변환 + * 리뷰 제목만 수정 */ - private ReviewResponse createReviewResponseSafely(Review review) { - List images = List.of(); // 기본값 - - // 이미지 조회 시도 - try { - images = reviewImageService.getReviewImages(review.getReviewId()); - log.info("✅ 리뷰 이미지 조회 성공: reviewId={}, 이미지 수={}", review.getReviewId(), images.size()); - - // 이미지 URL 로깅 - if (!images.isEmpty()) { - images.forEach(image -> - log.info("🖼️ 최종 이미지 URL: reviewImageId={}, url={}", image.getReviewImageId(), image.getImageUrl()) - ); - } - } catch (Exception e) { - log.warn("이미지 조회 실패, 빈 리스트 사용: reviewId={}, 에러={}", review.getReviewId(), e.getMessage()); - } - - // 응답 생성 시도 - try { - return ReviewResponse.from(review, images); - } catch (Exception e) { - log.warn("이미지 포함 응답 생성 실패, 기본 응답 생성: reviewId={}, 에러={}", review.getReviewId(), e.getMessage()); - return ReviewResponse.from(review); - } + @Transactional + public void updateReviewTitle(Long reviewId, String newTitle) { + log.info("Facade: 리뷰 제목 수정 요청 위임 - UpdateService로 전달"); + reviewUpdateService.updateReviewTitle(reviewId, newTitle); } /** - * 리뷰 수정 가능 여부 확인 + * 리뷰 평점만 수정 */ - public boolean canUpdateReview(Long reviewId, Long userId) { - try { - Review review = reviewRepository.findById(reviewId).orElse(null); - if (review == null) { - return false; - } - return review.canBeUpdatedBy(userId); - } catch (Exception e) { - log.error("리뷰 수정 가능 여부 확인 실패: reviewId={}, userId={}", reviewId, userId, e); - return false; - - } + @Transactional + public void updateReviewRating(Long reviewId, Integer newRating) { + log.info("Facade: 리뷰 평점 수정 요청 위임 - UpdateService로 전달"); + reviewUpdateService.updateReviewRating(reviewId, newRating); } /** - * 사용자의 리뷰 목록 조회 (마이페이지용) + * 리뷰 내용만 수정 */ - @Transactional(readOnly = true) - public List getUserReviews(Long userId, int page, int size) { - // TODO: SPRINT 3에서 구현 예정 - log.info("사용자 리뷰 목록 조회 요청: userId={}, page={}, size={}", userId, page, size); - return List.of(); // 임시 반환 + @Transactional + public void updateReviewContent(Long reviewId, String newContent) { + log.info("Facade: 리뷰 내용 수정 요청 위임 - UpdateService로 전달"); + reviewUpdateService.updateReviewContent(reviewId, newContent); } - // ============= 리뷰 삭제 관련 메서드들 ============= + // =================== DELETE 관련 메서드들 =================== /** * 리뷰 전체 삭제 (리뷰 + 모든 이미지) */ @Transactional public ReviewDeleteResponse deleteReview(Long reviewId) { - log.info("리뷰 전체 삭제 시작: reviewId={}", reviewId); - - // 현재 사용자 정보 가져오기 - User currentUser = getCurrentUserFromSecurity(); - - // 리뷰 조회 및 검증 - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); - - // 삭제 권한 확인 - validateDeletePermission(review, currentUser.getId()); - - // 연관된 이미지들 먼저 삭제 - int deletedImageCount = 0; - boolean imagesDeleted = false; - - try { - List reviewImages = reviewImageRepository.findByReviewReviewIdAndDeletedFalse(reviewId); - - if (!reviewImages.isEmpty()) { - // 각 이미지 파일 삭제 (GCP Storage에서) - for (ReviewImage image : reviewImages) { - try { - if (gcpStorageService != null) { - boolean fileDeleted = gcpStorageService.deleteFile(image.getFilePath()); - if (fileDeleted) { - image.delete(); // 소프트 삭제 - deletedImageCount++; - } - } else { - image.delete(); // GCP 없어도 DB에서는 삭제 처리 - deletedImageCount++; - } - } catch (Exception e) { - log.warn("이미지 파일 삭제 실패: imageId={}, filePath={}", - image.getReviewImageId(), image.getFilePath(), e); - } - } - - reviewImageRepository.saveAll(reviewImages); - imagesDeleted = deletedImageCount > 0; - - log.info("리뷰 이미지 삭제 완료: reviewId={}, 삭제된 이미지 수={}", reviewId, deletedImageCount); - } - - } catch (Exception e) { - log.error("리뷰 이미지 삭제 중 오류 발생: reviewId={}", reviewId, e); - // 이미지 삭제 실패해도 리뷰 삭제는 진행 - } - - // 리뷰 소프트 삭제 - review.markAsDeleted(); - reviewRepository.save(review); - - log.info("리뷰 전체 삭제 완료: reviewId={}, 삭제된 이미지 수={}", reviewId, deletedImageCount); - - return ReviewDeleteResponse.of(reviewId, imagesDeleted, deletedImageCount); + log.info("Facade: 리뷰 전체 삭제 요청 위임 - DeleteService로 전달"); + return reviewDeleteService.deleteReview(reviewId); } /** @@ -774,24 +203,8 @@ public ReviewDeleteResponse deleteReview(Long reviewId) { */ @Transactional public ReviewImageDeleteResponse deleteReviewImages(Long reviewId, List imageIds) { - log.info("리뷰 이미지 일괄 삭제 시작: reviewId={}, imageIds={}", reviewId, imageIds); - - // 현재 사용자 정보 가져오기 - User currentUser = getCurrentUserFromSecurity(); - - // 리뷰 조회 및 권한 검증 - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); - - validateUpdatePermission(review, currentUser.getId()); - - List deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, imageIds); - int remainingImageCount = reviewImageService.getActiveImageCount(reviewId); - - log.info("리뷰 이미지 일괄 삭제 완료: reviewId={}, 삭제된 이미지 수={}, 남은 이미지 수={}", - reviewId, deletedImageIds.size(), remainingImageCount); - - return ReviewImageDeleteResponse.of(reviewId, deletedImageIds, remainingImageCount); + log.info("Facade: 리뷰 이미지 일괄 삭제 요청 위임 - DeleteService로 전달"); + return reviewDeleteService.deleteReviewImages(reviewId, imageIds); } /** @@ -799,28 +212,8 @@ public ReviewImageDeleteResponse deleteReviewImages(Long reviewId, List im */ @Transactional public ReviewImageDeleteResponse deleteReviewImage(Long reviewId, Long imageId) { - log.info("리뷰 이미지 개별 삭제 시작: reviewId={}, imageId={}", reviewId, imageId); - - // 현재 사용자 정보 가져오기 - User currentUser = getCurrentUserFromSecurity(); - - // 리뷰 조회 및 권한 검증 - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); - - validateUpdatePermission(review, currentUser.getId()); - - List deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, List.of(imageId)); - int remainingImageCount = reviewImageService.getActiveImageCount(reviewId); - - if (deletedImageIds.isEmpty()) { - throw new BusinessException(ErrorCode.IMAGE_NOT_FOUND, "삭제할 이미지를 찾을 수 없습니다."); - } - - log.info("리뷰 이미지 개별 삭제 완료: reviewId={}, imageId={}, 남은 이미지 수={}", - reviewId, imageId, remainingImageCount); - - return ReviewImageDeleteResponse.ofSingle(reviewId, imageId, remainingImageCount); + log.info("Facade: 리뷰 이미지 개별 삭제 요청 위임 - DeleteService로 전달"); + return reviewDeleteService.deleteReviewImage(reviewId, imageId); } /** @@ -828,317 +221,7 @@ public ReviewImageDeleteResponse deleteReviewImage(Long reviewId, Long imageId) */ @Transactional public ReviewImageDeleteResponse deleteAllReviewImages(Long reviewId) { - log.info("리뷰 모든 이미지 삭제 시작: reviewId={}", reviewId); - - // 현재 사용자 정보 가져오기 - User currentUser = getCurrentUserFromSecurity(); - - // 리뷰 조회 및 권한 검증 - Review review = reviewRepository.findById(reviewId) - .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); - - validateUpdatePermission(review, currentUser.getId()); - - // 모든 활성 이미지 조회 - List allImages = reviewImageRepository.findByReviewReviewIdAndDeletedFalse(reviewId); - List allImageIds = allImages.stream() - .map(ReviewImage::getReviewImageId) - .toList(); - - if (allImageIds.isEmpty()) { - log.info("삭제할 이미지가 없습니다: reviewId={}", reviewId); - return ReviewImageDeleteResponse.ofAll(reviewId, List.of()); - } - - List deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, allImageIds); - - log.info("리뷰 모든 이미지 삭제 완료: reviewId={}, 삭제된 이미지 수={}", - reviewId, deletedImageIds.size()); - - return ReviewImageDeleteResponse.ofAll(reviewId, deletedImageIds); - } - - /** - * 리뷰 삭제 권한 검증 - */ - private void validateDeletePermission(Review review, Long userId) { - // 리뷰가 활성 상태인지 확인 - if (!review.isActive()) { - throw new BusinessException(ErrorCode.REVIEW_NOT_FOUND, "이미 삭제된 리뷰입니다."); - } - - // 본인이 작성한 리뷰인지 확인 - if (!review.isOwnedBy(userId)) { - throw new ReviewAccessDeniedException("본인이 작성한 리뷰만 삭제할 수 있습니다."); - } - - log.debug("리뷰 삭제 권한 확인 완료: reviewId={}, userId={}", review.getReviewId(), userId); - } - - // ============= Repository 미사용 메서드들을 활용한 통계/관리 기능들 ============= - - /** - * 사용자별 삭제된 리뷰 목록 조회 - */ - @Transactional(readOnly = true) - public List getUserDeletedReviews(Long userId) { - log.info("사용자 삭제된 리뷰 목록 조회: userId={}", userId); - - List deletedReviews = reviewRepository.findDeletedReviewsByUserId(userId); - - List responses = deletedReviews.stream() - .map(this::createReviewResponseSafely) - .toList(); - - log.info("사용자 삭제된 리뷰 조회 완료: userId={}, 개수={}", userId, responses.size()); - - return responses; - } - - /** - * 특정 기간 내 삭제된 리뷰들 조회 (관리자용) - */ - @Transactional(readOnly = true) - public List getDeletedReviewsBetween(LocalDateTime startDate, LocalDateTime endDate) { - log.info("기간별 삭제된 리뷰 조회: {} ~ {}", startDate, endDate); - - List deletedReviews = reviewRepository.findDeletedReviewsBetween(startDate, endDate); - - List responses = deletedReviews.stream() - .map(this::createReviewResponseSafely) - .toList(); - - log.info("기간별 삭제된 리뷰 조회 완료: 기간={} ~ {}, 개수={}", - startDate, endDate, responses.size()); - - return responses; - } - - /** - * 상품별 리뷰 통계 조회 (활성/삭제/전체 개수) - */ - @Transactional(readOnly = true) - public ReviewStatsResponse getProductReviewStats(Long productId) { - log.info("상품 리뷰 통계 조회: productId={}", productId); - - Long activeCount = reviewRepository.countActiveReviewsByProductId(productId); - Long deletedCount = reviewRepository.countDeletedReviewsByProductId(productId); - Long totalCount = reviewRepository.countAllReviewsByProductId(productId); - Double averageRating = reviewRepository.findAverageRatingByProductId(productId); - - if (averageRating == null) { - averageRating = 0.0; - } - - // 삭제율 계산 - double deletionRate = totalCount > 0 ? (double) deletedCount / totalCount * 100 : 0.0; - - ReviewStatsResponse response = ReviewStatsResponse.builder() - .productId(productId) - .activeReviewCount(activeCount) - .deletedReviewCount(deletedCount) - .totalReviewCount(totalCount) - .averageRating(averageRating) - .deletionRate(deletionRate) - .generatedAt(LocalDateTime.now()) - .build(); - - log.info("상품 리뷰 통계 조회 완료: productId={}, active={}, deleted={}, total={}, avg={}", - productId, activeCount, deletedCount, totalCount, averageRating); - - return response; + log.info("Facade: 리뷰 모든 이미지 삭제 요청 위임 - DeleteService로 전달"); + return reviewDeleteService.deleteAllReviewImages(reviewId); } - - /** - * 사용자별 삭제된 리뷰 개수 조회 - */ - @Transactional(readOnly = true) - public Long getUserDeletedReviewCount(Long userId) { - log.info("사용자 삭제된 리뷰 개수 조회: userId={}", userId); - - Long deletedCount = reviewRepository.countDeletedReviewsByUserId(userId); - - log.info("사용자 삭제된 리뷰 개수 조회 완료: userId={}, 삭제된 개수={}", userId, deletedCount); - - return deletedCount; - } - - /** - * 최근 30일간 삭제된 리뷰 통계 - */ - @Transactional(readOnly = true) - public PeriodReviewStatsResponse getRecentDeletedReviewStats() { - LocalDateTime endDate = LocalDateTime.now(); - LocalDateTime startDate = endDate.minusDays(30); - - return getDeletedReviewStatsBetween(startDate, endDate); - } - - /** - * 특정 기간 삭제된 리뷰 통계 - */ - @Transactional(readOnly = true) - public PeriodReviewStatsResponse getDeletedReviewStatsBetween(LocalDateTime startDate, LocalDateTime endDate) { - log.info("기간별 삭제된 리뷰 통계 조회: {} ~ {}", startDate, endDate); - - List deletedReviews = reviewRepository.findDeletedReviewsBetween(startDate, endDate); - - long totalDeleted = deletedReviews.size(); - long uniqueUsers = deletedReviews.stream() - .mapToLong(review -> review.getUser().getId()) - .distinct() - .count(); - long uniqueProducts = deletedReviews.stream() - .mapToLong(review -> review.getProduct().getProductId()) - .distinct() - .count(); - - double averageRatingOfDeleted = deletedReviews.stream() - .mapToDouble(Review::getRating) - .average() - .orElse(0.0); - - PeriodReviewStatsResponse response = PeriodReviewStatsResponse.builder() - .startDate(startDate) - .endDate(endDate) - .totalDeletedCount(totalDeleted) - .uniqueUserCount(uniqueUsers) - .uniqueProductCount(uniqueProducts) - .averageRatingOfDeleted(averageRatingOfDeleted) - .deletedReviews(deletedReviews.stream() - .map(review -> PeriodReviewStatsResponse.DeletedReviewSummary.builder() - .reviewId(review.getReviewId()) - .userId(review.getUser().getId()) - .productId(review.getProduct().getProductId()) - .rating(review.getRating()) - .title(review.getTitle()) - .deletedAt(review.getUpdatedAt()) - .build()) - .toList()) - .build(); - - log.info("기간별 삭제된 리뷰 통계 조회 완료: 기간={} ~ {}, 총 삭제={}, 사용자={}, 상품={}", - startDate, endDate, totalDeleted, uniqueUsers, uniqueProducts); - - return response; - } - - // ============= 필요한 응답 DTO들 (내부 클래스) ============= - - /** - * 상품별 리뷰 통계 응답 DTO - */ - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class ReviewStatsResponse { - private Long productId; - private Long activeReviewCount; - private Long deletedReviewCount; - private Long totalReviewCount; - private Double averageRating; - private Double deletionRate; - private LocalDateTime generatedAt; - } - - /** - * 기간별 삭제된 리뷰 통계 응답 DTO - */ - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class PeriodReviewStatsResponse { - private LocalDateTime startDate; - private LocalDateTime endDate; - private Long totalDeletedCount; - private Long uniqueUserCount; - private Long uniqueProductCount; - private Double averageRatingOfDeleted; - private List deletedReviews; - - /** - * 삭제된 리뷰 요약 정보 - */ - @Getter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class DeletedReviewSummary { - private Long reviewId; - private Long userId; - private Long productId; - private Integer rating; - private String title; - private LocalDateTime deletedAt; - } - } - - /** - * 리뷰 작성 포인트 적립 - * @return 적립된 포인트 수 (실패시 0 반환) - */ - private int awardPointsForReview(User user, Long reviewId) { - try { - if (user == null) { - log.error("User가 null입니다 - reviewId: {}", reviewId); - return 0; - } - - if (reviewId == null) { - log.error("reviewId가 null입니다 - userId: {}", user.getId()); - return 0; - } - - // 리뷰 작성 시 적립할 포인트 (설정값) - final int REVIEW_POINTS = 100; - - // 포인트 적립 실행 - pointService.earnPoints( - user, - REVIEW_POINTS, - "리뷰 작성 포인트 적립", - null // 주문 ID는 없음 - ); - - log.info("리뷰 작성 포인트 적립 완료: userId={}, reviewId={}, points={}", - user.getId(), reviewId, REVIEW_POINTS); - - return REVIEW_POINTS; - - } catch (Exception e) { - // 포인트 적립 실패가 리뷰 작성 프로세스에 영향을 주지 않도록 예외 처리 - log.error("리뷰 작성 포인트 적립 중 오류 발생 - userId: {}, reviewId: {}, error: {}", - user != null ? user.getId() : "null", reviewId, e.getMessage(), e); - return 0; // 실패시 0 반환 - } - } - - - /** - * 리뷰 작성 후 뱃지 자동 수여 체크 - */ - private void checkAndAwardBadgesAfterReview(Long userId) { - try { - // 1. 리뷰 작성 점수 부여 - userLevelService.recordActivity( - userId, - ActivityType.REVIEW_CREATION, - "리뷰 작성", - null, - "REVIEW" - ); - - // 2. 사용자의 총 리뷰 수 조회 - Long totalReviews = reviewRepository.countByUserId(userId); - - // 3. 뱃지 자동 수여 체크 (뱃지 획득 시 보너스 점수도 자동 부여됨) - badgeService.checkAndAwardReviewBadges(userId, totalReviews); - } catch (Exception e) { - // 뱃지 수여 실패가 리뷰 프로세스에 영향을 주지 않도록 예외 처리 - log.error("뱃지 자동 수여 중 오류 발생 - userId: {}, error: {}", userId, e.getMessage()); - } - } -} - +} \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/application/service/ReviewUpdateService.java b/src/main/java/com/cMall/feedShop/review/application/service/ReviewUpdateService.java new file mode 100644 index 000000000..2468ed799 --- /dev/null +++ b/src/main/java/com/cMall/feedShop/review/application/service/ReviewUpdateService.java @@ -0,0 +1,366 @@ +package com.cMall.feedShop.review.application.service; + +import com.cMall.feedShop.common.dto.UploadResult; +import com.cMall.feedShop.common.exception.BusinessException; +import com.cMall.feedShop.common.exception.ErrorCode; +import com.cMall.feedShop.common.storage.StorageService; +import com.cMall.feedShop.common.storage.UploadDirectory; +import com.cMall.feedShop.review.application.dto.request.ReviewUpdateRequest; +import com.cMall.feedShop.review.application.dto.response.ReviewUpdateResponse; +import com.cMall.feedShop.review.domain.Review; +import com.cMall.feedShop.review.domain.ReviewImage; +import com.cMall.feedShop.review.domain.exception.ReviewAccessDeniedException; +import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; +import com.cMall.feedShop.review.domain.repository.ReviewImageRepository; +import com.cMall.feedShop.review.domain.repository.ReviewRepository; +import com.cMall.feedShop.user.domain.model.User; +import com.cMall.feedShop.user.domain.repository.UserRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +@Transactional(readOnly = true) +public class ReviewUpdateService { + + private final ReviewRepository reviewRepository; + private final UserRepository userRepository; + private final ReviewImageService reviewImageService; + private final ReviewImageRepository reviewImageRepository; + + // 선택적 의존성 주입으로 변경 (GCP만) + @Autowired(required = false) + private StorageService gcpStorageService; + + // 수동 생성자 (필수 의존성만) + public ReviewUpdateService( + ReviewRepository reviewRepository, + UserRepository userRepository, + ReviewImageService reviewImageService, + ReviewImageRepository reviewImageRepository) { + + this.reviewRepository = reviewRepository; + this.userRepository = userRepository; + this.reviewImageService = reviewImageService; + this.reviewImageRepository = reviewImageRepository; + } + + /** + * 리뷰 수정 (이미지 포함) - DTO 불변성 적용 + * + * @param reviewId 수정할 리뷰 ID + * @param request 불변 리뷰 수정 요청 DTO + * @param newImages 새로 추가할 이미지들 (별도 파라미터) + * @return 수정 결과 응답 + */ + @Transactional + public ReviewUpdateResponse updateReview(Long reviewId, ReviewUpdateRequest request, + List newImages) { + + log.info("리뷰 수정 시작: reviewId={}", reviewId); + + // 1. 현재 로그인한 사용자 정보 가져오기 + User currentUser = getCurrentUserFromSecurity(); + + // 2. 수정할 리뷰 조회 + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); + + // 3. 수정 권한 확인 + validateUpdatePermission(review, currentUser.getId()); + + // 4. ✅ DTO에서 직접 값 추출하여 리뷰 기본 정보 수정 + review.updateReviewInfo( + request.getTitle(), + request.getRating(), + request.getContent(), + request.getSizeFit(), + request.getCushion(), + request.getStability() + ); + + // 5. 이미지 수정 처리 + List newImageUrls = new ArrayList<>(); + List deletedImageIds = new ArrayList<>(); + + try { + // ✅ DTO에서 삭제할 이미지 ID 목록 추출 + if (request.getDeleteImageIds() != null && !request.getDeleteImageIds().isEmpty()) { + deletedImageIds = reviewImageService.deleteSelectedImages(reviewId, request.getDeleteImageIds()); + log.info("이미지 삭제 완료: reviewId={}, 삭제된 개수={}", reviewId, deletedImageIds.size()); + } + + // 새 이미지 추가 처리 (별도 파라미터) + if (newImages != null && !newImages.isEmpty()) { + newImageUrls = addNewImages(review, newImages); + log.info("새 이미지 추가 완료: reviewId={}, 추가된 개수={}", reviewId, newImageUrls.size()); + } + + } catch (Exception e) { + log.error("이미지 처리 중 오류 발생: reviewId={}, error={}", reviewId, e.getMessage(), e); + // 이미지 처리 실패 시에도 리뷰 텍스트 수정은 유지하고 경고만 로그 + log.warn("이미지 처리는 실패했지만 리뷰 내용 수정은 완료되었습니다."); + } + + // 6. 리뷰 저장 + Review updatedReview = reviewRepository.save(review); + + // 7. 최종 이미지 개수 확인 + int totalImageCount = reviewImageService.getActiveImageCount(reviewId); + + log.info("리뷰 수정 완료: reviewId={}, 총 이미지 수={}", reviewId, totalImageCount); + // GitHub CI 빌드 오류 해결을 위한 동기화 + + return ReviewUpdateResponse.of( + updatedReview.getReviewId(), + newImageUrls, + deletedImageIds, + totalImageCount + ); + } + + /** + * 리뷰 수정 (간단 버전 - 이미지 없이) + */ + @Transactional + public void updateReviewSimple(Long reviewId, ReviewUpdateRequest request) { + updateReview(reviewId, request, null); + } + + /** + * 리뷰 제목만 수정 + */ + @Transactional + public void updateReviewTitle(Long reviewId, String newTitle) { + User currentUser = getCurrentUserFromSecurity(); + + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("리뷰를 찾을 수 없습니다.")); + + validateUpdatePermission(review, currentUser.getId()); + + review.updateTitle(newTitle); + reviewRepository.save(review); + + log.info("리뷰 제목 수정 완료: reviewId={}, newTitle={}", reviewId, newTitle); + } + + /** + * 리뷰 평점만 수정 + */ + @Transactional + public void updateReviewRating(Long reviewId, Integer newRating) { + User currentUser = getCurrentUserFromSecurity(); + + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("리뷰를 찾을 수 없습니다.")); + + validateUpdatePermission(review, currentUser.getId()); + + review.updateRating(newRating); + reviewRepository.save(review); + + log.info("리뷰 평점 수정 완료: reviewId={}, newRating={}", reviewId, newRating); + } + + /** + * 리뷰 내용만 수정 + */ + @Transactional + public void updateReviewContent(Long reviewId, String newContent) { + User currentUser = getCurrentUserFromSecurity(); + + Review review = reviewRepository.findById(reviewId) + .orElseThrow(() -> new ReviewNotFoundException("리뷰를 찾을 수 없습니다.")); + + validateUpdatePermission(review, currentUser.getId()); + + review.updateContent(newContent); + reviewRepository.save(review); + + log.info("리뷰 내용 수정 완료: reviewId={}", reviewId); + } + + /** + * 현재 로그인한 사용자 정보 가져오기 + */ + private User getCurrentUserFromSecurity() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || !authentication.isAuthenticated()) { + throw new BusinessException(ErrorCode.UNAUTHORIZED, "로그인이 필요합니다."); + } + + String userEmail = getUserEmailFromAuthentication(authentication); + return findUserByEmail(userEmail); + } + + /** + * Authentication에서 사용자 이메일 추출 + */ + private String getUserEmailFromAuthentication(Authentication authentication) { + Object principal = authentication.getPrincipal(); + + if (principal instanceof User) { + return ((User) principal).getEmail(); + } else if (principal instanceof UserDetails) { + return ((UserDetails) principal).getUsername(); + } else { + return authentication.getName(); + } + } + + /** + * 이메일로 사용자 조회 + */ + private User findUserByEmail(String email) { + return userRepository.findByEmail(email) + .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND, "사용자를 찾을 수 없습니다: " + email)); + } + + /** + * 리뷰 수정 권한 검증 + */ + private void validateUpdatePermission(Review review, Long userId) { + // 리뷰가 활성 상태인지 확인 + if (!review.isActive()) { + throw new BusinessException(ErrorCode.REVIEW_NOT_FOUND, "삭제되었거나 숨김 처리된 리뷰는 수정할 수 없습니다."); + } + // 본인이 작성한 리뷰인지 확인 + if (!review.isOwnedBy(userId)) { + throw new ReviewAccessDeniedException("본인이 작성한 리뷰만 수정할 수 있습니다."); + } + + log.debug("리뷰 수정 권한 확인 완료: reviewId={}, userId={}", review.getReviewId(), userId); + } + + /** + * 새 이미지들 추가 처리 + */ + private List addNewImages(Review review, List newImages) { + List newImageUrls = new ArrayList<>(); + + if (newImages == null || newImages.isEmpty()) { + return newImageUrls; + } + + try { + // GCP Storage 사용 + if (gcpStorageService != null) { + log.info("GCP Storage로 새 이미지 업로드 시작: reviewId={}, 이미지 수={}", + review.getReviewId(), newImages.size()); + + List uploadResults = + gcpStorageService.uploadFilesWithDetails(newImages, UploadDirectory.REVIEWS); + + if (!uploadResults.isEmpty()) { + // UploadResult를 ReviewImage로 저장 + saveReviewImagesFromUploadResults(review, uploadResults); + + // URL 추출 + newImageUrls = uploadResults.stream() + .map(UploadResult::getFilePath) + .collect(Collectors.toList()); + } + } else { + // GCP Storage가 없을 때 기존 로컬 방식 사용 + log.info("로컬 이미지 처리 시작: reviewId={}, 이미지 수={}", + review.getReviewId(), newImages.size()); + + List savedImages = reviewImageService.saveReviewImages(review, newImages); + + // 로컬 이미지 URL 생성 (기본 URL + 파일 경로) + newImageUrls = savedImages.stream() + .map(image -> "/uploads/images/reviews/" + image.getFilePath()) + .collect(Collectors.toList()); + + log.info("로컬 이미지 업로드 완료: reviewId={}, 저장된 이미지 수={}", + review.getReviewId(), savedImages.size()); + } + + } catch (Exception e) { + log.error("새 이미지 추가 실패: reviewId={}", review.getReviewId(), e); + throw new BusinessException(ErrorCode.FILE_UPLOAD_ERROR, "이미지 업로드에 실패했습니다: " + e.getMessage()); + } + + return newImageUrls; + } + + /** + * 업로드 결과를 기존 ReviewImage 엔티티로 저장 + */ + private void saveReviewImagesFromUploadResults(Review review, List uploadResults) { + log.info("업로드 결과를 ReviewImage 엔티티로 저장 시작: reviewId={}, resultCount={}", + review.getReviewId(), uploadResults.size()); + + try { + for (int i = 0; i < uploadResults.size(); i++) { + UploadResult result = uploadResults.get(i); + + ReviewImage reviewImage = ReviewImage.builder() + .review(review) + .originalFilename(result.getOriginalFilename()) + .storedFilename(result.getStoredFilename()) + .filePath(result.getFilePath()) + .fileSize(result.getFileSize()) + .contentType(result.getContentType()) + .imageOrder(i) + .build(); + + ReviewImage savedImage = reviewImageRepository.save(reviewImage); + + log.debug("ReviewImage 저장 완료: id={}, url={}, imageOrder={}", + savedImage.getReviewImageId(), result.getFilePath(), i); + } + + log.info("업로드 결과 저장 완료: reviewId={}, 저장된 이미지 수={}", + review.getReviewId(), uploadResults.size()); + + } catch (Exception e) { + log.error("업로드 결과 저장 실패: reviewId={}", review.getReviewId(), e); + + // 이미 업로드된 GCP Storage 파일들 삭제 (롤백) + List imageUrls = uploadResults.stream() + .map(UploadResult::getFilePath) + .collect(Collectors.toList()); + rollbackUploadedImages(imageUrls); + + throw new RuntimeException("리뷰 이미지 저장에 실패했습니다", e); + } + } + + /** + * 업로드된 이미지들을 GCP Storage에서 삭제 (롤백용) + */ + private void rollbackUploadedImages(List imageUrls) { + log.warn("이미지 저장 실패로 인한 GCP Storage 파일 삭제 시작: {} 개의 파일", imageUrls.size()); + + for (String imageUrl : imageUrls) { + try { + // GCP Storage만 사용 + if (gcpStorageService != null) { + boolean deleted = gcpStorageService.deleteFile(imageUrl); + if (deleted) { + log.info("롤백: GCP Storage 파일 삭제 성공: {}", imageUrl); + } else { + log.warn("롤백: GCP Storage 파일 삭제 실패: {}", imageUrl); + } + } else { + log.warn("롤백: GCP Storage 서비스가 없습니다: {}", imageUrl); + } + } catch (Exception e) { + log.error("롤백: 파일 삭제 중 오류: {}", imageUrl, e); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/cMall/feedShop/review/presentation/ReviewAdminController.java b/src/main/java/com/cMall/feedShop/review/presentation/ReviewAdminController.java index f329da67f..5f1bc4f82 100644 --- a/src/main/java/com/cMall/feedShop/review/presentation/ReviewAdminController.java +++ b/src/main/java/com/cMall/feedShop/review/presentation/ReviewAdminController.java @@ -4,8 +4,12 @@ import com.cMall.feedShop.common.dto.ApiResponse; import com.cMall.feedShop.review.application.dto.response.ReviewResponse; import com.cMall.feedShop.review.application.service.ReviewService; +import com.cMall.feedShop.review.application.service.ReviewReadService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -49,14 +53,35 @@ public class ReviewAdminController { @GetMapping("/stats/product/{productId}") @AdminOrSeller @ApiResponseFormat(message = "상품 리뷰 통계를 조회했습니다.") - @Operation(summary = "상품별 리뷰 통계 조회", - description = "특정 상품의 활성/삭제/전체 리뷰 개수와 평균 평점, 삭제율을 조회합니다.") - public ApiResponse getProductReviewStats( - @PathVariable @Parameter(description = "상품 ID") Long productId) { + @Operation( + summary = "상품별 리뷰 통계 조회", + description = "특정 상품의 리뷰 상태별(활성/삭제/전체) 개수, 평균 평점, 삭제율 등을 조회합니다. 판매자는 자신의 상품만 조회 가능합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "상품 리뷰 통계 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewReadService.ReviewStatsResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 또는 판매자 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "해당 상품을 찾을 수 없음" + ) + }) + public ApiResponse getProductReviewStats( + @Parameter(description = "상품 ID", required = true, example = "1") @PathVariable Long productId) { log.info("상품 리뷰 통계 조회 API 호출: productId={}", productId); - ReviewService.ReviewStatsResponse stats = reviewService.getProductReviewStats(productId); + ReviewReadService.ReviewStatsResponse stats = reviewService.getProductReviewStats(productId); log.info("상품 리뷰 통계 조회 완료: productId={}, active={}, deleted={}, total={}", productId, stats.getActiveReviewCount(), stats.getDeletedReviewCount(), stats.getTotalReviewCount()); @@ -67,12 +92,33 @@ public ApiResponse getProductReviewStats( @GetMapping("/stats/period") @AdminOnly @ApiResponseFormat(message = "기간별 삭제된 리뷰 통계를 조회했습니다.") - @Operation(summary = "기간별 삭제된 리뷰 통계", - description = "지정된 기간 내에 삭제된 리뷰들의 통계를 조회합니다.") - public ApiResponse getDeletedReviewStatsByPeriod( - @RequestParam @Parameter(description = "시작 날짜 (yyyy-MM-dd'T'HH:mm:ss)") + @Operation( + summary = "기간별 삭제된 리뷰 통계", + description = "지정된 기간 내에 삭제된 리뷰들의 통계(총 개수, 고유 사용자 수, 고유 상품 수)를 조회합니다. 관리자만 사용 가능합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "기간별 삭제 리뷰 통계 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewReadService.PeriodReviewStatsResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (날짜 형식 오류, 시작날짜 > 종료날짜)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ) + }) + public ApiResponse getDeletedReviewStatsByPeriod( + @Parameter(description = "시작 날짜 (ISO 8601 형식)", required = true, example = "2025-08-01T00:00:00") @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate, - @RequestParam @Parameter(description = "종료 날짜 (yyyy-MM-dd'T'HH:mm:ss)") + @Parameter(description = "종료 날짜 (ISO 8601 형식)", required = true, example = "2025-08-31T23:59:59") @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate) { log.info("기간별 삭제된 리뷰 통계 조회 API 호출: {} ~ {}", startDate, endDate); @@ -82,7 +128,7 @@ public ApiResponse getDeletedReviewStat throw new IllegalArgumentException("시작 날짜는 종료 날짜보다 이전이어야 합니다."); } - ReviewService.PeriodReviewStatsResponse stats = reviewService.getDeletedReviewStatsBetween(startDate, endDate); + ReviewReadService.PeriodReviewStatsResponse stats = reviewService.getDeletedReviewStatsBetween(startDate, endDate); log.info("기간별 삭제된 리뷰 통계 조회 완료: 기간={} ~ {}, 총 삭제={}, 사용자={}, 상품={}", startDate, endDate, stats.getTotalDeletedCount(), stats.getUniqueUserCount(), stats.getUniqueProductCount()); @@ -93,13 +139,30 @@ public ApiResponse getDeletedReviewStat @GetMapping("/stats/recent") @AdminOnly @ApiResponseFormat(message = "최근 30일간 삭제된 리뷰 통계를 조회했습니다.") - @Operation(summary = "최근 30일간 삭제된 리뷰 통계", - description = "최근 30일간 삭제된 리뷰들의 통계를 조회합니다.") - public ApiResponse getRecentDeletedReviewStats() { + @Operation( + summary = "최근 30일간 삭제된 리뷰 통계", + description = "오늘을 기준으로 최근 30일간 삭제된 리뷰들의 통계를 조회합니다. 빠른 대시보드 조회를 위한 API입니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "최근 30일간 삭제 리뷰 통계 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewReadService.PeriodReviewStatsResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ) + }) + public ApiResponse getRecentDeletedReviewStats() { log.info("최근 30일간 삭제된 리뷰 통계 조회 API 호출"); - ReviewService.PeriodReviewStatsResponse stats = reviewService.getRecentDeletedReviewStats(); + ReviewReadService.PeriodReviewStatsResponse stats = reviewService.getRecentDeletedReviewStats(); log.info("최근 30일간 삭제된 리뷰 통계 조회 완료: 총 삭제={}, 사용자={}, 상품={}", stats.getTotalDeletedCount(), stats.getUniqueUserCount(), stats.getUniqueProductCount()); @@ -112,10 +175,31 @@ public ApiResponse getRecentDeletedRevi @GetMapping("/deleted/user/{userId}") @AdminOnly @ApiResponseFormat(message = "사용자의 삭제된 리뷰 목록을 조회했습니다.") - @Operation(summary = "사용자별 삭제된 리뷰 목록 조회", - description = "특정 사용자가 삭제한 리뷰들을 조회합니다.") + @Operation( + summary = "사용자별 삭제된 리뷰 목록 조회", + description = "특정 사용자가 삭제한 모든 리뷰들을 조회합니다. 사용자 행동 분석 및 문제 해결을 위해 사용합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "사용자 삭제 리뷰 목록 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "해당 사용자를 찾을 수 없음" + ) + }) public ApiResponse> getUserDeletedReviews( - @PathVariable @Parameter(description = "사용자 ID") Long userId) { + @Parameter(description = "사용자 ID", required = true, example = "123") @PathVariable Long userId) { log.info("사용자별 삭제된 리뷰 조회 API 호출: userId={}", userId); @@ -129,12 +213,33 @@ public ApiResponse> getUserDeletedReviews( @GetMapping("/deleted/period") @AdminOnly @ApiResponseFormat(message = "기간별 삭제된 리뷰 목록을 조회했습니다.") - @Operation(summary = "기간별 삭제된 리뷰 목록 조회", - description = "지정된 기간 내에 삭제된 모든 리뷰들을 조회합니다.") + @Operation( + summary = "기간별 삭제된 리뷰 목록 조회", + description = "지정된 기간 내에 삭제된 모든 리뷰들을 상세 정보와 함께 조회합니다. 대량 데이터 조회 시 주의가 필요합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "기간별 삭제 리뷰 목록 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (날짜 형식 오류, 시작날짜 > 종료날짜)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ) + }) public ApiResponse> getDeletedReviewsByPeriod( - @RequestParam @Parameter(description = "시작 날짜 (yyyy-MM-dd'T'HH:mm:ss)") + @Parameter(description = "시작 날짜 (ISO 8601 형식)", required = true, example = "2025-08-01T00:00:00") @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate, - @RequestParam @Parameter(description = "종료 날짜 (yyyy-MM-dd'T'HH:mm:ss)") + @Parameter(description = "종료 날짜 (ISO 8601 형식)", required = true, example = "2025-08-31T23:59:59") @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate) { log.info("기간별 삭제된 리뷰 목록 조회 API 호출: {} ~ {}", startDate, endDate); @@ -155,10 +260,31 @@ public ApiResponse> getDeletedReviewsByPeriod( @GetMapping("/deleted/count/user/{userId}") @AdminOnly @ApiResponseFormat(message = "사용자의 삭제된 리뷰 개수를 조회했습니다.") - @Operation(summary = "사용자별 삭제된 리뷰 개수 조회", - description = "특정 사용자가 삭제한 리뷰 개수를 조회합니다.") + @Operation( + summary = "사용자별 삭제된 리뷰 개수 조회", + description = "특정 사용자가 삭제한 리뷰의 총 개수를 빠르게 조회합니다. 사용자 행동 모니터링에 사용합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "사용자 삭제 리뷰 개수 조회 성공", + content = @Content(schema = @Schema(implementation = UserDeletedReviewCountResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "해당 사용자를 찾을 수 없음" + ) + }) public ApiResponse getUserDeletedReviewCount( - @PathVariable @Parameter(description = "사용자 ID") Long userId) { + @Parameter(description = "사용자 ID", required = true, example = "123") @PathVariable Long userId) { log.info("사용자별 삭제된 리뷰 개수 조회 API 호출: userId={}", userId); diff --git a/src/main/java/com/cMall/feedShop/review/presentation/ReviewController.java b/src/main/java/com/cMall/feedShop/review/presentation/ReviewController.java index a06679eb7..ce3f5a556 100644 --- a/src/main/java/com/cMall/feedShop/review/presentation/ReviewController.java +++ b/src/main/java/com/cMall/feedShop/review/presentation/ReviewController.java @@ -9,7 +9,8 @@ import com.cMall.feedShop.review.application.service.ReviewService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; - +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -35,53 +36,91 @@ public class ReviewController { @GetMapping("/products/{productId}") @ApiResponseFormat(message = "상품 리뷰 목록을 성공적으로 조회했습니다.") - @Operation(summary = "상품별 리뷰 목록 조회", description = "특정 상품의 리뷰 목록을 조회합니다. 로그인이 필요하지 않습니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "상품 리뷰 목록을 성공적으로 조회했습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "해당 상품을 찾을 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "잘못된 요청 파라미터입니다.") + @Operation( + summary = "상품별 리뷰 목록 조회", + description = "특정 상품의 리뷰 목록을 페이지네이션으로 조회합니다. 로그인이 필요하지 않습니다. 최신순/인기순 정렬을 지원합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "상품 리뷰 목록 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewListResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 파라미터 (페이지 번호, 크기, 정렬 방식 오류)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "해당 상품을 찾을 수 없음" + ) }) public com.cMall.feedShop.common.dto.ApiResponse getProductReviews( - @Parameter(description = "상품 ID") @PathVariable Long productId, - @Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") int page, - @Parameter(description = "페이지 크기 (1-100)") @RequestParam(defaultValue = "20") int size, - @Parameter(description = "정렬 방식 (latest: 최신순, points: 인기순)") @RequestParam(defaultValue = "latest") String sort) { + @Parameter(description = "상품 ID", required = true, example = "1") @PathVariable Long productId, + @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0") int page, + @Parameter(description = "페이지 크기 (1-100)", example = "20") @RequestParam(defaultValue = "20") int size, + @Parameter(description = "정렬 방식 (latest: 최신순, points: 인기순)", example = "latest") @RequestParam(defaultValue = "latest") String sort) { ReviewListResponse response = reviewService.getProductReviews(productId, page, size, sort); return com.cMall.feedShop.common.dto.ApiResponse.success(response); } @GetMapping("/products/{productId}/filter") @ApiResponseFormat(message = "필터링된 상품 리뷰 목록을 성공적으로 조회했습니다.") - @Operation(summary = "상품별 리뷰 목록 필터링 조회", - description = "특정 상품의 리뷰를 평점, 착용감, 쿠션감, 안정성으로 필터링하여 조회합니다. 로그인이 필요하지 않습니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "필터링된 상품 리뷰 목록을 성공적으로 조회했습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "해당 상품을 찾을 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "잘못된 요청 파라미터입니다.") + @Operation( + summary = "상품별 리뷰 목록 필터링 조회", + description = "특정 상품의 리뷰를 평점, 착용감, 쿠션감, 안정성으로 필터링하여 조회합니다. 모든 필터는 선택사항이며 여러 조건을 동시에 적용할 수 있습니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "필터링된 리뷰 목록 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewListResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 파라미터 (필터 값, 페이지 설정 오류)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "해당 상품을 찾을 수 없음" + ) }) public com.cMall.feedShop.common.dto.ApiResponse getProductReviewsWithFilters( - @Parameter(description = "상품 ID") @PathVariable Long productId, - @Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") int page, - @Parameter(description = "페이지 크기 (1-100)") @RequestParam(defaultValue = "20") int size, - @Parameter(description = "정렬 방식 (latest: 최신순, points: 인기순)") @RequestParam(defaultValue = "latest") String sort, - @Parameter(description = "평점 필터 (1-5)") @RequestParam(required = false) Integer rating, - @Parameter(description = "착용감 필터 (VERY_SMALL, SMALL, NORMAL, BIG, VERY_BIG)") @RequestParam(required = false) String sizeFit, - @Parameter(description = "쿠션감 필터 (VERY_SOFT, SOFT, MEDIUM, FIRM, VERY_FIRM)") @RequestParam(required = false) String cushion, - @Parameter(description = "안정성 필터 (VERY_UNSTABLE, UNSTABLE, NORMAL, STABLE, VERY_STABLE)") @RequestParam(required = false) String stability) { + @Parameter(description = "상품 ID", required = true, example = "1") @PathVariable Long productId, + @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0") int page, + @Parameter(description = "페이지 크기 (1-100)", example = "20") @RequestParam(defaultValue = "20") int size, + @Parameter(description = "정렬 방식 (latest: 최신순, points: 인기순)", example = "latest") @RequestParam(defaultValue = "latest") String sort, + @Parameter(description = "평점 필터 (1-5점)", example = "5") @RequestParam(required = false) Integer rating, + @Parameter(description = "착용감 필터 (1: 작음, 2: 적당, 3: 큼)", example = "2") @RequestParam(required = false) String sizeFit, + @Parameter(description = "쿠션감 필터 (1: 딱딱, 2: 보통, 3: 부드러움)", example = "2") @RequestParam(required = false) String cushion, + @Parameter(description = "안정성 필터 (1: 불안정, 2: 보통, 3: 안정적)", example = "3") @RequestParam(required = false) String stability) { ReviewListResponse response = reviewService.getProductReviewsWithFilters(productId, page, size, sort, rating, sizeFit, cushion, stability); return com.cMall.feedShop.common.dto.ApiResponse.success(response); } @GetMapping("/{reviewId}") @ApiResponseFormat(message = "리뷰 상세 정보를 성공적으로 조회했습니다.") - @Operation(summary = "리뷰 상세 조회", description = "특정 리뷰의 상세 정보를 조회합니다. 로그인이 필요하지 않습니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "리뷰 상세 정보를 성공적으로 조회했습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "해당 리뷰를 찾을 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "삭제되었거나 숨김 처리된 리뷰입니다.") + @Operation( + summary = "리뷰 상세 조회", + description = "특정 리뷰의 상세 정보(내용, 평점, 이미지, 3요소 평가 등)를 조회합니다. 로그인이 필요하지 않습니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 상세 정보 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "삭제되었거나 비공개 처리된 리뷰" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "해당 리뷰를 찾을 수 없음" + ) }) public com.cMall.feedShop.common.dto.ApiResponse getReview( - @Parameter(description = "리뷰 ID") @PathVariable Long reviewId) { + @Parameter(description = "리뷰 ID", required = true, example = "123") @PathVariable Long reviewId) { ReviewResponse response = reviewService.getReview(reviewId); return com.cMall.feedShop.common.dto.ApiResponse.success(response); @@ -89,26 +128,56 @@ public com.cMall.feedShop.common.dto.ApiResponse getReview( @GetMapping("/products/{productId}/statistics") @ApiResponseFormat(message = "상품 3요소 평가 통계를 성공적으로 조회했습니다.") - @Operation(summary = "상품별 3요소 평가 통계 조회", - description = "특정 상품의 Cushion, SizeFit, Stability 평가 통계를 조회합니다. 로그인이 필요하지 않습니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "상품 3요소 평가 통계를 성공적으로 조회했습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "해당 상품을 찾을 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "잘못된 상품 ID입니다.") + @Operation( + summary = "상품별 3요소 평가 통계 조회", + description = "특정 상품에 대한 모든 리뷰의 쿠션감(Cushion), 착용감(SizeFit), 안정성(Stability) 평가 통계를 조회합니다. 각 요소별 평균값과 분포를 제공합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "3요소 평가 통계 조회 성공", + content = @Content(schema = @Schema(implementation = Review3ElementStatisticsResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 상품 ID (음수 값 등)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "해당 상품을 찾을 수 없음" + ) }) public com.cMall.feedShop.common.dto.ApiResponse getProductStatistics( - @Parameter(description = "상품 ID") @PathVariable Long productId) { + @Parameter(description = "상품 ID", required = true, example = "1") @PathVariable Long productId) { Review3ElementStatisticsResponse response = statisticsService.getProductStatistics(productId); return com.cMall.feedShop.common.dto.ApiResponse.success(response); } @GetMapping("/images/{year}/{month}/{day}/{filename:.+}") - @Operation(summary = "리뷰 이미지 서빙", description = "리뷰 이미지 파일을 서빙합니다.") + @Operation( + summary = "리뷰 이미지 서빙", + description = "업로드된 리뷰 이미지 파일을 서빙합니다. 이미지는 연/월/일 구조로 저장되며, CORS 헤더가 설정되어 다른 도메인에서도 접근 가능합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "이미지 서빙 성공", + content = @Content(schema = @Schema(type = "string", format = "binary")) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 URL 형식" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "이미지 파일을 찾을 수 없음" + ) + }) public ResponseEntity serveReviewImage( - @PathVariable String year, - @PathVariable String month, - @PathVariable String day, - @PathVariable String filename) { + @Parameter(description = "연도 (4자리)", required = true, example = "2025") @PathVariable String year, + @Parameter(description = "월 (2자리)", required = true, example = "08") @PathVariable String month, + @Parameter(description = "일 (2자리)", required = true, example = "14") @PathVariable String day, + @Parameter(description = "이미지 파일명 (확장자 포함)", required = true, example = "abc123.jpg") @PathVariable String filename) { try { Path filePath = Paths.get("uploads/reviews") .resolve(year) diff --git a/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportAdminController.java b/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportAdminController.java index 142bcc8e0..b187131a7 100644 --- a/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportAdminController.java +++ b/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportAdminController.java @@ -7,6 +7,8 @@ import com.cMall.feedShop.review.application.service.ReviewReportService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -19,8 +21,8 @@ @RestController @RequestMapping("/api/admin/reviews") @RequiredArgsConstructor -@Tag(name = "리뷰 신고 관리 API", description = "관리자용 리뷰 신고 관리 API") -@SecurityRequirement(name = "bearerAuth") +@Tag(name = "리뷰 신고 관리 API", description = "관리자용 리뷰 신고 관리 API (관리자 권한 필요)") +@SecurityRequirement(name = "jwtAuth") @PreAuthorize("hasRole('ADMIN')") public class ReviewReportAdminController { @@ -28,14 +30,28 @@ public class ReviewReportAdminController { @GetMapping("/reports") @ApiResponseFormat(message = "신고된 리뷰 목록을 성공적으로 조회했습니다.") - @Operation(summary = "신고된 리뷰 목록 조회", description = "관리자가 신고된 리뷰 목록을 조회합니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "신고된 리뷰 목록을 성공적으로 조회했습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "관리자 권한이 필요합니다.") + @Operation( + summary = "신고된 리뷰 목록 조회", + description = "관리자가 신고된 리뷰 목록을 페이지네이션으로 조회합니다. 신고 내용, 신고자 정보, 리뷰 상태 등을 포함합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "신고된 리뷰 목록 조회 성공", + content = @Content(schema = @Schema(implementation = PaginatedResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ) }) public ApiResponse> getReportedReviews( - @Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") int page, - @Parameter(description = "페이지 크기") @RequestParam(defaultValue = "20") int size) { + @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0") int page, + @Parameter(description = "페이지 크기 (1-100)", example = "20") @RequestParam(defaultValue = "20") int size) { PaginatedResponse response = reviewReportService.getReportedReviews(page, size); return ApiResponse.success(response); @@ -43,15 +59,31 @@ public ApiResponse> getReportedReviews @PostMapping("/{reviewId}/hide") @ApiResponseFormat(message = "리뷰가 성공적으로 숨김 처리되었습니다.") - @Operation(summary = "리뷰 숨김 처리", description = "관리자가 신고된 리뷰를 숨김 처리합니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "리뷰가 성공적으로 숨김 처리되었습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "숨김 처리할 리뷰를 찾을 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "관리자 권한이 필요합니다.") + @Operation( + summary = "리뷰 숨김 처리", + description = "관리자가 신고된 리뷰를 숨김 처리하여 일반 사용자에게 보이지 않도록 합니다. 비공개 처리된 리뷰는 리뷰 목록에서 제외됩니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 숨김 처리 성공" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "숨김 처리할 리뷰를 찾을 수 없음" + ) }) public ApiResponse hideReview( - @Parameter(description = "리뷰 ID") @PathVariable Long reviewId, - Authentication authentication) { + @Parameter(description = "숨김 처리할 리뷰 ID", required = true, example = "123") @PathVariable Long reviewId, + @Parameter(hidden = true) Authentication authentication) { String adminLoginId = getUserLoginIdFromAuthentication(authentication); @@ -61,15 +93,31 @@ public ApiResponse hideReview( @PostMapping("/{reviewId}/show") @ApiResponseFormat(message = "리뷰 숨김이 성공적으로 해제되었습니다.") - @Operation(summary = "리뷰 숨김 해제", description = "관리자가 숨김 처리된 리뷰를 다시 노출시킵니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "리뷰 숨김이 성공적으로 해제되었습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "숨김 해제할 리뷰를 찾을 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "403", description = "관리자 권한이 필요합니다.") + @Operation( + summary = "리뷰 숨김 해제", + description = "관리자가 숨김 처리된 리뷰를 다시 공개 상태로 전환하여 일반 사용자에게 보이도록 합니다. 오인으로 신고되었거나 비공개 처리가 필요 없는 경우 사용합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 숨김 해제 성공" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "관리자 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "숨김 해제할 리뷰를 찾을 수 없음" + ) }) public ApiResponse showReview( - @Parameter(description = "리뷰 ID") @PathVariable Long reviewId, - Authentication authentication) { + @Parameter(description = "숨김 해제할 리뷰 ID", required = true, example = "123") @PathVariable Long reviewId, + @Parameter(hidden = true) Authentication authentication) { String adminLoginId = getUserLoginIdFromAuthentication(authentication); diff --git a/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportController.java b/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportController.java index 6ac7e4aff..287708d28 100644 --- a/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportController.java +++ b/src/main/java/com/cMall/feedShop/review/presentation/ReviewReportController.java @@ -7,7 +7,10 @@ import com.cMall.feedShop.review.application.service.ReviewReportService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -20,25 +23,45 @@ @RequestMapping("/api/user/reviews") @RequiredArgsConstructor @Slf4j -@Tag(name = "리뷰 신고 API", description = "리뷰 신고 관련 API") +@Tag(name = "리뷰 신고 API", description = "사용자용 리뷰 신고 API (로그인 필요)") +@SecurityRequirement(name = "jwtAuth") public class ReviewReportController { private final ReviewReportService reviewReportService; @PostMapping("/{reviewId}/report") @ApiResponseFormat(message = "리뷰 신고가 성공적으로 접수되었습니다.") - @Operation(summary = "리뷰 신고", description = "부적절한 리뷰를 신고합니다.") - @ApiResponses(value = { - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "리뷰 신고가 성공적으로 접수되었습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "자신이 작성한 리뷰는 신고할 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "신고할 리뷰를 찾을 수 없습니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "409", description = "이미 신고한 리뷰입니다."), - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "인증이 필요합니다.") + @Operation( + summary = "리뷰 신고", + description = "부적절한 리뷰를 신고합니다. 신고 사유와 상세 내용을 입력해야 하며, 자신이 작성한 리뷰는 신고할 수 없습니다. 동일한 리뷰를 중복 신고할 수도 없습니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 신고 접수 성공", + content = @Content(schema = @Schema(implementation = ReviewReportResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (자신의 리뷰 신고, 유효성 검증 실패)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자 (로그인 필요)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "신고할 리뷰를 찾을 수 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "409", + description = "이미 신고한 리뷰 (중복 신고 불가)" + ) }) public ApiResponse reportReview( - @Parameter(description = "리뷰 ID") @PathVariable Long reviewId, - @Valid @RequestBody ReviewReportRequest request, - Authentication authentication) { + @Parameter(description = "신고할 리뷰 ID", required = true, example = "123") @PathVariable Long reviewId, + @Parameter(description = "리뷰 신고 요청 정보 (신고 사유, 상세 내용 포함)", required = true) @Valid @RequestBody ReviewReportRequest request, + @Parameter(hidden = true) Authentication authentication) { if (authentication == null || !authentication.isAuthenticated()) { throw new SecurityException("로그인이 필요합니다."); diff --git a/src/main/java/com/cMall/feedShop/review/presentation/ReviewUserController.java b/src/main/java/com/cMall/feedShop/review/presentation/ReviewUserController.java index f1c11f914..a444eb857 100644 --- a/src/main/java/com/cMall/feedShop/review/presentation/ReviewUserController.java +++ b/src/main/java/com/cMall/feedShop/review/presentation/ReviewUserController.java @@ -18,6 +18,9 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.Max; @@ -60,10 +63,32 @@ public class ReviewUserController { @PostMapping(consumes = "application/json") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰가 성공적으로 작성되었습니다.") - @Operation(summary = "리뷰 작성 (JSON)", description = "이미지 없이 리뷰를 작성합니다.") + @Operation( + summary = "리뷰 작성 (JSON)", + description = "이미지 없이 JSON 형식으로 리뷰를 작성합니다. 작성 완료 시 포인트가 지급됩니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 작성 성공", + content = @Content(schema = @Schema(implementation = ReviewCreateResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (필수 필드 누락, 유효성 검증 실패)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "409", + description = "이미 해당 상품에 리뷰를 작성한 경우" + ) + }) public ApiResponse createReviewJson( - @Valid @RequestBody ReviewCreateRequest request, - @AuthenticationPrincipal User user) { + @Parameter(description = "리뷰 작성 요청 정보", required = true) @Valid @RequestBody ReviewCreateRequest request, + @Parameter(hidden = true) @AuthenticationPrincipal User user) { log.info("JSON 리뷰 작성 API 호출: productId={}, rating={}", request.getProductId(), request.getRating()); @@ -88,17 +113,39 @@ public ApiResponse createReviewJson( @PostMapping(consumes = "multipart/form-data") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰가 성공적으로 작성되었습니다.") - @Operation(summary = "리뷰 작성 (FormData)", description = "FormData 개별 필드로 리뷰를 작성합니다.") + @Operation( + summary = "리뷰 작성 (FormData)", + description = "FormData 개별 필드와 이미지 파일로 리뷰를 작성합니다. 프론트엔드 호환성을 위한 API입니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 작성 성공", + content = @Content(schema = @Schema(implementation = ReviewCreateResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (필수 필드 누락, 이미지 파일 오류)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "409", + description = "이미 해당 상품에 리뷰를 작성한 경우" + ) + }) public ApiResponse createReviewFormData( - @Valid @NotNull(message = "상품 ID는 필수입니다.") @RequestParam Long productId, - @Valid @NotBlank(message = "리뷰 제목은 필수입니다.") @RequestParam String title, - @Valid @NotNull(message = "평점은 필수입니다.") @Min(1) @Max(5) @RequestParam Integer rating, - @Valid @NotBlank(message = "리뷰 내용은 필수입니다.") @RequestParam String content, - @Valid @NotNull(message = "사이즈 착용감은 필수입니다.") @RequestParam Integer sizeFit, - @Valid @NotNull(message = "쿠션감은 필수입니다.") @RequestParam Integer cushion, - @Valid @NotNull(message = "안정성은 필수입니다.") @RequestParam Integer stability, - @RequestPart(value = "images", required = false) List images, - @AuthenticationPrincipal User user) { + @Parameter(description = "상품 ID", required = true) @Valid @NotNull(message = "상품 ID는 필수입니다.") @RequestParam Long productId, + @Parameter(description = "리뷰 제목", required = true) @Valid @NotBlank(message = "리뷰 제목은 필수입니다.") @RequestParam String title, + @Parameter(description = "평점 (1-5점)", required = true) @Valid @NotNull(message = "평점은 필수입니다.") @Min(1) @Max(5) @RequestParam Integer rating, + @Parameter(description = "리뷰 내용", required = true) @Valid @NotBlank(message = "리뷰 내용은 필수입니다.") @RequestParam String content, + @Parameter(description = "사이즈 착용감 (SMALL: 작음, NORMAL: 적당, LARGE: 큼)", required = true) @Valid @NotBlank(message = "사이즈 착용감은 필수입니다.") @RequestParam String sizeFit, + @Parameter(description = "쿠션감 (HARD: 딱딱, MODERATE: 보통, SOFT: 부드러움, VERY_SOFT: 매우 부드러움)", required = true) @Valid @NotBlank(message = "쿠션감은 필수입니다.") @RequestParam String cushion, + @Parameter(description = "안정성 (UNSTABLE: 불안정, MODERATE: 보통, STABLE: 안정적)", required = true) @Valid @NotBlank(message = "안정성은 필수입니다.") @RequestParam String stability, + @Parameter(description = "리뷰 이미지 파일들 (선택사항, 최대 5개)") @RequestPart(value = "images", required = false) List images, + @Parameter(hidden = true) @AuthenticationPrincipal User user) { log.info("FormData 리뷰 작성 API 호출: productId={}, rating={}", productId, rating); @@ -108,9 +155,9 @@ public ApiResponse createReviewFormData( .title(title) .rating(rating) .content(content) - .sizeFit(com.cMall.feedShop.review.domain.enums.SizeFit.fromValue(sizeFit)) - .cushion(com.cMall.feedShop.review.domain.enums.Cushion.fromValue(cushion)) - .stability(com.cMall.feedShop.review.domain.enums.Stability.fromValue(stability)) + .sizeFit(com.cMall.feedShop.review.domain.enums.SizeFit.valueOf(sizeFit)) + .cushion(com.cMall.feedShop.review.domain.enums.Cushion.valueOf(cushion)) + .stability(com.cMall.feedShop.review.domain.enums.Stability.valueOf(stability)) .build(); // 1. 리뷰 작성 (트랜잭션 포함) @@ -134,10 +181,28 @@ public ApiResponse createReviewFormData( @PostMapping(value = "/with-images", consumes = "multipart/form-data") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰가 성공적으로 작성되었습니다.") - @Operation(summary = "리뷰 작성 (JSON + 이미지)", description = "JSON 문자열과 이미지로 리뷰를 작성합니다.") + @Operation( + summary = "리뷰 작성 (JSON + 이미지)", + description = "JSON 형식의 리뷰 데이터와 이미지 파일을 함께 전송하여 리뷰를 작성합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 작성 성공", + content = @Content(schema = @Schema(implementation = ReviewCreateResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (JSON 파싱 오류, 이미지 파일 오류)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ) + }) public ApiResponse createReviewWithImages( - @Valid @RequestPart(value = "review") ReviewCreateRequest request, - @RequestPart(value = "images", required = false) List images) { + @Parameter(description = "JSON 형식의 리뷰 정보", required = true) @Valid @RequestPart(value = "review") ReviewCreateRequest request, + @Parameter(description = "리뷰 이미지 파일들 (선택사항)") @RequestPart(value = "images", required = false) List images) { log.info("JSON+이미지 리뷰 작성 API 호출: productId={}, imageCount={}", request.getProductId(), images != null ? images.size() : 0); @@ -155,11 +220,37 @@ public ApiResponse createReviewWithImages( @PutMapping("/{reviewId}") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰가 성공적으로 수정되었습니다.") - @Operation(summary = "리뷰 수정", description = "기존 리뷰를 수정합니다.") + @Operation( + summary = "리뷰 수정", + description = "기존 리뷰의 내용, 평점, 이미지를 수정합니다. 리뷰 작성자만 수정 가능합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 수정 성공", + content = @Content(schema = @Schema(implementation = ReviewUpdateResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (유효성 검증 실패, 이미지 파일 오류)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "리뷰 수정 권한 없음 (다른 사용자의 리뷰)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "리뷰를 찾을 수 없음" + ) + }) public ApiResponse updateReview( - @PathVariable Long reviewId, - @Valid @RequestPart("review") ReviewUpdateRequest request, - @RequestPart(value = "newImages", required = false) List newImages) { + @Parameter(description = "리뷰 ID", required = true) @PathVariable Long reviewId, + @Parameter(description = "리뷰 수정 정보 (JSON)", required = true) @Valid @RequestPart("review") ReviewUpdateRequest request, + @Parameter(description = "새로 추가할 이미지 파일들 (선택사항)") @RequestPart(value = "newImages", required = false) List newImages) { log.info("리뷰 수정 API 호출: reviewId={}", reviewId); @@ -174,10 +265,35 @@ public ApiResponse updateReview( @PatchMapping("/{reviewId}/rating") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰 평점이 성공적으로 수정되었습니다.") - @Operation(summary = "리뷰 평점만 수정", description = "리뷰의 평점만 수정합니다.") + @Operation( + summary = "리뷰 평점만 수정", + description = "리뷰의 평점(1-5점)만 빠르게 수정합니다. 리뷰 작성자만 수정 가능합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "평점 수정 성공" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 평점 값 (1-5점 범위 외)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "리뷰 수정 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "리뷰를 찾을 수 없음" + ) + }) public ApiResponse updateReviewRating( - @PathVariable Long reviewId, - @RequestBody @Valid UpdateRatingRequest request) { + @Parameter(description = "리뷰 ID", required = true) @PathVariable Long reviewId, + @Parameter(description = "수정할 평점 정보", required = true) @RequestBody @Valid UpdateRatingRequest request) { log.info("리뷰 평점 수정 API 호출: reviewId={}, 새로운 평점={}", reviewId, request.getRating()); @@ -192,10 +308,35 @@ public ApiResponse updateReviewRating( @PatchMapping("/{reviewId}/content") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰 내용이 성공적으로 수정되었습니다.") - @Operation(summary = "리뷰 내용만 수정", description = "리뷰의 내용만 수정합니다.") + @Operation( + summary = "리뷰 내용만 수정", + description = "리뷰의 내용만 빠르게 수정합니다. 리뷰 작성자만 수정 가능합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "내용 수정 성공" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 내용 (길이 제한 초과 등)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "리뷰 수정 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "리뷰를 찾을 수 없음" + ) + }) public ApiResponse updateReviewContent( - @PathVariable Long reviewId, - @RequestBody @Valid UpdateContentRequest request) { + @Parameter(description = "리뷰 ID", required = true) @PathVariable Long reviewId, + @Parameter(description = "수정할 내용 정보", required = true) @RequestBody @Valid UpdateContentRequest request) { log.info("리뷰 내용 수정 API 호출: reviewId={}", reviewId); @@ -212,8 +353,31 @@ public ApiResponse updateReviewContent( @DeleteMapping("/{reviewId}") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰가 성공적으로 삭제되었습니다.") - @Operation(summary = "리뷰 삭제", description = "리뷰와 연관된 모든 이미지를 함께 삭제합니다.") - public ApiResponse deleteReview(@PathVariable Long reviewId) { + @Operation( + summary = "리뷰 삭제", + description = "리뷰와 연관된 모든 이미지를 함께 삭제합니다. 리뷰 작성자만 삭제 가능합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "리뷰 삭제 성공", + content = @Content(schema = @Schema(implementation = ReviewDeleteResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "리뷰 삭제 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "리뷰를 찾을 수 없음" + ) + }) + public ApiResponse deleteReview( + @Parameter(description = "삭제할 리뷰 ID", required = true) @PathVariable Long reviewId) { log.info("리뷰 삭제 API 호출: reviewId={}", reviewId); @@ -230,10 +394,36 @@ public ApiResponse deleteReview(@PathVariable Long reviewI @DeleteMapping("/{reviewId}/images") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "선택된 이미지들이 성공적으로 삭제되었습니다.") - @Operation(summary = "리뷰 이미지 일괄 삭제", description = "리뷰의 특정 이미지들을 삭제합니다.") + @Operation( + summary = "리뷰 이미지 일괄 삭제", + description = "리뷰에서 선택한 특정 이미지들만 삭제합니다. 리뷰 내용은 유지됩니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "이미지 삭제 성공", + content = @Content(schema = @Schema(implementation = ReviewImageDeleteResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "400", + description = "잘못된 요청 (이미지 ID 목록 없음)" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "리뷰 수정 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "리뷰 또는 이미지를 찾을 수 없음" + ) + }) public ApiResponse deleteReviewImages( - @PathVariable Long reviewId, - @RequestBody @Valid DeleteImagesRequest request) { + @Parameter(description = "리뷰 ID", required = true) @PathVariable Long reviewId, + @Parameter(description = "삭제할 이미지 ID 목록", required = true) @RequestBody @Valid DeleteImagesRequest request) { log.info("리뷰 이미지 일괄 삭제 API 호출: reviewId={}, imageIds={}", reviewId, request.getImageIds()); @@ -249,8 +439,31 @@ public ApiResponse deleteReviewImages( @DeleteMapping("/{reviewId}/images/all") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "리뷰의 모든 이미지가 성공적으로 삭제되었습니다.") - @Operation(summary = "리뷰 이미지 전체 삭제", description = "리뷰의 모든 이미지를 삭제합니다. (리뷰 텍스트는 유지)") - public ApiResponse deleteAllReviewImages(@PathVariable Long reviewId) { + @Operation( + summary = "리뷰 이미지 전체 삭제", + description = "리뷰에 첫부된 모든 이미지를 삭제합니다. 리뷰 텍스트와 평점은 유지됩니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "이미지 전체 삭제 성공", + content = @Content(schema = @Schema(implementation = ReviewImageDeleteResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "403", + description = "리뷰 수정 권한 없음" + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "404", + description = "리뷰를 찾을 수 없음" + ) + }) + public ApiResponse deleteAllReviewImages( + @Parameter(description = "리뷰 ID", required = true) @PathVariable Long reviewId) { log.info("리뷰 이미지 전체 삭제 API 호출: reviewId={}", reviewId); @@ -270,9 +483,23 @@ public ApiResponse deleteAllReviewImages(@PathVariabl @GetMapping("/my/deleted") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "삭제된 리뷰 목록을 조회했습니다.") - @Operation(summary = "내가 삭제한 리뷰 목록 조회", description = "현재 로그인한 사용자가 삭제한 리뷰들을 조회합니다.") + @Operation( + summary = "내가 삭제한 리뷰 목록 조회", + description = "현재 로그인한 사용자가 삭제한 리뷰들을 조회합니다. 삭제된 리뷰는 다른 사용자에게 보이지 않습니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "삭제된 리뷰 목록 조회 성공", + content = @Content(schema = @Schema(implementation = ReviewResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ) + }) public ApiResponse> getMyDeletedReviews( - @AuthenticationPrincipal User user) { + @Parameter(hidden = true) @AuthenticationPrincipal User user) { log.info("내가 삭제한 리뷰 목록 조회 API 호출: userId={}", user.getId()); @@ -290,9 +517,23 @@ public ApiResponse> getMyDeletedReviews( @GetMapping("/my/deleted/count") @PreAuthorize("isAuthenticated()") @ApiResponseFormat(message = "삭제된 리뷰 개수를 조회했습니다.") - @Operation(summary = "내가 삭제한 리뷰 개수 조회", description = "현재 로그인한 사용자가 삭제한 리뷰 개수를 조회합니다.") + @Operation( + summary = "내가 삭제한 리뷰 개수 조회", + description = "현재 로그인한 사용자가 삭제한 리뷰의 총 개수를 조회합니다." + ) + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "200", + description = "삭제된 리뷰 개수 조회 성공", + content = @Content(schema = @Schema(implementation = UserDeletedReviewCountResponse.class)) + ), + @io.swagger.v3.oas.annotations.responses.ApiResponse( + responseCode = "401", + description = "인증되지 않은 사용자" + ) + }) public ApiResponse getMyDeletedReviewCount( - @AuthenticationPrincipal User user) { + @Parameter(hidden = true) @AuthenticationPrincipal User user) { log.info("내가 삭제한 리뷰 개수 조회 API 호출: userId={}", user.getId()); diff --git a/src/test/java/com/cMall/feedShop/review/application/service/ReviewCreateServiceTest.java b/src/test/java/com/cMall/feedShop/review/application/service/ReviewCreateServiceTest.java new file mode 100644 index 000000000..6750bd41c --- /dev/null +++ b/src/test/java/com/cMall/feedShop/review/application/service/ReviewCreateServiceTest.java @@ -0,0 +1,428 @@ +package com.cMall.feedShop.review.application.service; + +import com.cMall.feedShop.common.dto.UploadResult; +import com.cMall.feedShop.common.storage.StorageService; +import com.cMall.feedShop.common.storage.UploadDirectory; +import com.cMall.feedShop.product.domain.model.Product; +import com.cMall.feedShop.product.domain.model.Category; +import com.cMall.feedShop.product.domain.enums.CategoryType; +import com.cMall.feedShop.product.domain.repository.ProductRepository; +import com.cMall.feedShop.store.domain.model.Store; +import com.cMall.feedShop.review.application.dto.request.ReviewCreateRequest; +import com.cMall.feedShop.review.application.dto.response.ReviewCreateResponse; +import com.cMall.feedShop.review.domain.Review; +import com.cMall.feedShop.review.domain.enums.Cushion; +import com.cMall.feedShop.review.domain.enums.SizeFit; +import com.cMall.feedShop.review.domain.enums.Stability; +import com.cMall.feedShop.review.domain.repository.ReviewImageRepository; +import com.cMall.feedShop.review.domain.repository.ReviewRepository; +import com.cMall.feedShop.review.domain.service.ReviewDuplicationValidator; +import com.cMall.feedShop.review.domain.service.ReviewPurchaseVerificationService; +import com.cMall.feedShop.user.application.service.BadgeService; +import com.cMall.feedShop.user.application.service.PointService; +import com.cMall.feedShop.user.application.service.UserLevelService; +import com.cMall.feedShop.user.domain.enums.UserRole; +import com.cMall.feedShop.user.domain.model.ActivityType; +import com.cMall.feedShop.user.domain.model.User; +import com.cMall.feedShop.user.domain.repository.UserRepository; +import jakarta.persistence.EntityNotFoundException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.web.multipart.MultipartFile; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + +@ActiveProfiles("test") +@ExtendWith(MockitoExtension.class) +@DisplayName("ReviewCreateService 테스트") +class ReviewCreateServiceTest { + + @Mock + private ReviewRepository reviewRepository; + + @Mock + private UserRepository userRepository; + + @Mock + private ProductRepository productRepository; + + @Mock + private ReviewDuplicationValidator duplicationValidator; + + @Mock + private ReviewPurchaseVerificationService purchaseVerificationService; + + @Mock + private ReviewImageService reviewImageService; + + @Mock + private ReviewImageRepository reviewImageRepository; + + @Mock + private BadgeService badgeService; + + @Mock + private UserLevelService userLevelService; + + @Mock + private PointService pointService; + + @Mock + private StorageService gcpStorageService; + + @Mock + private SecurityContext securityContext; + + @Mock + private Authentication authentication; + + @Mock + private UserDetails userDetails; + + @InjectMocks + private ReviewCreateService reviewCreateService; + + private User testUser; + private Product testProduct; + private ReviewCreateRequest createRequest; + private Review savedReview; + + @BeforeEach + void setUp() { + testUser = new User(1L, "testuser", "password", "test@example.com", UserRole.USER); + // testUser의 loginId 설정 (UUID 형식) + try { + java.lang.reflect.Field loginIdField = User.class.getDeclaredField("loginId"); + loginIdField.setAccessible(true); + loginIdField.set(testUser, "befb3068-0fdc-4cb1-9096-6fbd2e2ec8c8"); + } catch (Exception e) { + throw new RuntimeException("Failed to set loginId", e); + } + Store testStore = Store.builder() + .storeName("테스트 스토어") + .sellerId(1L) + .build(); + + Category testCategory = new Category(CategoryType.SNEAKERS, "운동화"); + + testProduct = Product.builder() + .name("테스트 신발") + .price(BigDecimal.valueOf(100000)) + .store(testStore) + .category(testCategory) + .description("테스트 설명") + .build(); + + // Reflection을 사용하여 productId 설정 + try { + java.lang.reflect.Field productIdField = Product.class.getDeclaredField("productId"); + productIdField.setAccessible(true); + productIdField.set(testProduct, 1L); + } catch (Exception e) { + throw new RuntimeException("Failed to set productId", e); + } + + createRequest = ReviewCreateRequest.builder() + .title("좋은 신발입니다") + .rating(5) + .sizeFit(SizeFit.NORMAL) + .cushion(Cushion.SOFT) + .stability(Stability.STABLE) + .content("정말 편하고 좋습니다. 추천해요!") + .productId(1L) + .build(); + + savedReview = Review.builder() + .title(createRequest.getTitle()) + .rating(createRequest.getRating()) + .sizeFit(createRequest.getSizeFit()) + .cushion(createRequest.getCushion()) + .stability(createRequest.getStability()) + .content(createRequest.getContent()) + .user(testUser) + .product(testProduct) + .build(); + + // Reflection을 사용하여 reviewId 설정 + try { + java.lang.reflect.Field reviewIdField = Review.class.getDeclaredField("reviewId"); + reviewIdField.setAccessible(true); + reviewIdField.set(savedReview, 1L); + } catch (Exception e) { + throw new RuntimeException("Failed to set reviewId", e); + } + } + + @Test + @DisplayName("이미지 없이 리뷰를 성공적으로 생성할 수 있다") + void createReview_WithoutImages_Success() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); + given(reviewRepository.save(any(Review.class))).willReturn(savedReview); + + // when + ReviewCreateResponse response = reviewCreateService.createReview(createRequest, null); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); + assertThat(response.getImageUrls()).isEmpty(); + assertThat(response.getPointsEarned()).isEqualTo(100); + + verify(duplicationValidator).validateNoDuplicateActiveReview(testUser.getId(), testProduct.getProductId()); + verify(purchaseVerificationService).validateUserPurchasedProduct(testUser, testProduct.getProductId()); + verify(reviewRepository).save(any(Review.class)); + verify(pointService).earnPoints(testUser, 100, "리뷰 작성 보상", 1L); + verify(badgeService).checkAndAwardReviewBadges(testUser.getId(), 1L); + verify(userLevelService).recordActivity(testUser.getId(), ActivityType.REVIEW_CREATION, "리뷰 작성", 1L, "REVIEW"); + } + + @Test + @DisplayName("이미지와 함께 리뷰를 성공적으로 생성할 수 있다") + void createReview_WithImages_Success() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); + given(reviewRepository.save(any(Review.class))).willReturn(savedReview); + + List images = Arrays.asList( + new MockMultipartFile("image1", "image1.jpg", "image/jpeg", "image1".getBytes()), + new MockMultipartFile("image2", "image2.jpg", "image/jpeg", "image2".getBytes()) + ); + + List uploadResults = Arrays.asList( + UploadResult.builder() + .originalFilename("image1.jpg") + .storedFilename("stored_image1.jpg") + .filePath("/uploads/reviews/image1.jpg") + .fileSize(1024L) + .contentType("image/jpeg") + .build(), + UploadResult.builder() + .originalFilename("image2.jpg") + .storedFilename("stored_image2.jpg") + .filePath("/uploads/reviews/image2.jpg") + .fileSize(2048L) + .contentType("image/jpeg") + .build() + ); + + // GCP Storage 서비스가 주입되도록 설정 + reviewCreateService = new ReviewCreateService( + reviewRepository, userRepository, productRepository, duplicationValidator, + purchaseVerificationService, reviewImageService, reviewImageRepository, + badgeService, userLevelService, pointService + ); + + // Reflection을 사용하여 gcpStorageService 주입 + try { + java.lang.reflect.Field gcpStorageServiceField = ReviewCreateService.class.getDeclaredField("gcpStorageService"); + gcpStorageServiceField.setAccessible(true); + gcpStorageServiceField.set(reviewCreateService, gcpStorageService); + } catch (Exception e) { + throw new RuntimeException("Failed to inject gcpStorageService", e); + } + + given(gcpStorageService.uploadFilesWithDetails(images, UploadDirectory.REVIEWS)).willReturn(uploadResults); + + // when + ReviewCreateResponse response = reviewCreateService.createReview(createRequest, images); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); + assertThat(response.getImageUrls()).hasSize(2); + assertThat(response.getImageUrls()).containsExactly("/uploads/reviews/image1.jpg", "/uploads/reviews/image2.jpg"); + assertThat(response.getPointsEarned()).isEqualTo(100); + + verify(gcpStorageService).uploadFilesWithDetails(images, UploadDirectory.REVIEWS); + verify(reviewImageService).saveReviewImages(savedReview, images); + } + + @Test + @DisplayName("존재하지 않는 상품으로 리뷰 생성 시 예외가 발생한다") + void createReview_ProductNotFound_ThrowsException() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.empty()); + + // when & then + assertThatThrownBy(() -> reviewCreateService.createReview(createRequest, null)) + .isInstanceOf(EntityNotFoundException.class) + .hasMessageContaining("상품을 찾을 수 없습니다"); + + verify(reviewRepository, never()).save(any(Review.class)); + } + + @Test + @DisplayName("중복 리뷰 검증 실패 시 예외가 발생한다") + void createReview_DuplicateReview_ThrowsException() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); + doThrow(new IllegalStateException("이미 리뷰를 작성하셨습니다")) + .when(duplicationValidator).validateNoDuplicateActiveReview(testUser.getId(), testProduct.getProductId()); + + // when & then + assertThatThrownBy(() -> reviewCreateService.createReview(createRequest, null)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("이미 리뷰를 작성하셨습니다"); + + verify(reviewRepository, never()).save(any(Review.class)); + } + + @Test + @DisplayName("구매 이력 검증 실패 시 예외가 발생한다") + void createReview_PurchaseVerificationFailed_ThrowsException() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); + doThrow(new IllegalStateException("구매 이력이 없습니다")) + .when(purchaseVerificationService).validateUserPurchasedProduct(testUser, testProduct.getProductId()); + + // when & then + assertThatThrownBy(() -> reviewCreateService.createReview(createRequest, null)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("구매 이력이 없습니다"); + + verify(reviewRepository, never()).save(any(Review.class)); + } + + @Test + @DisplayName("인증되지 않은 사용자가 리뷰 생성 시 예외가 발생한다") + void createReview_UnauthenticatedUser_ThrowsException() { + // given + given(userRepository.findByLoginId("befb3068-0fdc-4cb1-9096-6fbd2e2ec8c8")).willReturn(Optional.empty()); + SecurityContextHolder.setContext(securityContext); + given(securityContext.getAuthentication()).willReturn(authentication); + given(authentication.isAuthenticated()).willReturn(true); + given(authentication.getPrincipal()).willReturn(userDetails); + given(userDetails.getUsername()).willReturn("befb3068-0fdc-4cb1-9096-6fbd2e2ec8c8"); + + // when & then + assertThatThrownBy(() -> reviewCreateService.createReview(createRequest, null)) + .isInstanceOf(EntityNotFoundException.class) + .hasMessageContaining("사용자를 찾을 수 없습니다"); + + verify(reviewRepository, never()).save(any(Review.class)); + } + + @Test + @DisplayName("이미지 업로드 실패 시에도 리뷰는 성공적으로 생성된다") + void createReview_ImageUploadFails_ReviewStillCreated() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); + given(reviewRepository.save(any(Review.class))).willReturn(savedReview); + + List images = Arrays.asList( + new MockMultipartFile("image1", "image1.jpg", "image/jpeg", "image1".getBytes()) + ); + + // GCP Storage 서비스가 주입되도록 설정 + reviewCreateService = new ReviewCreateService( + reviewRepository, userRepository, productRepository, duplicationValidator, + purchaseVerificationService, reviewImageService, reviewImageRepository, + badgeService, userLevelService, pointService + ); + + // Reflection을 사용하여 gcpStorageService 주입 + try { + java.lang.reflect.Field gcpStorageServiceField = ReviewCreateService.class.getDeclaredField("gcpStorageService"); + gcpStorageServiceField.setAccessible(true); + gcpStorageServiceField.set(reviewCreateService, gcpStorageService); + } catch (Exception e) { + throw new RuntimeException("Failed to inject gcpStorageService", e); + } + + given(gcpStorageService.uploadFilesWithDetails(images, UploadDirectory.REVIEWS)) + .willThrow(new RuntimeException("Storage upload failed")); + + // when + ReviewCreateResponse response = reviewCreateService.createReview(createRequest, images); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); + assertThat(response.getImageUrls()).isEmpty(); // 업로드 실패로 빈 목록 + assertThat(response.getPointsEarned()).isEqualTo(100); + + verify(reviewRepository).save(any(Review.class)); + verify(reviewImageService).saveReviewImages(savedReview, images); // 로컬 저장은 계속 진행 + } + + @Test + @DisplayName("포인트 적립 실패 시에도 리뷰는 성공적으로 생성된다") + void createReview_PointAwardFails_ReviewStillCreated() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); + given(reviewRepository.save(any(Review.class))).willReturn(savedReview); + doThrow(new RuntimeException("Point service failed")) + .when(pointService).earnPoints(testUser, 100, "리뷰 작성 보상", 1L); + + // when + ReviewCreateResponse response = reviewCreateService.createReview(createRequest, null); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); + assertThat(response.getPointsEarned()).isEqualTo(0); // 포인트 적립 실패로 0 + + verify(reviewRepository).save(any(Review.class)); + verify(badgeService).checkAndAwardReviewBadges(testUser.getId(), 1L); // 뱃지 체크는 계속 진행 + } + + @Test + @DisplayName("뱃지 수여 실패 시에도 리뷰는 성공적으로 생성된다") + void createReview_BadgeAwardFails_ReviewStillCreated() { + // given + mockSecurityContext(); + given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); + given(reviewRepository.save(any(Review.class))).willReturn(savedReview); + doThrow(new RuntimeException("Badge service failed")) + .when(badgeService).checkAndAwardReviewBadges(testUser.getId(), 1L); + + // when + ReviewCreateResponse response = reviewCreateService.createReview(createRequest, null); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); + assertThat(response.getPointsEarned()).isEqualTo(100); + + verify(reviewRepository).save(any(Review.class)); + verify(pointService).earnPoints(testUser, 100, "리뷰 작성 보상", 1L); + } + + private void mockSecurityContext() { + SecurityContextHolder.setContext(securityContext); + given(securityContext.getAuthentication()).willReturn(authentication); + given(authentication.isAuthenticated()).willReturn(true); + given(authentication.getPrincipal()).willReturn(userDetails); + given(userDetails.getUsername()).willReturn("befb3068-0fdc-4cb1-9096-6fbd2e2ec8c8"); + given(userRepository.findByLoginId("befb3068-0fdc-4cb1-9096-6fbd2e2ec8c8")).willReturn(Optional.of(testUser)); + } +} \ No newline at end of file diff --git a/src/test/java/com/cMall/feedShop/review/application/service/ReviewDeleteServiceTest.java b/src/test/java/com/cMall/feedShop/review/application/service/ReviewDeleteServiceTest.java index d9981faa0..b27ab7e4e 100644 --- a/src/test/java/com/cMall/feedShop/review/application/service/ReviewDeleteServiceTest.java +++ b/src/test/java/com/cMall/feedShop/review/application/service/ReviewDeleteServiceTest.java @@ -1,122 +1,342 @@ package com.cMall.feedShop.review.application.service; +import com.cMall.feedShop.common.exception.BusinessException; +import com.cMall.feedShop.common.exception.ErrorCode; +import com.cMall.feedShop.common.storage.StorageService; +import com.cMall.feedShop.review.application.dto.response.ReviewDeleteResponse; +import com.cMall.feedShop.review.application.dto.response.ReviewImageDeleteResponse; +import com.cMall.feedShop.review.domain.Review; +import com.cMall.feedShop.review.domain.ReviewImage; +import com.cMall.feedShop.review.domain.exception.ReviewAccessDeniedException; +import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; +import com.cMall.feedShop.review.domain.repository.ReviewImageRepository; import com.cMall.feedShop.review.domain.repository.ReviewRepository; +import com.cMall.feedShop.product.domain.model.Product; +import com.cMall.feedShop.product.domain.model.Category; +import com.cMall.feedShop.product.domain.enums.CategoryType; +import com.cMall.feedShop.store.domain.model.Store; +import com.cMall.feedShop.review.domain.enums.SizeFit; +import com.cMall.feedShop.review.domain.enums.Cushion; +import com.cMall.feedShop.review.domain.enums.Stability; +import com.cMall.feedShop.user.domain.enums.UserRole; +import com.cMall.feedShop.user.domain.model.User; +import com.cMall.feedShop.user.domain.repository.UserRepository; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.test.context.ActiveProfiles; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; -import java.util.Collections; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.*; @ActiveProfiles("test") @ExtendWith(MockitoExtension.class) -@DisplayName("ReviewService 삭제/통계 기능 테스트") +@DisplayName("ReviewDeleteService 삭제 기능 테스트") class ReviewDeleteServiceTest { @Mock private ReviewRepository reviewRepository; + + @Mock + private UserRepository userRepository; + + @Mock + private ReviewImageService reviewImageService; + + @Mock + private ReviewImageRepository reviewImageRepository; + + @Mock + private StorageService gcpStorageService; + + @Mock + private SecurityContext securityContext; + + @Mock + private Authentication authentication; + + @Mock + private UserDetails userDetails; @InjectMocks - private ReviewService reviewService; + private ReviewDeleteService reviewDeleteService; + + private User testUser; + private Review testReview; + private ReviewImage testReviewImage; + private Product testProduct; + + @BeforeEach + void setUp() { + testUser = new User(1L, "testuser", "password", "test@example.com", UserRole.USER); + + Store testStore = Store.builder() + .storeName("테스트 스토어") + .sellerId(1L) + .build(); + + Category testCategory = new Category(CategoryType.SNEAKERS, "운동화"); + + testProduct = Product.builder() + .name("테스트 신발") + .price(BigDecimal.valueOf(100000)) + .store(testStore) + .category(testCategory) + .description("테스트 설명") + .build(); + + // Reflection을 사용하여 productId 설정 + try { + java.lang.reflect.Field productIdField = Product.class.getDeclaredField("productId"); + productIdField.setAccessible(true); + productIdField.set(testProduct, 1L); + } catch (Exception e) { + throw new RuntimeException("Failed to set productId", e); + } + + testReview = Review.builder() + .title("테스트 리뷰") + .rating(5) + .sizeFit(SizeFit.NORMAL) + .cushion(Cushion.SOFT) + .stability(Stability.STABLE) + .content("테스트 내용") + .user(testUser) + .product(testProduct) + .build(); + + // Reflection을 사용하여 reviewId 설정 + try { + java.lang.reflect.Field reviewIdField = Review.class.getDeclaredField("reviewId"); + reviewIdField.setAccessible(true); + reviewIdField.set(testReview, 1L); + } catch (Exception e) { + throw new RuntimeException("Failed to set reviewId", e); + } + + testReviewImage = ReviewImage.builder() + .review(testReview) + .originalFilename("test.jpg") + .storedFilename("stored_test.jpg") + .filePath("/uploads/reviews/test.jpg") + .fileSize(1024L) + .contentType("image/jpeg") + .imageOrder(0) + .build(); + + // Reflection을 사용하여 reviewImageId 설정 + try { + java.lang.reflect.Field imageIdField = ReviewImage.class.getDeclaredField("reviewImageId"); + imageIdField.setAccessible(true); + imageIdField.set(testReviewImage, 1L); + } catch (Exception e) { + throw new RuntimeException("Failed to set reviewImageId", e); + } + } @Test - @DisplayName("사용자 삭제된 리뷰 개수 조회 - 성공") - void getUserDeletedReviewCount_Success() { - // Given - Long userId = 1L; - Long expectedCount = 5L; + @DisplayName("리뷰를 성공적으로 삭제할 수 있다") + void deleteReview_Success() { + // given + mockSecurityContext(); + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); + given(reviewImageRepository.findByReviewReviewIdAndDeletedFalse(1L)) + .willReturn(Arrays.asList(testReviewImage)); + given(reviewRepository.save(any(Review.class))).willReturn(testReview); - given(reviewRepository.countDeletedReviewsByUserId(userId)).willReturn(expectedCount); + // when + ReviewDeleteResponse response = reviewDeleteService.deleteReview(1L); + + // then + assertThat(response.getDeletedReviewId()).isEqualTo(1L); + // GCP Storage가 없는 환경에서도 DB에서는 삭제 처리됨 + assertThat(response.getDeletedImageCount()).isEqualTo(1); + + verify(reviewRepository).findById(1L); + verify(reviewImageRepository).findByReviewReviewIdAndDeletedFalse(1L); + verify(reviewRepository).save(testReview); + verify(reviewImageRepository).saveAll(any()); + } - // When - Long result = reviewService.getUserDeletedReviewCount(userId); + @Test + @DisplayName("존재하지 않는 리뷰 삭제 시 예외가 발생한다") + void deleteReview_ReviewNotFound_ThrowsException() { + // given + mockSecurityContext(); + given(reviewRepository.findById(999L)).willReturn(Optional.empty()); - // Then - assertThat(result).isEqualTo(expectedCount); - verify(reviewRepository).countDeletedReviewsByUserId(userId); + // when & then + assertThatThrownBy(() -> reviewDeleteService.deleteReview(999L)) + .isInstanceOf(ReviewNotFoundException.class) + .hasMessageContaining("ID 999에 해당하는 리뷰를 찾을 수 없습니다"); + + verify(reviewRepository, never()).save(any(Review.class)); } @Test - @DisplayName("상품 리뷰 통계 조회 - 성공") - void getProductReviewStats_Success() { - // Given - Long productId = 1L; - Long activeCount = 10L; - Long deletedCount = 3L; - Long totalCount = 13L; - Double averageRating = 4.2; - - given(reviewRepository.countActiveReviewsByProductId(productId)).willReturn(activeCount); - given(reviewRepository.countDeletedReviewsByProductId(productId)).willReturn(deletedCount); - given(reviewRepository.countAllReviewsByProductId(productId)).willReturn(totalCount); - given(reviewRepository.findAverageRatingByProductId(productId)).willReturn(averageRating); - - // When - ReviewService.ReviewStatsResponse response = reviewService.getProductReviewStats(productId); - - // Then - assertThat(response).isNotNull(); - assertThat(response.getProductId()).isEqualTo(productId); - assertThat(response.getActiveReviewCount()).isEqualTo(activeCount); - assertThat(response.getDeletedReviewCount()).isEqualTo(deletedCount); - assertThat(response.getTotalReviewCount()).isEqualTo(totalCount); - assertThat(response.getAverageRating()).isEqualTo(averageRating); - assertThat(response.getDeletionRate()).isEqualTo(23.076923076923077); // 3/13 * 100 - - verify(reviewRepository).countActiveReviewsByProductId(productId); - verify(reviewRepository).countDeletedReviewsByProductId(productId); - verify(reviewRepository).countAllReviewsByProductId(productId); - verify(reviewRepository).findAverageRatingByProductId(productId); + @DisplayName("다른 사용자의 리뷰 삭제 시 예외가 발생한다") + void deleteReview_AccessDenied_ThrowsException() { + // given + User otherUser = new User(2L, "otheruser", "password", "other@example.com", UserRole.USER); + mockSecurityContextForUser(otherUser); + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); + + // when & then + assertThatThrownBy(() -> reviewDeleteService.deleteReview(1L)) + .isInstanceOf(ReviewAccessDeniedException.class); + + verify(reviewRepository, never()).save(any(Review.class)); } @Test - @DisplayName("기간별 삭제된 리뷰 통계 조회 - 성공") - void getDeletedReviewStatsBetween_Success() { - // Given - LocalDateTime startDate = LocalDateTime.now().minusDays(30); - LocalDateTime endDate = LocalDateTime.now(); - - // Mock Review 객체들 생성 - com.cMall.feedShop.review.domain.Review mockReview1 = mock(com.cMall.feedShop.review.domain.Review.class); - com.cMall.feedShop.review.domain.Review mockReview2 = mock(com.cMall.feedShop.review.domain.Review.class); - - given(mockReview1.getUser()).willReturn(mock(com.cMall.feedShop.user.domain.model.User.class)); - given(mockReview1.getProduct()).willReturn(mock(com.cMall.feedShop.product.domain.model.Product.class)); - given(mockReview1.getUser().getId()).willReturn(1L); - given(mockReview1.getProduct().getProductId()).willReturn(1L); - - given(mockReview2.getUser()).willReturn(mock(com.cMall.feedShop.user.domain.model.User.class)); - given(mockReview2.getProduct()).willReturn(mock(com.cMall.feedShop.product.domain.model.Product.class)); - given(mockReview2.getUser().getId()).willReturn(2L); - given(mockReview2.getProduct().getProductId()).willReturn(2L); - - List deletedReviews = Arrays.asList(mockReview1, mockReview2); - - given(reviewRepository.findDeletedReviewsBetween(startDate, endDate)).willReturn(deletedReviews); - - // When - ReviewService.PeriodReviewStatsResponse response = reviewService.getDeletedReviewStatsBetween(startDate, endDate); - - // Then - assertThat(response).isNotNull(); - assertThat(response.getStartDate()).isEqualTo(startDate); - assertThat(response.getEndDate()).isEqualTo(endDate); - assertThat(response.getTotalDeletedCount()).isEqualTo(2L); - assertThat(response.getUniqueUserCount()).isEqualTo(2L); - assertThat(response.getUniqueProductCount()).isEqualTo(2L); - - verify(reviewRepository).findDeletedReviewsBetween(startDate, endDate); + @DisplayName("리뷰 이미지를 일괄 삭제할 수 있다") + void deleteReviewImages_Success() { + // given + mockSecurityContext(); + List imageIds = Arrays.asList(1L, 2L); + List deletedImageIds = Arrays.asList(1L, 2L); + + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); + given(reviewImageService.deleteSelectedImages(1L, imageIds)).willReturn(deletedImageIds); + given(reviewImageService.getActiveImageCount(1L)).willReturn(0); + + // when + ReviewImageDeleteResponse response = reviewDeleteService.deleteReviewImages(1L, imageIds); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getDeletedImageIds()).hasSize(2); + assertThat(response.getRemainingImageCount()).isEqualTo(0); + + verify(reviewImageService).deleteSelectedImages(1L, imageIds); + verify(reviewImageService).getActiveImageCount(1L); } + @Test + @DisplayName("리뷰 이미지를 개별 삭제할 수 있다") + void deleteReviewImage_Success() { + // given + mockSecurityContext(); + Long imageId = 1L; + List deletedImageIds = Arrays.asList(imageId); + + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); + given(reviewImageService.deleteSelectedImages(1L, Arrays.asList(imageId))).willReturn(deletedImageIds); + given(reviewImageService.getActiveImageCount(1L)).willReturn(1); + + // when + ReviewImageDeleteResponse response = reviewDeleteService.deleteReviewImage(1L, imageId); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getRemainingImageCount()).isEqualTo(1); + + verify(reviewImageService).deleteSelectedImages(1L, Arrays.asList(imageId)); + verify(reviewImageService).getActiveImageCount(1L); + } + + @Test + @DisplayName("존재하지 않는 이미지 삭제 시 예외가 발생한다") + void deleteReviewImage_ImageNotFound_ThrowsException() { + // given + mockSecurityContext(); + Long imageId = 999L; + + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); + given(reviewImageService.deleteSelectedImages(1L, Arrays.asList(imageId))).willReturn(Arrays.asList()); + + // when & then + assertThatThrownBy(() -> reviewDeleteService.deleteReviewImage(1L, imageId)) + .isInstanceOf(BusinessException.class) + .hasMessageContaining("삭제할 이미지를 찾을 수 없습니다"); + } + + @Test + @DisplayName("리뷰의 모든 이미지를 삭제할 수 있다") + void deleteAllReviewImages_Success() { + // given + mockSecurityContext(); + + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); + given(reviewImageRepository.findByReviewReviewIdAndDeletedFalse(1L)) + .willReturn(Arrays.asList(testReviewImage, testReviewImage, testReviewImage)); + + // 실제로 호출되는 인자와 일치하도록 수정: testReviewImage의 ID는 모두 1L + List actualImageIds = Arrays.asList(1L, 1L, 1L); + given(reviewImageService.deleteSelectedImages(1L, actualImageIds)).willReturn(actualImageIds); + + // when + ReviewImageDeleteResponse response = reviewDeleteService.deleteAllReviewImages(1L); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getDeletedImageIds()).hasSize(3); + + verify(reviewImageRepository).findByReviewReviewIdAndDeletedFalse(1L); + verify(reviewImageService).deleteSelectedImages(1L, actualImageIds); + } + + @Test + @DisplayName("삭제할 이미지가 없는 경우 빈 목록을 반환한다") + void deleteAllReviewImages_NoImages_ReturnsEmptyList() { + // given + mockSecurityContext(); + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); + given(reviewImageRepository.findByReviewReviewIdAndDeletedFalse(1L)).willReturn(Arrays.asList()); + + // when + ReviewImageDeleteResponse response = reviewDeleteService.deleteAllReviewImages(1L); + + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getDeletedImageIds()).isEmpty(); + + verify(reviewImageService, never()).deleteSelectedImages(anyLong(), any()); + } + + @Test + @DisplayName("인증되지 않은 사용자가 리뷰 삭제 시 예외가 발생한다") + void deleteReview_UnauthenticatedUser_ThrowsException() { + // given + SecurityContextHolder.setContext(securityContext); + given(securityContext.getAuthentication()).willReturn(null); + + // when & then + assertThatThrownBy(() -> reviewDeleteService.deleteReview(1L)) + .isInstanceOf(BusinessException.class) + .hasMessageContaining("로그인이 필요합니다"); + + verify(reviewRepository, never()).findById(anyLong()); + } + + private void mockSecurityContext() { + mockSecurityContextForUser(testUser); + } + + private void mockSecurityContextForUser(User user) { + SecurityContextHolder.setContext(securityContext); + given(securityContext.getAuthentication()).willReturn(authentication); + given(authentication.isAuthenticated()).willReturn(true); + given(authentication.getPrincipal()).willReturn(userDetails); + given(userDetails.getUsername()).willReturn(user.getEmail()); + given(userRepository.findByEmail(user.getEmail())).willReturn(Optional.of(user)); + } } \ No newline at end of file diff --git a/src/test/java/com/cMall/feedShop/review/application/service/ReviewServiceTest.java b/src/test/java/com/cMall/feedShop/review/application/service/ReviewServiceTest.java index f9580f795..924f67e77 100644 --- a/src/test/java/com/cMall/feedShop/review/application/service/ReviewServiceTest.java +++ b/src/test/java/com/cMall/feedShop/review/application/service/ReviewServiceTest.java @@ -1,169 +1,54 @@ package com.cMall.feedShop.review.application.service; -import com.cMall.feedShop.common.dto.UploadResult; import com.cMall.feedShop.common.exception.BusinessException; -import com.cMall.feedShop.common.storage.GcpStorageService; -import com.cMall.feedShop.common.storage.UploadDirectory; import com.cMall.feedShop.review.application.dto.request.ReviewCreateRequest; import com.cMall.feedShop.review.application.dto.response.ReviewCreateResponse; -import com.cMall.feedShop.review.application.dto.response.ReviewImageResponse; import com.cMall.feedShop.review.application.dto.response.ReviewListResponse; import com.cMall.feedShop.review.application.dto.response.ReviewResponse; -import com.cMall.feedShop.review.domain.exception.DuplicateReviewException; -import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; -import com.cMall.feedShop.review.domain.Review; import com.cMall.feedShop.review.domain.enums.Cushion; import com.cMall.feedShop.review.domain.enums.SizeFit; import com.cMall.feedShop.review.domain.enums.Stability; -import com.cMall.feedShop.review.domain.repository.ReviewRepository; -import com.cMall.feedShop.product.domain.model.Product; -import com.cMall.feedShop.product.domain.model.Category; -import com.cMall.feedShop.review.domain.service.ReviewDuplicationValidator; -import com.cMall.feedShop.store.domain.model.Store; -import com.cMall.feedShop.product.domain.enums.DiscountType; -import com.cMall.feedShop.user.domain.enums.UserRole; -import com.cMall.feedShop.user.domain.model.User; -import com.cMall.feedShop.user.domain.model.UserProfile; -import com.cMall.feedShop.user.domain.repository.UserRepository; -import com.cMall.feedShop.product.domain.repository.ProductRepository; -import jakarta.persistence.EntityNotFoundException; -import org.junit.jupiter.api.AfterEach; +import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.util.ReflectionTestUtils; -import org.springframework.web.multipart.MultipartFile; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.List; -import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.verify; @ActiveProfiles("test") @ExtendWith(MockitoExtension.class) -@DisplayName("ReviewService 테스트 (DTO 불변성 적용)") +@DisplayName("ReviewService 테스트 (CRUD 서비스 Facade)") class ReviewServiceTest { @Mock - private ReviewRepository reviewRepository; - - @Mock - private UserRepository userRepository; - - @Mock - private ProductRepository productRepository; - - @Mock - private SecurityContext securityContext; - - @Mock - private Authentication authentication; - - @Mock - private ReviewDuplicationValidator duplicationValidator; - - @Mock - private com.cMall.feedShop.review.domain.service.ReviewPurchaseVerificationService purchaseVerificationService; - - @Mock - private ReviewImageService reviewImageService; + private ReviewCreateService reviewCreateService; @Mock - private com.cMall.feedShop.review.domain.repository.ReviewImageRepository reviewImageRepository; - - @Mock - private com.cMall.feedShop.user.application.service.UserLevelService userLevelService; - - @Mock - private com.cMall.feedShop.user.application.service.PointService pointService; - + private ReviewReadService reviewReadService; + @Mock - private com.cMall.feedShop.user.application.service.BadgeService badgeService; - + private ReviewUpdateService reviewUpdateService; + @Mock - private GcpStorageService gcpStorageService; + private ReviewDeleteService reviewDeleteService; @InjectMocks private ReviewService reviewService; - private User testUser; - private UserProfile testUserProfile; - private Product testProduct; - private Store testStore; - private Category testCategory; - private Review testReview; private ReviewCreateRequest createRequest; @BeforeEach void setUp() { - testUser = new User("testLogin", "password", "test@test.com", UserRole.USER); - ReflectionTestUtils.setField(testUser, "id", 1L); - - UserProfile testUserProfile = UserProfile.builder() - .user(testUser) - .name("테스트사용자") - .nickname("테스트닉네임") - .phone("010-1234-5678") - // 다른 필드들 (birthDate, height, footSize, profileImageUrl)도 필요에 따라 추가 - .birthDate(LocalDate.of(1990, 1, 1)) - .height(175) - .weight(70) - .footSize(270) - .footWidth(com.cMall.feedShop.user.domain.enums.FootWidth.NORMAL) - .profileImageUrl("https://test-image.com/profile.jpg") - .build(); - testUser.setUserProfile(testUserProfile); - - // Store와 Category 모킹 - testStore = mock(Store.class); - testCategory = mock(Category.class); - - // Product 객체 생성 - testProduct = Product.builder() - .name("테스트 신발") - .price(new BigDecimal("100000")) - .store(testStore) - .category(testCategory) - .discountType(DiscountType.NONE) - .discountValue(null) - .description("테스트용 신발입니다") - .build(); - ReflectionTestUtils.setField(testProduct, "productId", 1L); - - testReview = Review.builder() - .title("좋은 신발입니다") - .rating(5) - .sizeFit(SizeFit.NORMAL) - .cushion(Cushion.SOFT) - .stability(Stability.STABLE) - .content("정말 편하고 좋습니다. 추천해요!") - .user(testUser) - .product(testProduct) - .build(); - ReflectionTestUtils.setField(testReview, "reviewId", 1L); - ReflectionTestUtils.setField(testReview, "createdAt", LocalDateTime.now()); - ReflectionTestUtils.setField(testReview, "updatedAt", LocalDateTime.now()); - - // ✅ Builder 패턴으로 불변 DTO 생성 createRequest = ReviewCreateRequest.builder() .title("좋은 신발입니다") .rating(5) @@ -173,80 +58,78 @@ void setUp() { .content("정말 편하고 좋습니다. 추천해요!") .productId(1L) .build(); - - ReflectionTestUtils.setField(reviewService, "gcpStorageService", gcpStorageService); - } - - @AfterEach - void tearDown() { - SecurityContextHolder.clearContext(); } @Test - @DisplayName("리뷰를 성공적으로 생성할 수 있다 (불변 DTO)") + @DisplayName("리뷰를 성공적으로 생성할 수 있다 (Facade 패턴)") void createReviewSuccessfully() { // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - doNothing().when(purchaseVerificationService).validateUserPurchasedProduct(any(User.class), any(Long.class)); - doNothing().when(userLevelService).recordActivity(anyLong(), any(), anyString(), any(), anyString()); + ReviewCreateResponse expectedResponse = ReviewCreateResponse.builder() + .reviewId(1L) + .message("리뷰가 성공적으로 등록되었습니다.") + .pointsEarned(100) + .build(); + + given(reviewCreateService.createReview(createRequest, null)).willReturn(expectedResponse); - // when - ReviewCreateResponse response = reviewService.createReview(createRequest, null); + // when + ReviewCreateResponse response = reviewService.createReview(createRequest, null); - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); - verify(reviewRepository, times(1)).save(any(Review.class)); - } + // then + assertThat(response.getReviewId()).isEqualTo(1L); + assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); + verify(reviewCreateService).createReview(createRequest, null); } @Test @DisplayName("인증되지 않은 사용자가 리뷰를 생성하려 하면 예외가 발생한다") void createReviewWithUnauthenticatedUser() { // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - given(securityContext.getAuthentication()).willReturn(null); + given(reviewCreateService.createReview(createRequest, null)) + .willThrow(new BusinessException(null, "로그인이 필요합니다")); - // when & then - assertThatThrownBy(() -> reviewService.createReview(createRequest, null)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("로그인이 필요합니다"); - } + // when & then + assertThatThrownBy(() -> reviewService.createReview(createRequest, null)) + .isInstanceOf(BusinessException.class) + .hasMessageContaining("로그인이 필요합니다"); + verify(reviewCreateService).createReview(createRequest, null); } @Test @DisplayName("상품별 리뷰 목록을 성공적으로 조회할 수 있다") void getProductReviewsSuccessfully() { // given - List reviews = List.of(testReview); - Page reviewPage = new PageImpl<>(reviews, PageRequest.of(0, 20), 1); - - given(reviewRepository.findActiveReviewsByProductId(1L, PageRequest.of(0, 20))) - .willReturn(reviewPage); - given(reviewRepository.findAverageRatingByProductId(1L)).willReturn(4.5); - given(reviewRepository.countActiveReviewsByProductId(1L)).willReturn(10L); + ReviewListResponse expectedResponse = ReviewListResponse.builder() + .reviews(List.of()) + .totalElements(1L) + .averageRating(4.5) + .totalReviews(10L) + .build(); + + given(reviewReadService.getProductReviews(1L, 0, 20, "latest")).willReturn(expectedResponse); // when ReviewListResponse response = reviewService.getProductReviews(1L, 0, 20, "latest"); // then - assertThat(response.getReviews()).hasSize(1); assertThat(response.getTotalElements()).isEqualTo(1L); assertThat(response.getAverageRating()).isEqualTo(4.5); assertThat(response.getTotalReviews()).isEqualTo(10L); + verify(reviewReadService).getProductReviews(1L, 0, 20, "latest"); } @Test @DisplayName("리뷰 상세 정보를 성공적으로 조회할 수 있다") void getReviewSuccessfully() { // given - given(reviewRepository.findByIdWithUserProfile(1L)).willReturn(Optional.of(testReview)); + ReviewResponse expectedResponse = ReviewResponse.builder() + .reviewId(1L) + .title("좋은 신발입니다") + .rating(5) + .userName("테스트사용자") + .build(); + + given(reviewReadService.getReview(1L)).willReturn(expectedResponse); // when ReviewResponse response = reviewService.getReview(1L); @@ -256,417 +139,52 @@ void getReviewSuccessfully() { assertThat(response.getTitle()).isEqualTo("좋은 신발입니다"); assertThat(response.getRating()).isEqualTo(5); assertThat(response.getUserName()).isEqualTo("테스트사용자"); + verify(reviewReadService).getReview(1L); } @Test @DisplayName("존재하지 않는 리뷰를 조회하면 예외가 발생한다") void getReviewNotFound() { // given - given(reviewRepository.findByIdWithUserProfile(999L)).willReturn(Optional.empty()); + given(reviewReadService.getReview(999L)) + .willThrow(new ReviewNotFoundException("리뷰를 찾을 수 없습니다")); // when & then assertThatThrownBy(() -> reviewService.getReview(999L)) .isInstanceOf(ReviewNotFoundException.class) .hasMessageContaining("리뷰를 찾을 수 없습니다"); + verify(reviewReadService).getReview(999L); } @Test - @DisplayName("사용자가 존재하지 않으면 예외가 발생한다") - void createReviewWithNonExistentUser() { - // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.empty()); - - // when & then - assertThatThrownBy(() -> reviewService.createReview(createRequest, null)) - .isInstanceOf(BusinessException.class); - } - } - - @Test - @DisplayName("상품이 존재하지 않으면 예외가 발생한다") - void createReviewWithNonExistentProduct() { + @DisplayName("리뷰 수정 권한을 확인할 수 있다") + void canUpdateReview() { // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.empty()); - - // when & then - assertThatThrownBy(() -> reviewService.createReview(createRequest, null)) - .isInstanceOf(EntityNotFoundException.class) - .hasMessageContaining("상품을 찾을 수 없습니다"); - } - } - - @Test - @DisplayName("평균 평점이 null인 경우 0.0을 반환한다") - void getProductReviewsWithNullAverageRating() { - // given - List reviews = List.of(testReview); - Page reviewPage = new PageImpl<>(reviews, PageRequest.of(0, 20), 1); - - given(reviewRepository.findActiveReviewsByProductId(1L, PageRequest.of(0, 20))) - .willReturn(reviewPage); - given(reviewRepository.findAverageRatingByProductId(1L)).willReturn(null); - given(reviewRepository.countActiveReviewsByProductId(1L)).willReturn(10L); + given(reviewReadService.canUpdateReview(1L, 1L)).willReturn(true); + given(reviewReadService.canUpdateReview(1L, 2L)).willReturn(false); // when - ReviewListResponse response = reviewService.getProductReviews(1L, 0, 20, "latest"); + boolean canUpdate = reviewService.canUpdateReview(1L, 1L); + boolean cannotUpdate = reviewService.canUpdateReview(1L, 2L); // then - assertThat(response.getAverageRating()).isEqualTo(0.0); - } - - @Test - @DisplayName("이미 리뷰를 작성한 상품에 중복 리뷰를 작성하면 예외가 발생한다") - void createDuplicateReview() { - // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); - - // 중복 검증에서 예외 발생하도록 설정 - doThrow(new DuplicateReviewException(1L)) - .when(duplicationValidator).validateNoDuplicateActiveReview(1L, 1L); - - // when & then - assertThatThrownBy(() -> reviewService.createReview(createRequest, null)) - .isInstanceOf(DuplicateReviewException.class) - .hasMessageContaining("상품 ID 1에 대한 리뷰를 이미 작성하셨습니다"); - - verify(duplicationValidator, times(1)).validateNoDuplicateActiveReview(1L, 1L); - } - } - - @Test - @DisplayName("중복 리뷰가 없으면 정상적으로 리뷰를 생성할 수 있다") - void createReviewWithNoDuplicate() { - // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - doNothing().when(purchaseVerificationService).validateUserPurchasedProduct(any(User.class), any(Long.class)); - doNothing().when(userLevelService).recordActivity(anyLong(), any(), anyString(), any(), anyString()); - - // 중복 검증 통과하도록 설정 (예외 발생 안함) - doNothing().when(duplicationValidator).validateNoDuplicateActiveReview(1L, 1L); - - // when - ReviewCreateResponse response = reviewService.createReview(createRequest, null); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); - verify(duplicationValidator, times(1)).validateNoDuplicateActiveReview(1L, 1L); - verify(reviewRepository, times(1)).save(any(Review.class)); - } - } - - @Test - @DisplayName("이미지와 함께 리뷰를 성공적으로 생성할 수 있다") - void createReviewWithImages() { - // given - MultipartFile imageFile = mock(MultipartFile.class); - List imageFiles = List.of(imageFile); - - UploadResult mockResult = mock(UploadResult.class); - given(mockResult.getOriginalFilename()).willReturn("image.jpg"); - given(mockResult.getStoredFilename()).willReturn("uuid-image.jpg"); - given(mockResult.getFilePath()).willReturn("reviews/uuid-image.jpg"); - given(mockResult.getFileSize()).willReturn(12345L); - given(mockResult.getContentType()).willReturn("image/jpeg"); - - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - doNothing().when(purchaseVerificationService).validateUserPurchasedProduct(any(User.class), any(Long.class)); - doNothing().when(userLevelService).recordActivity(anyLong(), any(), anyString(), any(), anyString()); - given(gcpStorageService.uploadFilesWithDetails(any(List.class), eq(UploadDirectory.REVIEWS))) - .willReturn(List.of(mockResult)); - - // ReviewImage Mock 설정 - com.cMall.feedShop.review.domain.ReviewImage mockReviewImage = mock(com.cMall.feedShop.review.domain.ReviewImage.class); - given(mockReviewImage.getReviewImageId()).willReturn(1L); - given(reviewImageRepository.save(any(com.cMall.feedShop.review.domain.ReviewImage.class))).willReturn(mockReviewImage); - - // when - ReviewCreateResponse response = reviewService.createReview(createRequest, imageFiles); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 등록되었습니다."); - verify(reviewRepository, times(1)).save(any(Review.class)); - verify(gcpStorageService, times(1)).uploadFilesWithDetails(any(List.class), eq(UploadDirectory.REVIEWS)); - } + assertThat(canUpdate).isTrue(); + assertThat(cannotUpdate).isFalse(); + verify(reviewReadService).canUpdateReview(1L, 1L); + verify(reviewReadService).canUpdateReview(1L, 2L); } @Test - @DisplayName("이미지 없이 리뷰를 생성할 수 있다") - void createReviewWithoutImages() { + @DisplayName("사용자 삭제된 리뷰 개수를 조회할 수 있다") + void getUserDeletedReviewCount() { // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - doNothing().when(purchaseVerificationService).validateUserPurchasedProduct(any(User.class), any(Long.class)); - doNothing().when(userLevelService).recordActivity(anyLong(), any(), anyString(), any(), anyString()); - - // when - ReviewCreateResponse response = reviewService.createReview(createRequest, null); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - verify(reviewRepository, times(1)).save(any(Review.class)); - verify(reviewImageService, never()).saveReviewImages(any(), any()); - } - } - - @Test - @DisplayName("리뷰 상세 조회 시 이미지 정보가 포함된다") - void getReviewWithImages() { - // given - given(reviewRepository.findByIdWithUserProfile(1L)).willReturn(Optional.of(testReview)); - - ReviewImageResponse imageResponse = ReviewImageResponse.builder() - .reviewImageId(1L) - .originalFilename("test-image.jpg") - .imageUrl("http://localhost:8080/uploads/reviews/test-image.jpg") - .imageOrder(1) - .fileSize(1024L) - .build(); - - given(reviewImageService.getReviewImages(1L)).willReturn(List.of(imageResponse)); - - // when - ReviewResponse response = reviewService.getReview(1L); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.isHasImages()).isTrue(); - assertThat(response.getImages()).hasSize(1); - assertThat(response.getImages().get(0).getOriginalFilename()).isEqualTo("test-image.jpg"); - verify(reviewImageService, times(1)).getReviewImages(1L); - } - - @Test - @DisplayName("상품 리뷰 목록 조회 시 이미지 정보가 포함된다") - void getProductReviewsWithImages() { - // given - List reviews = List.of(testReview); - Page reviewPage = new PageImpl<>(reviews, PageRequest.of(0, 20), 1); - - given(reviewRepository.findActiveReviewsByProductId(1L, PageRequest.of(0, 20))) - .willReturn(reviewPage); - given(reviewRepository.findAverageRatingByProductId(1L)).willReturn(4.5); - given(reviewRepository.countActiveReviewsByProductId(1L)).willReturn(10L); - - ReviewImageResponse imageResponse = ReviewImageResponse.builder() - .reviewImageId(1L) - .originalFilename("test-image.jpg") - .imageUrl("http://localhost:8080/uploads/reviews/test-image.jpg") - .imageOrder(1) - .fileSize(1024L) - .build(); - - given(reviewImageService.getReviewImages(1L)).willReturn(List.of(imageResponse)); - - // when - ReviewListResponse response = reviewService.getProductReviews(1L, 0, 20, "latest"); - - // then - assertThat(response.getReviews()).hasSize(1); - ReviewResponse reviewResponse = response.getReviews().get(0); - assertThat(reviewResponse.isHasImages()).isTrue(); - assertThat(reviewResponse.getImages()).hasSize(1); - verify(reviewImageService, times(1)).getReviewImages(1L); - } - - @Test - @DisplayName("빈 이미지 리스트로 리뷰를 생성할 수 있다") - void createReviewWithEmptyImageList() { - // given - List emptyImageList = List.of(); - - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - doNothing().when(purchaseVerificationService).validateUserPurchasedProduct(any(User.class), any(Long.class)); - doNothing().when(userLevelService).recordActivity(anyLong(), any(), anyString(), any(), anyString()); - - // when - ReviewCreateResponse response = reviewService.createReview(createRequest, emptyImageList); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - verify(reviewRepository, times(1)).save(any(Review.class)); - verify(reviewImageService, never()).saveReviewImages(any(), any()); - } - } - - @Test - @DisplayName("이미지가 없는 리뷰 상세 조회") - void getReviewWithoutImages() { - // given - given(reviewRepository.findByIdWithUserProfile(1L)).willReturn(Optional.of(testReview)); - given(reviewImageService.getReviewImages(1L)).willReturn(List.of()); // 빈 이미지 리스트 + given(reviewReadService.getUserDeletedReviewCount(1L)).willReturn(5L); // when - ReviewResponse response = reviewService.getReview(1L); + Long count = reviewService.getUserDeletedReviewCount(1L); // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.isHasImages()).isFalse(); - assertThat(response.getImages()).isEmpty(); - verify(reviewImageService, times(1)).getReviewImages(1L); - } - - @Test - @DisplayName("불변 DTO의 필드 값이 올바르게 Review 엔티티에 전달된다") - void immutableDtoFieldsTransferCorrectly() { - // given - try (MockedStatic mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class)) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - mockSecurityContext(); - given(userRepository.findByEmail("test@test.com")).willReturn(Optional.of(testUser)); - given(productRepository.findById(1L)).willReturn(Optional.of(testProduct)); - given(reviewRepository.save(any(Review.class))).willAnswer(invocation -> { - Review savedReview = invocation.getArgument(0); - // DTO의 값들이 올바르게 전달되었는지 검증 - assertThat(savedReview.getTitle()).isEqualTo(createRequest.getTitle()); - assertThat(savedReview.getRating()).isEqualTo(createRequest.getRating()); - assertThat(savedReview.getSizeFit()).isEqualTo(createRequest.getSizeFit()); - assertThat(savedReview.getCushion()).isEqualTo(createRequest.getCushion()); - assertThat(savedReview.getStability()).isEqualTo(createRequest.getStability()); - assertThat(savedReview.getContent()).isEqualTo(createRequest.getContent()); - return testReview; - }); - doNothing().when(purchaseVerificationService).validateUserPurchasedProduct(any(User.class), any(Long.class)); - doNothing().when(userLevelService).recordActivity(anyLong(), any(), anyString(), any(), anyString()); - - // when - reviewService.createReview(createRequest, null); - - // then - verify(reviewRepository, times(1)).save(any(Review.class)); - } - } - - private void mockSecurityContext() { - given(securityContext.getAuthentication()).willReturn(authentication); - given(authentication.isAuthenticated()).willReturn(true); - given(authentication.getName()).willReturn("test@test.com"); - given(authentication.getPrincipal()).willReturn("test@test.com"); // String으로 설정하면 getName()이 호출됨 - } - - @Test - @DisplayName("리뷰 조회 시 사용자 신체 정보가 포함된다") - void getReviewWithUserBodyInfo() { - // given - Long reviewId = 1L; - given(reviewRepository.findByIdWithUserProfile(reviewId)) - .willReturn(Optional.of(testReview)); - given(reviewImageService.getReviewImages(reviewId)) - .willReturn(List.of()); - - // when - ReviewResponse response = reviewService.getReview(reviewId); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getUserId()).isEqualTo(1L); - assertThat(response.getUserName()).isEqualTo("테스트사용자"); - assertThat(response.getUserHeight()).isEqualTo(175); - assertThat(response.getUserWeight()).isEqualTo(70); - assertThat(response.getUserFootSize()).isEqualTo(270); - assertThat(response.getUserFootWidth()).isEqualTo("NORMAL"); - - verify(reviewRepository, times(1)).findByIdWithUserProfile(reviewId); - verify(reviewImageService, times(1)).getReviewImages(reviewId); - } - - @Test - @DisplayName("리뷰 목록 조회 시 모든 리뷰에 사용자 신체 정보가 포함된다") - void getProductReviewsWithUserBodyInfo() { - // given - List reviews = List.of(testReview); - Page reviewPage = new PageImpl<>(reviews, PageRequest.of(0, 20), 1); - - given(reviewRepository.findActiveReviewsByProductId(1L, PageRequest.of(0, 20))) - .willReturn(reviewPage); - given(reviewRepository.findAverageRatingByProductId(1L)).willReturn(4.5); - given(reviewRepository.countActiveReviewsByProductId(1L)).willReturn(1L); - given(reviewImageService.getReviewImages(1L)).willReturn(List.of()); - - // when - ReviewListResponse response = reviewService.getProductReviews(1L, 0, 20, "latest"); - - // then - assertThat(response.getReviews()).hasSize(1); - ReviewResponse reviewResponse = response.getReviews().get(0); - - // 기본 리뷰 정보 검증 - assertThat(reviewResponse.getReviewId()).isEqualTo(1L); - assertThat(reviewResponse.getUserId()).isEqualTo(1L); - assertThat(reviewResponse.getUserName()).isEqualTo("테스트사용자"); - - // 사용자 신체 정보 검증 - assertThat(reviewResponse.getUserHeight()).isEqualTo(175); - assertThat(reviewResponse.getUserWeight()).isEqualTo(70); - assertThat(reviewResponse.getUserFootSize()).isEqualTo(270); - assertThat(reviewResponse.getUserFootWidth()).isEqualTo("NORMAL"); - - verify(reviewRepository, times(1)).findActiveReviewsByProductId(1L, PageRequest.of(0, 20)); - } - - @Test - @DisplayName("사용자 프로필이 없는 경우에도 리뷰 조회가 정상 작동한다") - void getReviewWithoutUserProfile() { - // given - User userWithoutProfile = new User(2L, "noProfile@test.com", "password", "noProfile@test.com", UserRole.USER); - Review reviewWithoutProfile = Review.builder() - .title("프로필 없는 사용자 리뷰") - .rating(4) - .sizeFit(SizeFit.NORMAL) - .cushion(Cushion.SOFT) - .stability(Stability.STABLE) - .content("좋네요") - .user(userWithoutProfile) - .product(testProduct) - .build(); - - Long reviewId = 2L; - given(reviewRepository.findByIdWithUserProfile(reviewId)) - .willReturn(Optional.of(reviewWithoutProfile)); - given(reviewImageService.getReviewImages(reviewId)) - .willReturn(List.of()); - - // when - ReviewResponse response = reviewService.getReview(reviewId); - - // then - assertThat(response.getUserName()).isEqualTo("익명"); - assertThat(response.getUserHeight()).isNull(); - assertThat(response.getUserWeight()).isNull(); - assertThat(response.getUserFootSize()).isNull(); - assertThat(response.getUserFootWidth()).isNull(); - - verify(reviewRepository, times(1)).findByIdWithUserProfile(reviewId); + assertThat(count).isEqualTo(5L); + verify(reviewReadService).getUserDeletedReviewCount(1L); } } \ No newline at end of file diff --git a/src/test/java/com/cMall/feedShop/review/application/service/ReviewUpdateServiceTest.java b/src/test/java/com/cMall/feedShop/review/application/service/ReviewUpdateServiceTest.java index 36a64aac3..e54813c49 100644 --- a/src/test/java/com/cMall/feedShop/review/application/service/ReviewUpdateServiceTest.java +++ b/src/test/java/com/cMall/feedShop/review/application/service/ReviewUpdateServiceTest.java @@ -2,11 +2,13 @@ import com.cMall.feedShop.common.dto.UploadResult; import com.cMall.feedShop.common.exception.BusinessException; -import com.cMall.feedShop.common.storage.GcpStorageService; +import com.cMall.feedShop.common.exception.ErrorCode; +import com.cMall.feedShop.common.storage.StorageService; import com.cMall.feedShop.common.storage.UploadDirectory; import com.cMall.feedShop.review.application.dto.request.ReviewUpdateRequest; import com.cMall.feedShop.review.application.dto.response.ReviewUpdateResponse; import com.cMall.feedShop.review.domain.Review; +import com.cMall.feedShop.review.domain.ReviewImage; import com.cMall.feedShop.review.domain.enums.Cushion; import com.cMall.feedShop.review.domain.enums.SizeFit; import com.cMall.feedShop.review.domain.enums.Stability; @@ -14,257 +16,237 @@ import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; import com.cMall.feedShop.review.domain.repository.ReviewImageRepository; import com.cMall.feedShop.review.domain.repository.ReviewRepository; +import com.cMall.feedShop.product.domain.model.Product; +import com.cMall.feedShop.product.domain.model.Category; +import com.cMall.feedShop.product.domain.enums.CategoryType; +import com.cMall.feedShop.store.domain.model.Store; import com.cMall.feedShop.user.domain.enums.UserRole; import com.cMall.feedShop.user.domain.model.User; import com.cMall.feedShop.user.domain.repository.UserRepository; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.MockedStatic; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.test.context.ActiveProfiles; import org.springframework.web.multipart.MultipartFile; +import java.math.BigDecimal; +import java.util.Arrays; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.*; -/** - * 🔍 초보자 설명: - * 이 테스트는 리뷰 수정 기능이 올바르게 동작하는지 확인합니다. - * - 권한 검증 (본인이 작성한 리뷰만 수정 가능) - * - 데이터 검증 (올바른 데이터로 수정되는지) - * - 예외 상황 처리 (존재하지 않는 리뷰, 권한 없음 등) - */ +@ActiveProfiles("test") @ExtendWith(MockitoExtension.class) -@DisplayName("ReviewService 수정 기능 테스트") +@DisplayName("ReviewUpdateService 수정 기능 테스트") class ReviewUpdateServiceTest { @Mock private ReviewRepository reviewRepository; - + @Mock private UserRepository userRepository; - + @Mock private ReviewImageRepository reviewImageRepository; - + @Mock private ReviewImageService reviewImageService; - + @Mock - private GcpStorageService gcpStorageService; - + private StorageService gcpStorageService; + @Mock private SecurityContext securityContext; - + @Mock private Authentication authentication; + + @Mock + private UserDetails userDetails; @InjectMocks - private ReviewService reviewService; + private ReviewUpdateService reviewUpdateService; - private MockedStatic mockedSecurityContextHolder; + private ReviewUpdateRequest updateRequest; private User testUser; - private User otherUser; private Review testReview; - private ReviewUpdateRequest updateRequest; + private Product testProduct; @BeforeEach void setUp() { - // SecurityContextHolder Mock을 전체 테스트 동안 유지 - mockedSecurityContextHolder = mockStatic(SecurityContextHolder.class); - - // 테스트용 사용자 생성 - testUser = new User("testLogin", "password", "test@test.com", UserRole.USER); - ReflectionTestUtils.setField(testUser, "id", 1L); - - otherUser = new User("otherLogin", "password", "other@test.com", UserRole.USER); - ReflectionTestUtils.setField(otherUser, "id", 2L); - - // 테스트용 리뷰 생성 (mockito spy 사용으로 실제 메서드 호출 가능) - testReview = spy(Review.builder() - .title("원본 제목") - .rating(4) - .sizeFit(SizeFit.NORMAL) - .cushion(Cushion.MEDIUM) - .stability(Stability.STABLE) - .content("원본 내용입니다.") - .user(testUser) - .product(mock()) - .build()); - ReflectionTestUtils.setField(testReview, "reviewId", 1L); - - // 수정 요청 데이터 생성 (불변 DTO) updateRequest = ReviewUpdateRequest.builder() .title("수정된 제목") - .rating(5) + .rating(4) .sizeFit(SizeFit.BIG) - .cushion(Cushion.SOFT) - .stability(Stability.VERY_STABLE) + .cushion(Cushion.MEDIUM) + .stability(Stability.STABLE) .content("수정된 내용입니다.") .deleteImageIds(List.of(1L, 2L)) .build(); - - // GCP Storage Service와 ReviewImageRepository 주입 - ReflectionTestUtils.setField(reviewService, "gcpStorageService", gcpStorageService); - ReflectionTestUtils.setField(reviewService, "reviewImageRepository", reviewImageRepository); - } - - @AfterEach - void tearDown() { - if (mockedSecurityContextHolder != null) { - mockedSecurityContextHolder.close(); + + testUser = new User(1L, "testuser", "password", "test@example.com", UserRole.USER); + + Store testStore = Store.builder() + .storeName("테스트 스토어") + .sellerId(1L) + .build(); + + Category testCategory = new Category(CategoryType.SNEAKERS, "운동화"); + + testProduct = Product.builder() + .name("테스트 신발") + .price(BigDecimal.valueOf(100000)) + .store(testStore) + .category(testCategory) + .description("테스트 설명") + .build(); + + // Reflection을 사용하여 productId 설정 + try { + java.lang.reflect.Field productIdField = Product.class.getDeclaredField("productId"); + productIdField.setAccessible(true); + productIdField.set(testProduct, 1L); + } catch (Exception e) { + throw new RuntimeException("Failed to set productId", e); + } + + testReview = Review.builder() + .title("원본 제목") + .rating(5) + .sizeFit(SizeFit.NORMAL) + .cushion(Cushion.SOFT) + .stability(Stability.STABLE) + .content("원본 내용") + .user(testUser) + .product(testProduct) + .build(); + + // Reflection을 사용하여 reviewId 설정 + try { + java.lang.reflect.Field reviewIdField = Review.class.getDeclaredField("reviewId"); + reviewIdField.setAccessible(true); + reviewIdField.set(testReview, 1L); + } catch (Exception e) { + throw new RuntimeException("Failed to set reviewId", e); } - SecurityContextHolder.clearContext(); } @Test - @DisplayName("본인이 작성한 리뷰를 성공적으로 수정할 수 있다") - void updateReview_Success() { + @DisplayName("이미지 없이 리뷰를 성공적으로 수정할 수 있다") + void updateReview_WithoutImages_Success() { // given - mockSecurityContextForUser(testUser); + mockSecurityContext(); given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); given(reviewRepository.save(any(Review.class))).willReturn(testReview); - given(reviewImageService.deleteSelectedImages(1L, List.of(1L, 2L))) - .willReturn(List.of(1L, 2L)); - given(reviewImageService.getActiveImageCount(1L)).willReturn(3); + given(reviewImageService.getActiveImageCount(1L)).willReturn(0); // when - ReviewUpdateResponse response = reviewService.updateReview(1L, updateRequest, null); + ReviewUpdateResponse response = reviewUpdateService.updateReview(1L, updateRequest, null); // then assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 수정되었습니다."); - assertThat(response.getDeletedImageIds()).containsExactly(1L, 2L); - assertThat(response.getTotalImageCount()).isEqualTo(3); - - // 실제로 리뷰 정보가 수정되었는지 확인 - verify(testReview).updateReviewInfo( - "수정된 제목", - 5, - "수정된 내용입니다.", - SizeFit.BIG, - Cushion.SOFT, - Stability.VERY_STABLE - ); + assertThat(response.getNewImageUrls()).isEmpty(); + assertThat(response.getDeletedImageIds()).isEmpty(); + assertThat(response.getTotalImageCount()).isEqualTo(0); + + verify(reviewRepository).findById(1L); verify(reviewRepository).save(testReview); + verify(reviewImageService).getActiveImageCount(1L); } @Test - @DisplayName("새로운 이미지와 함께 리뷰를 수정할 수 있다") - void updateReview_WithNewImages() { + @DisplayName("이미지와 함께 리뷰를 성공적으로 수정할 수 있다") + void updateReview_WithImages_Success() { // given - MultipartFile newImage = mock(MultipartFile.class); - List newImages = List.of(newImage); - - mockSecurityContextForUser(testUser); + mockSecurityContext(); given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); given(reviewRepository.save(any(Review.class))).willReturn(testReview); + + List newImages = Arrays.asList( + new MockMultipartFile("image1", "image1.jpg", "image/jpeg", "image1".getBytes()) + ); + + List deletedImageIds = Arrays.asList(1L, 2L); + + given(reviewImageService.deleteSelectedImages(1L, updateRequest.getDeleteImageIds())) + .willReturn(deletedImageIds); + given(reviewImageService.getActiveImageCount(1L)).willReturn(1); - // deleteImageIds Mock 설정 - given(reviewImageService.deleteSelectedImages(eq(1L), eq(List.of(1L, 2L)))) - .willReturn(List.of(1L, 2L)); - - // GCP Storage 응답 모킹 - 완전한 Mock 설정 - UploadResult uploadResult = mock(UploadResult.class); - given(uploadResult.getFilePath()).willReturn("reviews/new-image.jpg"); - given(uploadResult.getOriginalFilename()).willReturn("new-image.jpg"); - given(uploadResult.getStoredFilename()).willReturn("uuid-new-image.jpg"); - given(uploadResult.getFileSize()).willReturn(1024L); - given(uploadResult.getContentType()).willReturn("image/jpeg"); - - given(gcpStorageService.uploadFilesWithDetails(newImages, UploadDirectory.REVIEWS)) - .willReturn(List.of(uploadResult)); - - // ReviewImageRepository.save() Mock - 실제 ReviewImage 타입 반환 - given(reviewImageRepository.save(any())).willAnswer(invocation -> { - // save 호출 시 전달된 객체를 그대로 반환 (실제 동작과 유사) - return invocation.getArgument(0); - }); - - given(reviewImageService.getActiveImageCount(1L)).willReturn(4); - - // when - ReviewUpdateResponse response = reviewService.updateReview(1L, updateRequest, newImages); + // when - GCP Storage가 없는 환경에서 테스트 (로컬 저장 방식 사용) + ReviewUpdateResponse response = reviewUpdateService.updateReview(1L, updateRequest, newImages); // then assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getNewImageUrls()).containsExactly("reviews/new-image.jpg"); - assertThat(response.getDeletedImageIds()).containsExactly(1L, 2L); - assertThat(response.getTotalImageCount()).isEqualTo(4); - - // Mock 호출 검증 - verify(gcpStorageService).uploadFilesWithDetails(newImages, UploadDirectory.REVIEWS); - verify(reviewImageRepository).save(any()); - verify(reviewImageService).deleteSelectedImages(1L, List.of(1L, 2L)); + assertThat(response.getDeletedImageIds()).hasSize(2); + assertThat(response.getTotalImageCount()).isEqualTo(1); + + verify(reviewRepository).findById(1L); + verify(reviewRepository).save(testReview); + verify(reviewImageService).deleteSelectedImages(1L, updateRequest.getDeleteImageIds()); verify(reviewImageService).getActiveImageCount(1L); } @Test - @DisplayName("존재하지 않는 리뷰를 수정하려 하면 예외가 발생한다") - void updateReview_ReviewNotFound() { + @DisplayName("존재하지 않는 리뷰 수정 시 예외가 발생한다") + void updateReview_ReviewNotFound_ThrowsException() { // given - mockSecurityContextForUser(testUser); + mockSecurityContext(); given(reviewRepository.findById(999L)).willReturn(Optional.empty()); // when & then - assertThatThrownBy(() -> reviewService.updateReview(999L, updateRequest, null)) + assertThatThrownBy(() -> reviewUpdateService.updateReview(999L, updateRequest, null)) .isInstanceOf(ReviewNotFoundException.class) - .hasMessageContaining("999에 해당하는 리뷰를 찾을 수 없습니다"); + .hasMessageContaining("ID 999에 해당하는 리뷰를 찾을 수 없습니다"); + + verify(reviewRepository, never()).save(any(Review.class)); } @Test - @DisplayName("다른 사용자의 리뷰를 수정하려 하면 권한 예외가 발생한다") - void updateReview_AccessDenied() { + @DisplayName("다른 사용자의 리뷰 수정 시 예외가 발생한다") + void updateReview_AccessDenied_ThrowsException() { // given - mockSecurityContextForUser(otherUser); // 다른 사용자로 로그인 + User otherUser = new User(2L, "otheruser", "password", "other@example.com", UserRole.USER); + mockSecurityContextForUser(otherUser); + given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); // when & then - assertThatThrownBy(() -> reviewService.updateReview(1L, updateRequest, null)) + assertThatThrownBy(() -> reviewUpdateService.updateReview(1L, updateRequest, null)) .isInstanceOf(ReviewAccessDeniedException.class) .hasMessageContaining("본인이 작성한 리뷰만 수정할 수 있습니다"); - } - - @Test - @DisplayName("로그인하지 않은 상태에서 리뷰를 수정하려 하면 예외가 발생한다") - void updateReview_Unauthenticated() { - // given - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); - given(securityContext.getAuthentication()).willReturn(null); - - // when & then - assertThatThrownBy(() -> reviewService.updateReview(1L, updateRequest, null)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("로그인이 필요합니다"); + + verify(reviewRepository, never()).save(any(Review.class)); } @Test @DisplayName("리뷰 제목만 수정할 수 있다") void updateReviewTitle_Success() { // given - mockSecurityContextForUser(testUser); + String newTitle = "새로운 제목"; + mockSecurityContext(); given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); given(reviewRepository.save(any(Review.class))).willReturn(testReview); // when - reviewService.updateReviewTitle(1L, "새로운 제목"); + reviewUpdateService.updateReviewTitle(1L, newTitle); // then - verify(testReview).updateTitle("새로운 제목"); + verify(reviewRepository).findById(1L); verify(reviewRepository).save(testReview); } @@ -272,15 +254,16 @@ void updateReviewTitle_Success() { @DisplayName("리뷰 평점만 수정할 수 있다") void updateReviewRating_Success() { // given - mockSecurityContextForUser(testUser); + Integer newRating = 3; + mockSecurityContext(); given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); given(reviewRepository.save(any(Review.class))).willReturn(testReview); // when - reviewService.updateReviewRating(1L, 5); + reviewUpdateService.updateReviewRating(1L, newRating); // then - verify(testReview).updateRating(5); + verify(reviewRepository).findById(1L); verify(reviewRepository).save(testReview); } @@ -288,288 +271,89 @@ void updateReviewRating_Success() { @DisplayName("리뷰 내용만 수정할 수 있다") void updateReviewContent_Success() { // given - mockSecurityContextForUser(testUser); + String newContent = "새로운 내용입니다."; + mockSecurityContext(); given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); given(reviewRepository.save(any(Review.class))).willReturn(testReview); // when - reviewService.updateReviewContent(1L, "새로운 내용"); + reviewUpdateService.updateReviewContent(1L, newContent); // then - verify(testReview).updateContent("새로운 내용"); + verify(reviewRepository).findById(1L); verify(reviewRepository).save(testReview); } @Test - @DisplayName("이미지 업로드 실패 시에도 리뷰 텍스트 수정은 완료된다") - void updateReview_ImageUploadFailure() { + @DisplayName("이미지 없이 리뷰를 간단히 수정할 수 있다") + void updateReviewSimple_Success() { // given - MultipartFile newImage = mock(MultipartFile.class); - List newImages = List.of(newImage); - - mockSecurityContextForUser(testUser); + mockSecurityContext(); given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); given(reviewRepository.save(any(Review.class))).willReturn(testReview); - - // 빈 deleteImageIds로 설정하여 deleteSelectedImages 호출 방지 - ReviewUpdateRequest requestNoDelete = ReviewUpdateRequest.builder() - .title("수정된 제목") - .rating(5) - .sizeFit(SizeFit.BIG) - .cushion(Cushion.SOFT) - .stability(Stability.VERY_STABLE) - .content("수정된 내용입니다.") - .deleteImageIds(List.of()) // 빈 리스트 - .build(); - given(reviewImageService.getActiveImageCount(1L)).willReturn(0); - // 이미지 업로드 실패 시뮬레이션 - given(gcpStorageService.uploadFilesWithDetails(newImages, UploadDirectory.REVIEWS)) - .willThrow(new RuntimeException("이미지 업로드 실패")); - // when - ReviewUpdateResponse response = reviewService.updateReview(1L, requestNoDelete, newImages); + reviewUpdateService.updateReviewSimple(1L, updateRequest); // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getNewImageUrls()).isEmpty(); // 이미지 업로드 실패로 빈 리스트 - - // 리뷰 정보는 정상적으로 수정되어야 함 - verify(testReview).updateReviewInfo(any(), any(), any(), any(), any(), any()); + verify(reviewRepository).findById(1L); verify(reviewRepository).save(testReview); } @Test - @DisplayName("리뷰 수정 권한을 확인할 수 있다") - void canUpdateReview() { - // given - given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); - - // when - boolean canUpdate = reviewService.canUpdateReview(1L, testUser.getId()); - boolean cannotUpdate = reviewService.canUpdateReview(1L, otherUser.getId()); - - // then - assertThat(canUpdate).isTrue(); - assertThat(cannotUpdate).isFalse(); - } - - @Test - @DisplayName("존재하지 않는 리뷰의 수정 권한 확인 시 false를 반환한다") - void canUpdateReview_ReviewNotFound() { + @DisplayName("인증되지 않은 사용자가 리뷰 수정 시 예외가 발생한다") + void updateReview_UnauthenticatedUser_ThrowsException() { // given - given(reviewRepository.findById(999L)).willReturn(Optional.empty()); - - // when - boolean canUpdate = reviewService.canUpdateReview(999L, testUser.getId()); - - // then - assertThat(canUpdate).isFalse(); - } - - // =================== 새로운 테스트 케이스들 =================== - - @Test - @DisplayName("빈 deleteImageIds를 가진 요청도 정상 처리된다") - void updateReview_WithEmptyDeleteImageIds() { - // given - mockSecurityContextForUser(testUser); - given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - - // ✅ 실제 ReviewService 로직: 빈 리스트일 때는 deleteSelectedImages 호출하지 않음 - // 대신 getActiveImageCount만 호출됨 (287라인) - given(reviewImageService.getActiveImageCount(1L)).willReturn(2); - - // 빈 deleteImageIds를 가진 요청 생성 - ReviewUpdateRequest requestWithEmptyDeleteIds = ReviewUpdateRequest.builder() - .title("수정된 제목") - .rating(5) - .sizeFit(SizeFit.BIG) - .cushion(Cushion.SOFT) - .stability(Stability.VERY_STABLE) - .content("수정된 내용입니다.") - .deleteImageIds(List.of()) // 빈 리스트 - .build(); - - // when - ReviewUpdateResponse response = reviewService.updateReview(1L, requestWithEmptyDeleteIds, null); + SecurityContextHolder.setContext(securityContext); + given(securityContext.getAuthentication()).willReturn(null); - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 수정되었습니다."); - assertThat(response.getDeletedImageIds()).isEmpty(); // 빈 리스트 반환 - assertThat(response.getTotalImageCount()).isEqualTo(2); - - // ✅ 핵심: 빈 리스트일 때는 deleteSelectedImages가 호출되지 않음 - // 실제 로직: if (request.getDeleteImageIds() != null && !request.getDeleteImageIds().isEmpty()) - verify(reviewImageService, never()).deleteSelectedImages(any(), any()); - - // 실제로 호출되는 메서드들만 검증 - verify(reviewImageService, times(1)).getActiveImageCount(1L); - verify(testReview).updateReviewInfo( - "수정된 제목", - 5, - "수정된 내용입니다.", - SizeFit.BIG, - Cushion.SOFT, - Stability.VERY_STABLE - ); - verify(reviewRepository).save(testReview); + // when & then + assertThatThrownBy(() -> reviewUpdateService.updateReview(1L, updateRequest, null)) + .isInstanceOf(BusinessException.class); + + verify(reviewRepository, never()).findById(anyLong()); } @Test - @DisplayName("null deleteImageIds를 가진 요청도 정상 처리된다") - void updateReview_WithNullDeleteImageIds() { + @DisplayName("GCP Storage 없이도 로컬 이미지 처리가 정상 작동한다") + void updateReview_WithoutGcpStorage_LocalImageProcessing() { // given - mockSecurityContextForUser(testUser); + mockSecurityContext(); given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); given(reviewRepository.save(any(Review.class))).willReturn(testReview); - given(reviewImageService.getActiveImageCount(1L)).willReturn(3); - - // null deleteImageIds를 가진 요청 생성 - ReviewUpdateRequest requestWithNullDeleteIds = ReviewUpdateRequest.builder() - .title("수정된 제목") - .rating(4) - .sizeFit(SizeFit.NORMAL) - .cushion(Cushion.MEDIUM) - .stability(Stability.STABLE) - .content("수정된 내용입니다.") - .deleteImageIds(null) // null - .build(); - - // when - ReviewUpdateResponse response = reviewService.updateReview(1L, requestWithNullDeleteIds, null); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getMessage()).isEqualTo("리뷰가 성공적으로 수정되었습니다."); - assertThat(response.getDeletedImageIds()).isEmpty(); // 빈 리스트 반환 - assertThat(response.getTotalImageCount()).isEqualTo(3); - - // ✅ null일 때도 deleteSelectedImages가 호출되지 않음 - verify(reviewImageService, never()).deleteSelectedImages(any(), any()); - - // 실제로 호출되는 메서드들만 검증 - verify(reviewImageService, times(1)).getActiveImageCount(1L); - verify(testReview).updateReviewInfo( - "수정된 제목", - 4, - "수정된 내용입니다.", - SizeFit.NORMAL, - Cushion.MEDIUM, - Stability.STABLE + + List newImages = Arrays.asList( + new MockMultipartFile("image1", "image1.jpg", "image/jpeg", "image1".getBytes()) ); - verify(reviewRepository).save(testReview); - } - - @Test - @DisplayName("실제 deleteImageIds가 있을 때만 deleteSelectedImages가 호출된다") - void updateReview_WithActualDeleteImageIds() { - // given - mockSecurityContextForUser(testUser); - given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - - List deleteImageIds = List.of(1L, 2L); - given(reviewImageService.deleteSelectedImages(1L, deleteImageIds)) - .willReturn(List.of(1L, 2L)); + + // 로컬 이미지 저장이 성공한다고 가정 + given(reviewImageService.saveReviewImages(testReview, newImages)).willReturn(Arrays.asList()); given(reviewImageService.getActiveImageCount(1L)).willReturn(1); - ReviewUpdateRequest requestWithDeleteIds = ReviewUpdateRequest.builder() - .title("수정된 제목") - .rating(3) - .sizeFit(SizeFit.SMALL) - .cushion(Cushion.FIRM) - .stability(Stability.UNSTABLE) - .content("수정된 내용입니다.") - .deleteImageIds(deleteImageIds) // 실제 값 - .build(); - - // when - ReviewUpdateResponse response = reviewService.updateReview(1L, requestWithDeleteIds, null); + // when - GCP Storage 없이 로컬 처리만 수행 + ReviewUpdateResponse response = reviewUpdateService.updateReview(1L, updateRequest, newImages); - // then + // then - 로컬 이미지 처리가 정상적으로 수행됨 assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getDeletedImageIds()).containsExactly(1L, 2L); assertThat(response.getTotalImageCount()).isEqualTo(1); - - // ✅ 이제 deleteSelectedImages가 호출되어야 함 - verify(reviewImageService, times(1)).deleteSelectedImages(1L, deleteImageIds); - verify(reviewImageService, times(1)).getActiveImageCount(1L); - verify(testReview).updateReviewInfo( - "수정된 제목", - 3, - "수정된 내용입니다.", - SizeFit.SMALL, - Cushion.FIRM, - Stability.UNSTABLE - ); + + verify(reviewRepository).findById(1L); verify(reviewRepository).save(testReview); + verify(reviewImageService).saveReviewImages(testReview, newImages); + verify(reviewImageService).getActiveImageCount(1L); } - @Test - @DisplayName("새 이미지만 추가하는 경우 (삭제 없음)") - void updateReview_OnlyAddNewImages() { - // given - MultipartFile newImage = mock(MultipartFile.class); - List newImages = List.of(newImage); - + private void mockSecurityContext() { mockSecurityContextForUser(testUser); - given(reviewRepository.findById(1L)).willReturn(Optional.of(testReview)); - given(reviewRepository.save(any(Review.class))).willReturn(testReview); - given(reviewImageService.getActiveImageCount(1L)).willReturn(4); - - // GCP Storage 응답 모킹 - UploadResult uploadResult = mock(UploadResult.class); - given(uploadResult.getFilePath()).willReturn("reviews/new-image.jpg"); - given(uploadResult.getOriginalFilename()).willReturn("new-image.jpg"); - given(uploadResult.getStoredFilename()).willReturn("uuid-new-image.jpg"); - given(uploadResult.getFileSize()).willReturn(1024L); - given(uploadResult.getContentType()).willReturn("image/jpeg"); - - given(gcpStorageService.uploadFilesWithDetails(newImages, UploadDirectory.REVIEWS)) - .willReturn(List.of(uploadResult)); - given(reviewImageRepository.save(any())).willReturn(mock()); - - ReviewUpdateRequest request = ReviewUpdateRequest.builder() - .title("새 이미지 추가") - .rating(5) - .sizeFit(SizeFit.NORMAL) - .cushion(Cushion.MEDIUM) - .stability(Stability.STABLE) - .content("새 이미지를 추가했습니다.") - .deleteImageIds(null) // 삭제 없음 - .build(); - - // when - ReviewUpdateResponse response = reviewService.updateReview(1L, request, newImages); - - // then - assertThat(response.getReviewId()).isEqualTo(1L); - assertThat(response.getNewImageUrls()).containsExactly("reviews/new-image.jpg"); - assertThat(response.getDeletedImageIds()).isEmpty(); // 삭제 없음 - assertThat(response.getTotalImageCount()).isEqualTo(4); - - // deleteSelectedImages는 호출되지 않음 (null이므로) - verify(reviewImageService, never()).deleteSelectedImages(any(), any()); - verify(reviewImageService, times(1)).getActiveImageCount(1L); - - // 새 이미지 업로드는 호출됨 - verify(gcpStorageService).uploadFilesWithDetails(newImages, UploadDirectory.REVIEWS); - verify(reviewImageRepository).save(any()); } - /** - * SecurityContext 모킹 헬퍼 메서드 - MockedStatic을 전체 테스트에서 공유 - */ private void mockSecurityContextForUser(User user) { - mockedSecurityContextHolder.when(SecurityContextHolder::getContext).thenReturn(securityContext); + SecurityContextHolder.setContext(securityContext); given(securityContext.getAuthentication()).willReturn(authentication); given(authentication.isAuthenticated()).willReturn(true); - given(authentication.getName()).willReturn(user.getEmail()); - given(authentication.getPrincipal()).willReturn(user.getEmail()); + given(authentication.getPrincipal()).willReturn(userDetails); + given(userDetails.getUsername()).willReturn(user.getEmail()); given(userRepository.findByEmail(user.getEmail())).willReturn(Optional.of(user)); } } \ No newline at end of file diff --git a/src/test/java/com/cMall/feedShop/review/presentation/ReviewControllerTest.java b/src/test/java/com/cMall/feedShop/review/presentation/ReviewControllerTest.java new file mode 100644 index 000000000..3e727ad66 --- /dev/null +++ b/src/test/java/com/cMall/feedShop/review/presentation/ReviewControllerTest.java @@ -0,0 +1,421 @@ +package com.cMall.feedShop.review.presentation; + +import com.cMall.feedShop.common.dto.ApiResponse; +import com.cMall.feedShop.review.application.dto.response.Review3ElementStatisticsResponse; +import com.cMall.feedShop.review.application.dto.response.ReviewListResponse; +import com.cMall.feedShop.review.application.dto.response.ReviewResponse; +import com.cMall.feedShop.review.application.service.Review3ElementStatisticsService; +import com.cMall.feedShop.review.application.service.ReviewService; +import com.cMall.feedShop.review.domain.enums.Cushion; +import com.cMall.feedShop.review.domain.enums.SizeFit; +import com.cMall.feedShop.review.domain.enums.Stability; +import com.cMall.feedShop.review.domain.exception.ReviewNotFoundException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +@DisplayName("ReviewController 단위 테스트") +@ExtendWith(MockitoExtension.class) +class ReviewControllerTest { + + @Mock + private ReviewService reviewService; + + @Mock + private Review3ElementStatisticsService statisticsService; + + @InjectMocks + private ReviewController reviewController; + + private ObjectMapper objectMapper; + private ReviewResponse sampleReview; + private ReviewListResponse sampleReviewList; + private Review3ElementStatisticsResponse sampleStatistics; + + @BeforeEach + void setUp() { + objectMapper = new ObjectMapper(); + + // 샘플 리뷰 데이터 생성 + sampleReview = ReviewResponse.builder() + .reviewId(1L) + .productId(100L) + .userId(10L) + .userName("테스트유저") + .title("좋은 신발입니다") + .rating(5) + .content("편안하고 쿠션감이 좋습니다. 사이즈는 평소보다 조금 작게 나온 것 같아요.") + .sizeFit(SizeFit.SMALL) + .cushion(Cushion.SOFT) + .stability(Stability.STABLE) + .points(10) + .hasImages(false) + .images(Collections.emptyList()) + .createdAt(LocalDateTime.now()) + .updatedAt(LocalDateTime.now()) + .build(); + + // ReviewListResponse.of() 메서드 사용 + PageImpl reviewPage = new PageImpl<>(Arrays.asList(sampleReview), PageRequest.of(0, 20), 1); + sampleReviewList = ReviewListResponse.of(reviewPage, 4.5, 150L); + + sampleStatistics = Review3ElementStatisticsResponse.builder() + .totalReviews(100L) + .cushionStatistics(createCushionStats()) + .sizeFitStatistics(createSizeFitStats()) + .stabilityStatistics(createStabilityStats()) + .build(); + } + + private Review3ElementStatisticsResponse.SizeFitStatistics createSizeFitStats() { + Map distribution = new HashMap<>(); + distribution.put(SizeFit.SMALL, 30L); + distribution.put(SizeFit.NORMAL, 50L); + distribution.put(SizeFit.BIG, 20L); + + Map percentage = new HashMap<>(); + percentage.put(SizeFit.SMALL, 30.0); + percentage.put(SizeFit.NORMAL, 50.0); + percentage.put(SizeFit.BIG, 20.0); + + return Review3ElementStatisticsResponse.SizeFitStatistics.builder() + .distribution(distribution) + .percentage(percentage) + .mostSelected(SizeFit.NORMAL) + .averageScore(3.0) + .build(); + } + + private Review3ElementStatisticsResponse.CushionStatistics createCushionStats() { + Map distribution = new HashMap<>(); + distribution.put(Cushion.FIRM, 20L); + distribution.put(Cushion.MEDIUM, 40L); + distribution.put(Cushion.SOFT, 40L); + + Map percentage = new HashMap<>(); + percentage.put(Cushion.FIRM, 20.0); + percentage.put(Cushion.MEDIUM, 40.0); + percentage.put(Cushion.SOFT, 40.0); + + return Review3ElementStatisticsResponse.CushionStatistics.builder() + .distribution(distribution) + .percentage(percentage) + .mostSelected(Cushion.MEDIUM) + .averageScore(3.2) + .build(); + } + + private Review3ElementStatisticsResponse.StabilityStatistics createStabilityStats() { + Map distribution = new HashMap<>(); + distribution.put(Stability.UNSTABLE, 10L); + distribution.put(Stability.NORMAL, 30L); + distribution.put(Stability.STABLE, 60L); + + Map percentage = new HashMap<>(); + percentage.put(Stability.UNSTABLE, 10.0); + percentage.put(Stability.NORMAL, 30.0); + percentage.put(Stability.STABLE, 60.0); + + return Review3ElementStatisticsResponse.StabilityStatistics.builder() + .distribution(distribution) + .percentage(percentage) + .mostSelected(Stability.STABLE) + .averageScore(4.5) + .build(); + } + + @Nested + @DisplayName("상품별 리뷰 목록 조회 API") + class GetProductReviews { + + @Test + @DisplayName("성공 - 기본 파라미터로 리뷰 목록 조회") + void getProductReviews_Success_WithDefaultParams() { + // given + Long productId = 100L; + given(reviewService.getProductReviews(eq(productId), eq(0), eq(20), eq("latest"))) + .willReturn(sampleReviewList); + + // when + ApiResponse response = reviewController.getProductReviews(productId, 0, 20, "latest"); + + // then + assertThat(response.isSuccess()).isTrue(); + assertThat(response.getData().getReviews()).hasSize(1); + assertThat(response.getData().getReviews().get(0).getReviewId()).isEqualTo(1L); + assertThat(response.getData().getReviews().get(0).getTitle()).isEqualTo("좋은 신발입니다"); + assertThat(response.getData().getAverageRating()).isEqualTo(4.5); + assertThat(response.getData().getTotalReviews()).isEqualTo(150L); + + verify(reviewService).getProductReviews(productId, 0, 20, "latest"); + } + + @Test + @DisplayName("성공 - 커스텀 파라미터로 리뷰 목록 조회") + void getProductReviews_Success_WithCustomParams() { + // given + Long productId = 100L; + int page = 1, size = 10; + String sort = "points"; + given(reviewService.getProductReviews(eq(productId), eq(page), eq(size), eq(sort))) + .willReturn(sampleReviewList); + + // when + ApiResponse response = reviewController.getProductReviews(productId, page, size, sort); + + // then + assertThat(response.isSuccess()).isTrue(); + assertThat(response.getData().getReviews()).hasSize(1); + + verify(reviewService).getProductReviews(productId, page, size, sort); + } + + @Test + @DisplayName("성공 - 빈 리뷰 목록 반환") + void getProductReviews_Success_EmptyList() { + // given + Long productId = 999L; + PageImpl emptyPage = new PageImpl<>(Collections.emptyList(), PageRequest.of(0, 20), 0); + ReviewListResponse emptyResponse = ReviewListResponse.of(emptyPage, 0.0, 0L); + + given(reviewService.getProductReviews(eq(productId), eq(0), eq(20), eq("latest"))) + .willReturn(emptyResponse); + + // when + ApiResponse response = reviewController.getProductReviews(productId, 0, 20, "latest"); + + // then + assertThat(response.isSuccess()).isTrue(); + assertThat(response.getData().getReviews()).isEmpty(); + assertThat(response.getData().getAverageRating()).isEqualTo(0.0); + assertThat(response.getData().getTotalReviews()).isEqualTo(0L); + } + } + + @Nested + @DisplayName("필터링된 상품별 리뷰 목록 조회 API") + class GetProductReviewsWithFilters { + + @Test + @DisplayName("성공 - 평점 필터 적용") + void getProductReviewsWithFilters_Success_WithRatingFilter() { + // given + Long productId = 100L; + Integer rating = 5; + given(reviewService.getProductReviewsWithFilters(eq(productId), eq(0), eq(20), eq("latest"), eq(rating), eq(null), eq(null), eq(null))) + .willReturn(sampleReviewList); + + // when + ApiResponse response = reviewController.getProductReviewsWithFilters(productId, 0, 20, "latest", rating, null, null, null); + + // then + assertThat(response.isSuccess()).isTrue(); + assertThat(response.getData().getReviews()).hasSize(1); + + verify(reviewService).getProductReviewsWithFilters(productId, 0, 20, "latest", rating, null, null, null); + } + + @Test + @DisplayName("성공 - 모든 필터 적용") + void getProductReviewsWithFilters_Success_WithAllFilters() { + // given + Long productId = 100L; + Integer rating = 5; + String sizeFit = "SMALL"; + String cushion = "SOFT"; + String stability = "STABLE"; + + given(reviewService.getProductReviewsWithFilters(eq(productId), eq(0), eq(20), eq("latest"), eq(rating), eq(sizeFit), eq(cushion), eq(stability))) + .willReturn(sampleReviewList); + + // when + ApiResponse response = reviewController.getProductReviewsWithFilters(productId, 0, 20, "latest", rating, sizeFit, cushion, stability); + + // then + assertThat(response.isSuccess()).isTrue(); + + verify(reviewService).getProductReviewsWithFilters(productId, 0, 20, "latest", rating, sizeFit, cushion, stability); + } + } + + @Nested + @DisplayName("리뷰 상세 조회 API") + class GetReview { + + @Test + @DisplayName("성공 - 리뷰 상세 정보 조회") + void getReview_Success() { + // given + Long reviewId = 1L; + given(reviewService.getReview(eq(reviewId))).willReturn(sampleReview); + + // when + ApiResponse response = reviewController.getReview(reviewId); + + // then + assertThat(response.isSuccess()).isTrue(); + assertThat(response.getData().getReviewId()).isEqualTo(1L); + assertThat(response.getData().getTitle()).isEqualTo("좋은 신발입니다"); + assertThat(response.getData().getRating()).isEqualTo(5); + assertThat(response.getData().getSizeFit()).isEqualTo(SizeFit.SMALL); + assertThat(response.getData().getCushion()).isEqualTo(Cushion.SOFT); + assertThat(response.getData().getStability()).isEqualTo(Stability.STABLE); + + verify(reviewService).getReview(reviewId); + } + + @Test + @DisplayName("실패 - 존재하지 않는 리뷰") + void getReview_Fail_NotFound() { + // given + Long reviewId = 999L; + given(reviewService.getReview(eq(reviewId))) + .willThrow(new ReviewNotFoundException("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다.")); + + // when & then + assertThatThrownBy(() -> reviewController.getReview(reviewId)) + .isInstanceOf(ReviewNotFoundException.class) + .hasMessage("ID " + reviewId + "에 해당하는 리뷰를 찾을 수 없습니다."); + + verify(reviewService).getReview(reviewId); + } + + @Test + @DisplayName("실패 - 삭제된 리뷰 접근") + void getReview_Fail_DeletedReview() { + // given + Long reviewId = 1L; + given(reviewService.getReview(eq(reviewId))) + .willThrow(new ReviewNotFoundException("삭제되었거나 숨김 처리된 리뷰입니다.")); + + // when & then + assertThatThrownBy(() -> reviewController.getReview(reviewId)) + .isInstanceOf(ReviewNotFoundException.class) + .hasMessage("삭제되었거나 숨김 처리된 리뷰입니다."); + } + } + + @Nested + @DisplayName("상품별 3요소 평가 통계 조회 API") + class GetProductStatistics { + + @Test + @DisplayName("성공 - 3요소 평가 통계 조회") + void getProductStatistics_Success() { + // given + Long productId = 100L; + given(statisticsService.getProductStatistics(eq(productId))).willReturn(sampleStatistics); + + // when + ApiResponse response = reviewController.getProductStatistics(productId); + + // then + assertThat(response.isSuccess()).isTrue(); + assertThat(response.getData().getTotalReviews()).isEqualTo(100L); + assertThat(response.getData().getSizeFitStatistics().getDistribution().get(SizeFit.SMALL)).isEqualTo(30L); + assertThat(response.getData().getSizeFitStatistics().getDistribution().get(SizeFit.NORMAL)).isEqualTo(50L); + assertThat(response.getData().getSizeFitStatistics().getDistribution().get(SizeFit.BIG)).isEqualTo(20L); + assertThat(response.getData().getCushionStatistics().getPercentage().get(Cushion.SOFT)).isEqualTo(40.0); + assertThat(response.getData().getStabilityStatistics().getPercentage().get(Stability.STABLE)).isEqualTo(60.0); + + verify(statisticsService).getProductStatistics(productId); + } + + @Test + @DisplayName("성공 - 리뷰가 없는 상품의 통계 조회") + void getProductStatistics_Success_NoReviews() { + // given + Long productId = 999L; + Review3ElementStatisticsResponse emptyStats = Review3ElementStatisticsResponse.builder() + .totalReviews(0L) + .sizeFitStatistics(Review3ElementStatisticsResponse.SizeFitStatistics.builder() + .distribution(Collections.emptyMap()) + .percentage(Collections.emptyMap()) + .build()) + .cushionStatistics(Review3ElementStatisticsResponse.CushionStatistics.builder() + .distribution(Collections.emptyMap()) + .percentage(Collections.emptyMap()) + .build()) + .stabilityStatistics(Review3ElementStatisticsResponse.StabilityStatistics.builder() + .distribution(Collections.emptyMap()) + .percentage(Collections.emptyMap()) + .build()) + .build(); + + given(statisticsService.getProductStatistics(eq(productId))).willReturn(emptyStats); + + // when + ApiResponse response = reviewController.getProductStatistics(productId); + + // then + assertThat(response.isSuccess()).isTrue(); + assertThat(response.getData().getTotalReviews()).isEqualTo(0L); + } + } + + @Nested + @DisplayName("파라미터 검증 테스트") + class ParameterValidation { + + @Test + @DisplayName("음수 페이지 파라미터 처리") + void handleNegativePageParameter() { + // given + Long productId = 100L; + int negativePage = -1; + + // 실제 컨트롤러에서 음수 페이지가 그대로 전달되는 경우를 테스트 + given(reviewService.getProductReviews(eq(productId), eq(negativePage), eq(20), eq("latest"))) + .willReturn(sampleReviewList); + + // when + ApiResponse response = reviewController.getProductReviews(productId, negativePage, 20, "latest"); + + // then + assertThat(response.isSuccess()).isTrue(); + verify(reviewService).getProductReviews(productId, negativePage, 20, "latest"); + } + + @Test + @DisplayName("잘못된 정렬 옵션 처리") + void handleInvalidSortOption() { + // given + Long productId = 100L; + String invalidSort = "invalid"; + given(reviewService.getProductReviews(eq(productId), eq(0), eq(20), eq(invalidSort))) + .willReturn(sampleReviewList); + + // when + ApiResponse response = reviewController.getProductReviews(productId, 0, 20, invalidSort); + + // then + assertThat(response.isSuccess()).isTrue(); // 서비스에서 처리하므로 OK + + verify(reviewService).getProductReviews(productId, 0, 20, invalidSort); + } + } +} \ No newline at end of file diff --git a/uploads/reviews/2025/07/31/1e12e4b9-9fee-47a4-bc4c-609eb2826dd6.jpeg b/uploads/reviews/2025/07/31/1e12e4b9-9fee-47a4-bc4c-609eb2826dd6.jpeg deleted file mode 100644 index fca7128c444a33f60860bc5673bb6f09b634422f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94834 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 mKLt^xs7JNH>^LfU7(%#c!>PC<3P=M&7+tiT$Ed