Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

고마구의 개발 블로그

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

KDT풀스택과정 공부

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

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

`start.sh` 파일은 기존의 형태로 두어도 되지만, 입력을 처리해야 하는 경우 수정이 필요할 수 있습니다. 만약 자바 프로그램이 `Scanner`를 통해 입력을 받아야 한다면, `start.sh` 파일에서 이 입력을 어떻게 전달할지를 고려해야 합니다.

### 1. 입력 파일을 전달하는 방법

만약 입력을 파일로 전달하고 싶다면, `start.sh` 파일을 다음과 같이 수정할 수 있습니다:

```bash
#!/bin/bash

JAVA_FILE=$1
RESULT_FILE=$2
INPUT_FILE=$3  # 추가된 입력 파일

# 디렉토리 생성
mkdir -p "$(dirname "$JAVA_FILE")"

while true; do
    if [ ! -f "$JAVA_FILE" ]; then
        echo "Waiting for Java file..."
        sleep 1
        continue
    fi

    echo "Java file found. Processing..."

    # 클래스 이름 추출
    CLASS_NAME=$(grep 'public class ' "$JAVA_FILE" | awk '{print $3}')

    if [ -z "$CLASS_NAME" ]; then
        echo "Class name could not be determined"
        exit 1
    fi

    # 파일 이름과 클래스 이름을 맞추기
    JAVA_FILE_NAME=$(basename "$JAVA_FILE")
    EXPECTED_FILE_NAME="${CLASS_NAME}.java"

    if [ "$JAVA_FILE_NAME" != "$EXPECTED_FILE_NAME" ]; then
        echo "Class name and file name mismatch: Expected $EXPECTED_FILE_NAME but got $JAVA_FILE_NAME"
        exit 1
    fi

    # Java 파일을 컴파일 후 실행
    if javac "$JAVA_FILE"; then
        echo "Compilation successful. Running $CLASS_NAME..."
        # Java 실행 결과를 result.txt에 저장, 입력 파일에서 읽기
        java -cp "$(dirname "$JAVA_FILE")" "$CLASS_NAME" < "$INPUT_FILE" > "$RESULT_FILE" 2>&1
    else
        echo "Compilation failed."
        exit 1
    fi

    # 파일을 처리한 후 삭제
    rm -f "$JAVA_FILE"
    rm -f "$INPUT_FILE"  # 입력 파일 삭제
    sleep 1
done
```

### 2. `executeInDocker` 메서드 수정

그에 따라 `executeInDocker` 메서드에서도 `start.sh`에 입력 파일 경로를 전달해야 합니다. 예를 들어:

```java
// start.sh 스크립트에서 파일명 인자 추가 (비동기 실행)
ProcessBuilder execBuilder = new ProcessBuilder("docker", "exec", containerName, "bash", "/app/start.sh", javaFileName, resultFileName, inputFileName);
execBuilder.start();  // 백그라운드에서 실행되므로 waitFor() 사용하지 않음
```

이렇게 하면 `start.sh`가 Java 프로그램을 실행할 때 입력 파일도 함께 사용할 수 있게 됩니다.

### 요약

- `start.sh`를 수정하여 입력 파일을 처리하도록 변경합니다.
- `executeInDocker` 메서드에서 `start.sh`를 호출할 때 입력 파일 경로를 인자로 추가합니다.

이렇게 하면 Docker 컨테이너 내에서 Java 프로그램이 `Scanner`를 통해 입력을 받을 수 있게 됩니다. 추가 질문이 있으면 언제든지 말씀해 주세요!