Skip to content

Commit 52ece68

Browse files
authored
[dev -> main] 2025.10.29 10:52
[dev -> main] 2025.10.29 10:52
2 parents 11bc322 + 16eb83c commit 52ece68

30 files changed

Lines changed: 967 additions & 244 deletions

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ dependencies {
6464
// AOP
6565
implementation 'org.springframework.boot:spring-boot-starter-aop'
6666

67+
// prometheus
68+
implementation 'org.springframework.boot:spring-boot-starter-actuator'
69+
implementation 'io.micrometer:micrometer-registry-prometheus'
70+
71+
6772

6873
}
6974

src/main/java/DiffLens/back_end/domain/library/controller/LibraryController.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import DiffLens.back_end.domain.library.dto.LibraryRequestDto;
44
import DiffLens.back_end.domain.library.dto.LibraryResponseDTO;
5+
import DiffLens.back_end.domain.library.dto.LibraryCompareRequestDTO;
6+
import DiffLens.back_end.domain.library.dto.LibraryCompareResponseDTO;
57
import DiffLens.back_end.domain.library.service.LibraryService;
68
import DiffLens.back_end.domain.members.entity.Member;
79
import DiffLens.back_end.domain.members.service.auth.CurrentUserService;
@@ -148,4 +150,59 @@ public ApiResponse<LibraryResponseDTO.CreateResult> addSearchHistoryToLibrary(
148150
createResult.getPanelCount());
149151
return ApiResponse.onSuccess(result);
150152
}
153+
154+
@PostMapping("/compare")
155+
@Operation(summary = "라이브러리 비교", description = """
156+
## 개요
157+
두 개의 라이브러리를 비교하여 특성, 차트, 기본 통계를 제공하는 API입니다.
158+
159+
## Request Body
160+
- libraryId1 : 첫 번째 라이브러리 ID (필수)
161+
- libraryId2 : 두 번째 라이브러리 ID (필수)
162+
163+
## 응답 데이터
164+
- group1, group2 : 각 라이브러리 기본 정보
165+
- keyCharacteristics : 주요 특성 비교 (차이점 포함)
166+
- comparisonCharts : 비교 차트 데이터 (Chart.js 형식)
167+
- basicComparison : 기본 통계 비교
168+
169+
## 권한
170+
본인이 생성한 라이브러리만 비교할 수 있습니다.
171+
172+
## 제약사항
173+
- 동일한 라이브러리는 비교할 수 없습니다.
174+
- 두 라이브러리 모두 존재해야 합니다.
175+
176+
""")
177+
public ApiResponse<LibraryCompareResponseDTO.CompareResult> compareLibraries(
178+
@RequestBody @Valid LibraryCompareRequestDTO.Compare request) {
179+
Member member = currentUserService.getCurrentUser();
180+
LibraryCompareResponseDTO.CompareResult result = libraryService.compareLibraries(request, member);
181+
return ApiResponse.onSuccess(result);
182+
}
183+
184+
@PostMapping("/compare/test")
185+
@Operation(summary = "라이브러리 비교 (테스트용)", description = """
186+
## 개요
187+
AI 서버 연동 없이 하드코딩된 테스트 데이터로 라이브러리 비교를 제공하는 API입니다.
188+
개발 및 테스트 목적으로 사용됩니다.
189+
190+
## Request Body
191+
- libraryId1 : 첫 번째 라이브러리 ID (필수)
192+
- libraryId2 : 두 번째 라이브러리 ID (필수)
193+
194+
## 응답 데이터
195+
- 하드코딩된 테스트 데이터 반환
196+
- 실제 라이브러리 데이터는 사용하지 않음
197+
198+
## 권한
199+
인증된 사용자만 접근 가능합니다.
200+
201+
""")
202+
public ApiResponse<LibraryCompareResponseDTO.CompareResult> compareLibrariesTest(
203+
@RequestBody @Valid LibraryCompareRequestDTO.Compare request) {
204+
Member member = currentUserService.getCurrentUser();
205+
LibraryCompareResponseDTO.CompareResult result = libraryService.compareLibrariesTest(request, member);
206+
return ApiResponse.onSuccess(result);
207+
}
151208
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package DiffLens.back_end.domain.library.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
public class LibraryCompareRequestDTO {
11+
12+
@Getter
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public static class Compare {
17+
18+
@NotNull(message = "첫 번째 라이브러리 ID는 필수입니다")
19+
@JsonProperty("libraryId1")
20+
private Long libraryId1;
21+
22+
@NotNull(message = "두 번째 라이브러리 ID는 필수입니다")
23+
@JsonProperty("libraryId2")
24+
private Long libraryId2;
25+
}
26+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package DiffLens.back_end.domain.library.dto;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.util.List;
10+
import java.util.Map;
11+
12+
public class LibraryCompareResponseDTO {
13+
14+
@Getter
15+
@Builder
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
public static class CompareResult {
19+
20+
@JsonProperty("group1")
21+
private GroupInfo group1;
22+
23+
@JsonProperty("group2")
24+
private GroupInfo group2;
25+
26+
@JsonProperty("keyCharacteristics")
27+
private List<KeyCharacteristic> keyCharacteristics;
28+
29+
@JsonProperty("comparisonCharts")
30+
private List<ComparisonChart> comparisonCharts;
31+
32+
@JsonProperty("basicComparison")
33+
private List<BasicComparison> basicComparison;
34+
}
35+
36+
@Getter
37+
@Builder
38+
@NoArgsConstructor
39+
@AllArgsConstructor
40+
public static class GroupInfo {
41+
42+
@JsonProperty("libraryId")
43+
private Long libraryId;
44+
45+
@JsonProperty("libraryName")
46+
private String libraryName;
47+
48+
@JsonProperty("totalCount")
49+
private Integer totalCount;
50+
51+
@JsonProperty("color")
52+
private String color;
53+
}
54+
55+
@Getter
56+
@Builder
57+
@NoArgsConstructor
58+
@AllArgsConstructor
59+
public static class KeyCharacteristic {
60+
61+
@JsonProperty("characteristic")
62+
private String characteristic;
63+
64+
@JsonProperty("description")
65+
private String description;
66+
67+
@JsonProperty("group1Percentage")
68+
private Integer group1Percentage;
69+
70+
@JsonProperty("group2Percentage")
71+
private Integer group2Percentage;
72+
73+
@JsonProperty("difference")
74+
private Integer difference;
75+
}
76+
77+
@Getter
78+
@Builder
79+
@NoArgsConstructor
80+
@AllArgsConstructor
81+
public static class ComparisonChart {
82+
83+
@JsonProperty("chartType")
84+
private String chartType;
85+
86+
@JsonProperty("title")
87+
private String title;
88+
89+
@JsonProperty("data")
90+
private Map<String, Object> data;
91+
92+
@JsonProperty("options")
93+
private Map<String, Object> options;
94+
}
95+
96+
@Getter
97+
@Builder
98+
@NoArgsConstructor
99+
@AllArgsConstructor
100+
public static class BasicComparison {
101+
102+
@JsonProperty("metric")
103+
private String metric;
104+
105+
@JsonProperty("group1Value")
106+
private String group1Value;
107+
108+
@JsonProperty("group2Value")
109+
private String group2Value;
110+
}
111+
}

0 commit comments

Comments
 (0)