KDT풀스택과정 공부

자바 컨테이너 입력값 받는 방법

고마구 2024. 10. 9. 10:43

자바 프로그램에서 `Scanner`를 사용해 입력을 받도록 하고, Spring Boot 애플리케이션에서 Docker 컨테이너로 입력을 전달하는 방법

### 1단계: 자바 코드 수정

자바 코드는 `Scanner`를 사용해 표준 입력(stdin)에서 입력을 읽도록 작성해야 합니다. 예를 들어, 다음과 같은 구조가 될 수 있습니다:

```java
import java.util.Scanner;

public class YourClassName {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("입력을 해주세요:");
        String str = sc.nextLine();
        // 입력 처리
        System.out.println("입력한 내용: " + str);
        sc.close();
    }
}
```

### 2단계: `executeInDocker` 메서드 수정

자바 프로그램을 Docker 컨테이너에서 실행할 때 입력을 전달하려면 다음 단계를 수행해야 합니다:

1. **입력 파일 생성**: 자바 코드 실행 전에 임시 입력 파일을 생성하고, 전달할 내용을 이 파일에 씁니다.

2. **입력 파일을 Java 실행에 전달**: Docker 실행 명령을 수정하여 이 입력 파일로부터 읽도록 합니다.

다음은 `executeInDocker` 메서드의 수정된 예입니다:

```java
private String executeInDocker(String containerName, String code, String className, String testLv, String id, String input) throws IOException, InterruptedException {
    String basePath = "/app/" + id + "/" + testLv;
    String javaFileName = basePath + "/" + className + ".java";
    String resultFileName = basePath + "/result_" + className + ".txt";
    String inputFileName = basePath + "/input.txt";  // 입력 파일 경로

    // ... (기존 코드)

    // 임시 입력 파일 작성
    Path inputFile = Files.createTempFile("input", ".txt");
    Files.write(inputFile, input.getBytes(StandardCharsets.UTF_8));

    // Docker 컨테이너로 입력 파일 복사
    ProcessBuilder copyInputBuilder = new ProcessBuilder("docker", "cp", inputFile.toString(), containerName + ":" + inputFileName);
    Process copyInputProcess = copyInputBuilder.start();
    copyInputProcess.waitFor();

    // Java 실행 명령 수정: 입력 파일로부터 읽도록
    ProcessBuilder execBuilder = new ProcessBuilder("docker", "exec", containerName, "bash", "-c", "java -cp " + basePath + " " + className + " < " + inputFileName);
    execBuilder.start();  // 백그라운드에서 실행되므로 waitFor() 사용하지 않음

    // ... (기존 코드)
    
    // 임시 입력 파일 삭제
    Files.delete(inputFile);

    // 결과 반환
    return output.toString();
}
```

### 요약

이렇게 하면 Docker 컨테이너 내에서 실행되는 자바 프로그램이 `Scanner`로 입력을 받을 수 있게 됩니다. 입력 파일을 생성하고 이를 Docker 컨테이너로 복사한 후, 자바 프로그램이 이 파일을 통해 입력을 받을 수 있도록 실행하면 됩니다.