자바 스프링 서버에서 서버로 데이터 전송하고 받기

dogineer·2023년 7월 31일
0
post-thumbnail

WebClient로 서버1에서 영상을 넘겨주고 서버2에서 영상 메타데이터를 서버1로 전송하는 코드를 작성해보겠습니다.

의존성 추가하기

implementation 'org.springframework.boot:spring-boot-starter-webflux'

WebClient를 사용하기 위해 build.gradle에 spring-boot-starter-webflux 추가해주세요.

서버1 코드 작성하기

  1. 메타데이터 클래스 작성
@Data
public class Metadata {
    public String file_path;
    public String filename;
    public String ext;
    public int width;
    public int height;
    public String format_name;
    public String format_long_name;
    public String tags;
    public double duration;
    public Long size;
}
  1. 업로드 메소드 제작
    WebClient 빌더를 통해 서버 url 추가 된 설정 만들어봅시다.
    url이 추가된 WebClient를 반환하여 새 항목을 만들어주면
    WebClient를 사용할때 호스트와 경로 전체 대신 경로만 입력할 수 있습니다.
public class UploadFileToServer {

    @Value("http://localhost:8081")
    private String serverUrl;

    public WebClient webClient() {
        return WebClient
              .builder()
              .baseUrl(serverUrl)
              .build();
    }
    
    public Mono<Metadata> upload(Resource files) {
        return webClient()
            .method(HttpMethod.POST)
            .uri("/s2/api/metadataFetcher")
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.MULTIPART_FORM_DATA)
            .body(BodyInserters.romResource(files))
            .retrieve()
            .bodyToMono(Metadata.class);
    }
}

서버 2 코드 작성하기

  1. 메타데이터 클래스 작성하기 (서버1의 메타데이터와 동일)

  2. 메타데이터 가져오는 api 만들기

@RestController
@RequiredArgsConstructor
public class MetadataController {
  private final VideoFileUtils videoFileUtils;

  @PostMapping(value = "/s2/api/metadataFetcher")
  public ResponseEntity<Metadata> upload(
    @RequestParam(value = "files", required = false)MultipartFile files) {
      Metadata metadata = mediaDataFetcher.getMediaInfo(videoFileUtils.ffprobe, filePath);

      return ResponseEntity.ok().body(metadata);
    }
}
  1. 미디어 메타데이터 추출 메소드 만들기
    ffprobe를 통하여 영상의 위치를 기입 후 메타데이터 추출합니다.
@Service
public class MediaDataFetcher {
    public Metadata getMediaInfo(FFprobe ffprobe, String filePath) throws IOException {
        System.out.println("파일 : " + filePath);

        FFmpegProbeResult probeResult = ffprobe.probe(filePath);

        Metadata metadata = new Metadata();
        
        metadata.width = probeResult.getStreams().get(0).width;
        metadata.height = probeResult.getStreams().get(0).height;
        metadata.format_name = probeResult.getFormat().format_name;
        metadata.format_long_name = probeResult.getFormat().format_long_name;
        metadata.tags = probeResult.getFormat().tags.toString();
        metadata.duration = probeResult.getFormat().duration;
        metadata.size = probeResult.getFormat().size;

        return metadata;
    }
}

서버1에서 RestController 작성하기

@RestController
@RequiredArgsConstructor
public class UploadController {
	private final UploadFileToServer uploadFileToServer;

	@PostMapping(value = "/s1/api/upload")
	public void upload(){
    	uploadFileToServer
   			.upload(mediaFiles)
      		.subscribe(System.out::println);
      }
    }

그럼 서버2에서 추출한 메타데이터가 서버1로 전송되면서 출력됩니다.

profile
왈왈왈 메모장입니다 왈왈왈

0개의 댓글