Spring Boot를 활용하여 사용자에게 상품의 종류와 위치 정보를 반환하는 API 서버를 구축했다. 이 서버는 "/api/snacks/analyze" 엔드포인트를 통해 사용자가 이미지를 전송하면, Flask 서버로부터 처리된 데이터를 받아 반환한다.
@Value("${spring.flask.base-url}")
private String flaskBaseUrl;
@Transactional
public List<Snack> analyzeSnacks(List<MultipartFile> images) {
String baseUrl = flaskBaseUrl + "/detect";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
images.forEach(image -> {
try {
Resource resource = new ByteArrayResource(image.getBytes()) {
@Override
public String getFilename() {
return image.getOriginalFilename();
}
};
body.add("images", resource);
} catch (IOException e) {
throw new RuntimeException("Error reading image file", e);
}
});
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
ResponseEntity<SnackDto[]> responseEntity = restTemplate.exchange(
baseUrl, HttpMethod.POST, requestEntity, SnackDto[].class);
SnackDto[] snackDtos = responseEntity.getBody();
if (snackDtos == null) {
throw new RuntimeException("Received null response from Flask API");
}
return saveSnackData(snackDtos);
}
private List<Snack> saveSnackData(SnackDto[] snackDtos) {
return snackRepository.saveAll(
Arrays.stream(snackDtos)
.map(dto -> Snack.builder()
.filename(dto.getFilename())
.objectName(dto.getObject_name())
.position(new Position(dto.getPosition().getX1(), dto.getPosition().getX2(), dto.getPosition().getY1(), dto.getPosition().getY2()))
.build())
.collect(Collectors.toList())
);
}
Sevice 계층의 코드중 일부 이다. 핵심은 다음과 같다.
- @Value("${spring.flask.base-url}"): Flask 서버의 주소를 환경별로 구분하여 관리한다.
- analyzeSnacks: 사용자로부터 받은 이미지를 Flask 서버로 전송하고, 분석된 데이터를 받아 MariaDB에 저장한다.
- 이 과정에서 RestTemplate을 사용하여 이미지 데이터를 Flask 서버에 전송하고, ResponseEntity를 통해 분석 결과를 받는다. 결과 데이터는 Snack 엔티티로 변환되어 데이터베이스에 저장된다.
Postman을 사용하여 API 서버의 기능을 테스트했다. 테스트 결과, 서버는 "/api/snacks/analyze" 및 "/api/snacks" 엔드포인트를 통해 상품 정보를 정확하게 반환했다.
클라우드 타입의 DataBase Server인 MariaDB에도 데이터가 올바르게 저장되었음을 확인했다.