Skip to content

Commit cddba6c

Browse files
authored
[feat] #50 회원가입 시 임베딩된 이미지도 저장
[feat] #50 회원가입 시 임베딩된 이미지도 저장
2 parents 33c39c2 + 98d90ec commit cddba6c

File tree

18 files changed

+312
-13
lines changed

18 files changed

+312
-13
lines changed

build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ dependencies {
4646
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
4747
implementation 'org.springframework.boot:spring-boot-starter-websocket'
4848

49+
implementation 'org.springframework.boot:spring-boot-starter-webflux'
4950

5051
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
5152
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
@@ -62,6 +63,7 @@ dependencies {
6263
testImplementation 'org.springframework.boot:spring-boot-starter-test'
6364
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
6465

66+
6567
}
6668

6769
tasks.named('test') {

src/main/java/com/okagaka/OkaGaka/OkaGakaApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.scheduling.annotation.EnableAsync;
56

7+
@EnableAsync
68
@SpringBootApplication
79
public class OkaGakaApplication {
810

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.okagaka.OkaGaka.common.config;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.web.reactive.function.client.WebClient;
6+
7+
@Configuration
8+
public class WebClientConfig {
9+
@Bean
10+
public WebClient.Builder webClientBuilder() {
11+
return WebClient.builder();
12+
}
13+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.okagaka.OkaGaka.common.external.embedding;
2+
3+
import com.okagaka.OkaGaka.domain.signup.dto.EmbeddingRequestDto;
4+
import com.okagaka.OkaGaka.domain.signup.dto.EmbeddingResponseDto;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import org.springframework.http.HttpStatusCode;
8+
import org.springframework.http.MediaType;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.web.reactive.function.client.WebClient;
11+
import reactor.core.publisher.Mono;
12+
13+
@Component
14+
public class EmbeddingApiClient {
15+
16+
private final WebClient webClient;
17+
18+
private static final Logger log = LoggerFactory.getLogger(EmbeddingApiClient.class);
19+
20+
// WebClient.Builder를 주입받아 API 서버의 기본 정보를 설정합니다.
21+
public EmbeddingApiClient(WebClient.Builder webClientBuilder) {
22+
this.webClient = webClientBuilder
23+
.baseUrl("http://13.124.128.236:8000")
24+
.build();
25+
}
26+
27+
/**
28+
* 얼굴 이미지 정보로부터 Embedding 정보를 요청하는 메소드
29+
* @param requestDto API 요청에 필요한 데이터 (userId, image 리스트)
30+
* @return API 응답을 파싱한 DTO 객체
31+
*/
32+
public EmbeddingResponseDto getEmbeddings(EmbeddingRequestDto requestDto) {
33+
return webClient.post() // POST 요청
34+
.uri("/v1/embeddings") // 기본 URL 뒤에 붙는 상세 경로
35+
.contentType(MediaType.APPLICATION_JSON) // 요청 본문의 타입은 JSON
36+
.bodyValue(requestDto) // 요청 본문에 실어보낼 객체
37+
.retrieve() // 응답을 받아옴
38+
.onStatus(HttpStatusCode::isError, response ->
39+
// 응답 본문을 문자열로 읽어옵니다.
40+
response.bodyToMono(String.class)
41+
.flatMap(errorBody -> {
42+
// 실제 에러 로그를 자세히 출력합니다.
43+
log.error("Embedding API 호출 실패. Status: {}, Body: {}", response.statusCode(), errorBody);
44+
// 예외를 발생시켜 트랜잭션 롤백 등을 유도합니다.
45+
return Mono.error(new RuntimeException("Embedding API 호출 실패: " + errorBody));
46+
})
47+
)
48+
.bodyToMono(EmbeddingResponseDto.class) // 응답 본문을 EmbeddingResponseDto 객체로 변환
49+
.block(); // 비동기 스트림(Mono)의 처리가 끝날 때까지 기다린 후 최종 결과를 반환 (동기 방식 처리)
50+
}
51+
52+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//package com.okagaka.OkaGaka.domain.carrequest.controller;
2+
//
3+
//import com.okagaka.OkaGaka.common.response.ApiResponse;
4+
//import com.okagaka.OkaGaka.common.security.CustomUserDetails;
5+
//import com.okagaka.OkaGaka.domain.carrequest.dto.CarRequestDto;
6+
//import com.okagaka.OkaGaka.domain.carrequest.service.CarRequestService;
7+
//import io.swagger.v3.oas.annotations.Operation;
8+
//import io.swagger.v3.oas.annotations.tags.Tag;
9+
//import lombok.RequiredArgsConstructor;
10+
//import org.springframework.http.ResponseEntity;
11+
//import org.springframework.security.core.annotation.AuthenticationPrincipal;
12+
//import org.springframework.web.bind.annotation.PostMapping;
13+
//import org.springframework.web.bind.annotation.RequestBody;
14+
//import org.springframework.web.bind.annotation.RequestMapping;
15+
//import org.springframework.web.bind.annotation.RestController;
16+
//
17+
//@RestController
18+
//@RequiredArgsConstructor
19+
//@RequestMapping("/api/car-request")
20+
//@Tag(name = "Car Request API", description = "차량 이용 요청 및 AI 추천 API")
21+
//public class CarRequestController {
22+
// private final CarRequestService carRequestService;
23+
//
24+
// @Operation(summary = "차량 이용 요청", description = "요청을 등록하고 AI의 추천 및 승인 절차를 시작합니다.")
25+
// @PostMapping
26+
// public ResponseEntity<ApiResponse<CarRequestResponseDto>> createCarReqeust(
27+
// @RequestBody CarRequestDto requestDto,
28+
// @AuthenticationPrincipal CustomUserDetails userDetails
29+
// ) {
30+
// Long userId = userDetails.getUserId();
31+
// CarRequestResponseDto response = carRequestService.createAndProcessCarRequest(userId, requestDto);
32+
// return ResponseEntity.accepted().body(ApiResponse.success(response)); // 202 Accepted 응답(요청은 받았지만 실제 처리는 비동기적으로 처리)
33+
// }
34+
//
35+
//
36+
//}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.okagaka.OkaGaka.domain.carrequest.dto;
2+
3+
public record CarRequestDto(
4+
String departureCityDo,
5+
String departureGuGun,
6+
String departureDong,
7+
String departureBunji,
8+
9+
// 도착지
10+
String destinationCityDo,
11+
String destinationGuGun,
12+
String destinationDong,
13+
String destinationBunji
14+
) { }
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//package com.okagaka.OkaGaka.domain.carrequest.service;
2+
//
3+
//import com.okagaka.OkaGaka.domain.carrequest.dto.CarRequestDto;
4+
//import com.okagaka.OkaGaka.domain.carrequest.repository.CarRequestRepository;
5+
//import com.okagaka.OkaGaka.domain.user.repository.UserRepository;
6+
//import lombok.RequiredArgsConstructor;
7+
//import org.springframework.stereotype.Service;
8+
//import org.springframework.transaction.annotation.Transactional;
9+
//
10+
//@Service
11+
//@RequiredArgsConstructor
12+
//public class CarRequestService {
13+
//
14+
// private final CarRequestRepository carRequestRepository;
15+
// private final UserRepository userRepository;
16+
// private final AsyncDecisionService asyncDecisionService;
17+
//
18+
// @Transactional
19+
// public CarRequestResponseDto createAndProcessCarRequest(Long userId, CarRequestDto requestDto) {
20+
//
21+
// }
22+
//}

src/main/java/com/okagaka/OkaGaka/domain/reservation/entity/Reservation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public class Reservation extends BaseTimeEntity {
8686

8787
private int travelTimeSec; // 경로 소요 시간(초 단위)
8888

89-
private int recalculatedTravelTimeSec; // 카풀 시 재계산한 시간
89+
// private int recalculatedTravelTimeSec; // 카풀 시 재계산한 시간
9090

9191
// private Boolean isRecurring;
9292
//
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.okagaka.OkaGaka.domain.signup.dto;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
6+
import java.util.List;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
public class EmbeddingData {
11+
private Long userId;
12+
private List<EmbeddingItem> items;
13+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.okagaka.OkaGaka.domain.signup.dto;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
6+
@Getter
7+
@NoArgsConstructor
8+
public class EmbeddingItem {
9+
private Long id; // UserFaceImage의 ID
10+
private String embeddingUrl;
11+
}

0 commit comments

Comments
 (0)