[일단 박죠] O2O Object Detection 스프링 서버 구축

jeyong·2023년 12월 28일
0

공부 / 생각 정리  

목록 보기
89/120
post-custom-banner

1. Spring 서버 구축

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 엔티티로 변환되어 데이터베이스에 저장된다.

2. Spring 서버 테스트

Postman을 사용하여 API 서버의 기능을 테스트했다. 테스트 결과, 서버는 "/api/snacks/analyze" 및 "/api/snacks" 엔드포인트를 통해 상품 정보를 정확하게 반환했다.

클라우드 타입의 DataBase Server인 MariaDB에도 데이터가 올바르게 저장되었음을 확인했다.

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.
post-custom-banner

0개의 댓글