Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "라이브러리 API")
@RestController
@RequestMapping("/libraries")
Expand Down Expand Up @@ -181,28 +183,144 @@ public ApiResponse<LibraryCompareResponseDTO.CompareResult> compareLibraries(
return ApiResponse.onSuccess(result);
}

// @PostMapping("/compare/test")
// @Operation(summary = "라이브러리 비교 (테스트용)", description = """
// ## 개요
// AI 서버 연동 없이 하드코딩된 테스트 데이터로 라이브러리 비교를 제공하는 API입니다.
// 개발 및 테스트 목적으로 사용됩니다.
//
// ## Request Body
// - libraryId1 : 첫 번째 라이브러리 ID (필수)
// - libraryId2 : 두 번째 라이브러리 ID (필수)
//
// ## 응답 데이터
// - 하드코딩된 테스트 데이터 반환
// - 실제 라이브러리 데이터는 사용하지 않음
//
// ## 권한
// 인증된 사용자만 접근 가능합니다.
//
// """)
// public ApiResponse<LibraryCompareResponseDTO.CompareResult> compareLibrariesTest(
// @RequestBody @Valid LibraryCompareRequestDTO.Compare request) {
// Member member = currentUserService.getCurrentUser();
// LibraryCompareResponseDTO.CompareResult result = libraryService.compareLibrariesTest(request, member);
// return ApiResponse.onSuccess(result);
// }
@PostMapping("/compare/test")
@Operation(summary = "라이브러리 비교 (테스트용)", description = """
## 개요
AI 서버 연동 없이 하드코딩된 테스트 데이터로 라이브러리 비교를 제공하는 API입니다.
개발 및 테스트 목적으로 사용됩니다.

## Request Body
- libraryId1 : 첫 번째 라이브러리 ID (필수, 실제로는 사용하지 않음)
- libraryId2 : 두 번째 라이브러리 ID (필수, 실제로는 사용하지 않음)

## 응답 데이터
- 하드코딩된 테스트 데이터 반환
- 실제 라이브러리 데이터는 사용하지 않음

## 권한
인증된 사용자만 접근 가능합니다.

""")
public ApiResponse<LibraryCompareResponseDTO.CompareResult> compareLibrariesTest(
@RequestBody @Valid LibraryCompareRequestDTO.Compare request) {
// Group A 정보
LibraryCompareResponseDTO.GroupInfo group1 = LibraryCompareResponseDTO.GroupInfo.builder()
.libraryId(1L)
.libraryName("20대 남성이 타는 차 브랜드 분포")
.summary("20대 남성 소비자의 자동차 브랜드 선호도 분석")
.totalCount(100)
.filters(List.of(
LibraryCompareResponseDTO.Filter.builder()
.key("성별")
.values(List.of("남성"))
.build(),
LibraryCompareResponseDTO.Filter.builder()
.key("연령")
.values(List.of("20-29세"))
.build(),
LibraryCompareResponseDTO.Filter.builder()
.key("차량보유")
.values(List.of("있음"))
.build()))
.color("#4169E1")
.build();

// Group B 정보
LibraryCompareResponseDTO.GroupInfo group2 = LibraryCompareResponseDTO.GroupInfo.builder()
.libraryId(2L)
.libraryName("30대 여성 화장품 구매 패턴")
.summary("30대 여성의 화장품 구매 행동 및 선호 브랜드 분석")
.totalCount(250)
.filters(List.of(
LibraryCompareResponseDTO.Filter.builder()
.key("성별")
.values(List.of("여성"))
.build(),
LibraryCompareResponseDTO.Filter.builder()
.key("연령")
.values(List.of("30-39세"))
.build()))
.color("#FF69B4")
.build();

// 주요 특성 (특성 1, 2, 3)
List<LibraryCompareResponseDTO.KeyCharacteristic> keyCharacteristics = List.of(
LibraryCompareResponseDTO.KeyCharacteristic.builder()
.characteristic("소비 성향")
.description("A그룹은 실용적 소비 성향이 강하고, B그룹은 프리미엄 브랜드 선호도가 높습니다.")
.group1Percentage(30)
.group2Percentage(70)
.difference(40)
.build(),
LibraryCompareResponseDTO.KeyCharacteristic.builder()
.characteristic("브랜드 충성도")
.description("A그룹은 브랜드 전환율이 높은 반면, B그룹은 특정 브랜드에 대한 충성도가 높습니다.")
.group1Percentage(30)
.group2Percentage(70)
.difference(40)
.build(),
LibraryCompareResponseDTO.KeyCharacteristic.builder()
.characteristic("온라인 구매 선호도")
.description("A그룹은 오프라인 구매를 선호하고, B그룹은 온라인 쇼핑몰과 리뷰를 적극 활용합니다.")
.group1Percentage(30)
.group2Percentage(70)
.difference(40)
.build());

// Group A 통계
LibraryCompareResponseDTO.GroupMetrics group1Metrics = LibraryCompareResponseDTO.GroupMetrics.builder()
.male(100)
.female(0)
.seoul(35)
.gyeonggi(40)
.busan(15)
.regionEtc(10)
.avgAge(23.5)
.avgFamily(3.2)
.avgChildren(0.8)
.ratePossessingCar(72)
.avgPersonalIncome(420)
.avgFamilyIncome(340)
.build();

// Group B 통계
LibraryCompareResponseDTO.GroupMetrics group2Metrics = LibraryCompareResponseDTO.GroupMetrics.builder()
.male(0)
.female(100)
.seoul(35)
.gyeonggi(40)
.busan(15)
.regionEtc(10)
.avgAge(32.7)
.avgFamily(4.2)
.avgChildren(3.4)
.ratePossessingCar(30)
.avgPersonalIncome(340)
.avgFamilyIncome(500)
.build();

// Comparisons
LibraryCompareResponseDTO.Comparisons comparisons = LibraryCompareResponseDTO.Comparisons.builder()
.group1(group1Metrics)
.group2(group2Metrics)
.build();

// Insights
LibraryCompareResponseDTO.Insights insights = LibraryCompareResponseDTO.Insights.builder()
.difference("A그룹(20대 남성)은 차량 구매에 있어 실용성과 가성비를 중시하며, 국산 브랜드 선호도가 높습니다. 반면 B그룹(30대 여성)은 화장품 구매 시 브랜드 이미지와 품질을 중시하며, 프리미엄 브랜드에 대한 지출이 큽니다. 또한 A그룹은 차량 보유율이 72%로 높은 반면, B그룹은 30%로 낮아 이동 수단에 대한 접근 방식이 다릅니다.")
.common("두 그룹 모두 서울과 경기 지역에 집중되어 있으며, 지역 분포가 거의 동일합니다. 또한 모두 온라인 쇼핑 플랫폼을 적극 활용하며, 소셜미디어를 통한 제품 정보 습득이 활발합니다.")
.implication("A그룹은 차량 마케팅 시 실용성과 경제성을 강조하는 전략이 효과적일 것입니다. B그룹은 화장품 마케팅 시 브랜드 스토리텔링과 프리미엄 경험 제공이 중요합니다. 두 그룹 모두 지역별 맞춤 마케팅 전략이 필요하며, 온라인 채널을 통한 타겟팅이 핵심입니다.")
.build();

// 최종 결과 생성
LibraryCompareResponseDTO.CompareResult result = LibraryCompareResponseDTO.CompareResult.builder()
.group1(group1)
.group2(group2)
.keyCharacteristics(keyCharacteristics)
.comparisons(comparisons)
.insights(insights)
.build();

return ApiResponse.onSuccess(result);
}
}
Loading
Loading