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
관리 메뉴

고마구의 개발 블로그

240912 21주차 목요일 - Spring boot 06 본문

KDT풀스택과정 공부

240912 21주차 목요일 - Spring boot 06

고마구 2024. 9. 12. 15:57


01aws (youtube.com)

 
 
 
suhaha 개발 일지 :: [SpringBoot] 스프링 시큐리티 OAuth2 구글 로그인 API 연동하기 (tistory.com)

[SpringBoot] 스프링 시큐리티 OAuth2 구글 로그인 API 연동하기

1. 구글 로그인 API 토큰 발급 https://cloud.google.com/?hl=ko https://cloud.google.com/?hl=ko cloud.google.com 새 프로젝트 생성 프로젝트 생성 후 왼쪽 메뉴에서 OAuth 동의 화면 클릭 외부 선택 후 만들기 앱 등록정

chamggae.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**는 구현이 간편하지만 서비스 비용이 발생할 수 있습니다.