고마구의 개발 블로그
240912 21주차 목요일 - Spring boot 06 본문
suhaha 개발 일지 :: [SpringBoot] 스프링 시큐리티 OAuth2 구글 로그인 API 연동하기 (tistory.com)
스프링 부트로 코딩 테스트 플랫폼을 구현하면서 자바 기반의 코딩 테스트는 상대적으로 쉽게 만들 수 있지만, 파이썬과 같은 다른 언어의 코딩 테스트를 지원하려면 몇 가지 방법을 고려할 수 있습니다. 주로 다른 프로그래밍 언어의 코드를 실행하고 결과를 확인하는 방법에 대한 설계가 필요합니다.
### **파이썬 코딩 테스트를 지원하는 방법**
#### **1. 시스템 명령어를 통해 파이썬 코드 실행**
- **설명**: 스프링 부트 애플리케이션에서 파이썬 스크립트를 시스템 명령어로 실행하고 그 결과를 가져오는 방법입니다.
- **구현 방법**:
- 사용자가 제출한 파이썬 코드를 파일로 저장.
- 자바에서 `ProcessBuilder`를 사용하여 파이썬 인터프리터(`python` 명령어)를 호출.
- 파이썬 코드를 실행한 결과를 받아서 사용자에게 반환.
```java
public String runPythonCode(String code) throws IOException {
// 1. 파이썬 코드를 파일로 저장
String filePath = "user_code.py";
Files.write(Paths.get(filePath), code.getBytes());
// 2. 파이썬 파일을 실행하는 프로세스 실행
ProcessBuilder processBuilder = new ProcessBuilder("python", filePath);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
// 3. 결과를 읽어들임
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line).append("\n");
}
return result.toString();
}
```
- **장점**: 간단한 구현으로 파이썬 코드를 실행할 수 있습니다.
- **단점**: 보안 문제가 발생할 수 있으며, 사용자 입력에 따라 악성 코드를 실행할 위험이 있습니다.
#### **2. Docker 컨테이너를 사용한 실행 환경 격리**
- **설명**: 파이썬 코드를 Docker 컨테이너에서 실행하여 호스트 시스템의 보안을 유지하고, 각 언어마다 격리된 환경에서 테스트할 수 있습니다.
- **구현 방법**:
- 스프링 부트 애플리케이션이 파이썬을 실행할 수 있는 Docker 컨테이너를 생성.
- 제출된 코드를 Docker 컨테이너 내부에서 실행하고 결과를 받아옴.
- Docker Java API (`docker-java` 라이브러리)를 통해 컨테이너를 생성, 실행, 삭제 등의 관리 작업 수행.
```java
public String runPythonInDocker(String code) throws IOException, InterruptedException {
// 1. 파이썬 코드를 파일로 저장
String filePath = "user_code.py";
Files.write(Paths.get(filePath), code.getBytes());
// 2. Docker 명령어로 파이썬 컨테이너에서 실행
ProcessBuilder processBuilder = new ProcessBuilder(
"docker", "run", "--rm", "-v", Paths.get(filePath).toAbsolutePath() + ":/usr/src/app/user_code.py", "python:3", "python", "/usr/src/app/user_code.py"
);
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();
// 3. 결과를 읽어들임
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line).append("\n");
}
return result.toString();
}
```
- **장점**: 파이썬 코드를 안전하게 실행할 수 있는 격리된 환경을 제공하여 보안 문제를 해결.
- **단점**: Docker가 필요하며, 성능 상 약간의 오버헤드가 발생할 수 있음.
#### **3. 외부 서비스 사용 (예: JDoodle API)**
- **설명**: 파이썬 코드를 외부 API(예: JDoodle, Sphere Engine 등)를 통해 실행하고 결과를 받아오는 방식입니다.
- **구현 방법**:
- 제출된 코드를 외부의 코드 실행 API에 전송.
- API가 실행한 결과를 받아와서 사용자에게 반환.
- 외부 API는 이미 다양한 언어를 지원하므로, 스프링 부트 애플리케이션에서 별도로 환경을 관리할 필요가 없습니다.
```java
public String runPythonViaAPI(String code) {
String apiUrl = "https://api.jdoodle.com/v1/execute";
String clientId = "YOUR_CLIENT_ID";
String clientSecret = "YOUR_CLIENT_SECRET";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Map<String, String> requestBody = new HashMap<>();
requestBody.put("script", code);
requestBody.put("language", "python3");
requestBody.put("versionIndex", "3");
requestBody.put("clientId", clientId);
requestBody.put("clientSecret", clientSecret);
HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.postForEntity(apiUrl, entity, String.class);
return response.getBody();
}
```
- **장점**: 다른 언어를 쉽게 지원할 수 있으며, 별도의 실행 환경을 관리할 필요가 없음.
- **단점**: 외부 서비스에 의존해야 하며, API 호출 횟수에 따라 비용이 발생할 수 있음.
#### **4. Jython 사용 (자바 내에서 파이썬 실행)**
- **설명**: Jython은 파이썬 2.x 코드를 자바 환경에서 실행할 수 있는 자바 구현입니다.
- **구현 방법**:
- Jython을 사용하여 자바 내에서 파이썬 코드를 직접 실행.
- 하지만 Jython은 최신 파이썬 버전(3.x)을 지원하지 않으므로 실용적이지 않을 수 있습니다.
```java
public String runPythonWithJython(String code) {
PythonInterpreter interpreter = new PythonInterpreter();
StringWriter out = new StringWriter();
interpreter.setOut(out);
interpreter.exec(code);
return out.toString();
}
```
- **장점**: 별도의 외부 환경 없이 자바 내에서 파이썬을 실행할 수 있음.
- **단점**: 최신 파이썬 버전을 지원하지 않아 한계가 있음.
### **요약**
- 파이썬 코딩 테스트를 구현하는 방법으로는 **시스템 명령어 실행**, **Docker 컨테이너 사용**, **외부 코드 실행 API 사용** 등이 있습니다. **Docker**는 보안과 격리성 측면에서 추천되며, **외부 API**는 구현이 간편하지만 서비스 비용이 발생할 수 있습니다.
'KDT풀스택과정 공부' 카테고리의 다른 글
Spring boot 개인 플젝 계획 (0) | 2024.09.13 |
---|---|
240913 21주차 금요일 - Node.js 03 (0) | 2024.09.13 |
240911 21주차 수요일 - 부트 초기설정, 다운로드 (0) | 2024.09.11 |
노드 (0) | 2024.09.10 |
240910 21주차 화요일 - Node.js 02 (0) | 2024.09.10 |