본문 바로가기

Back-end/Java&Spring

ProcessBuilder, AWS S3를 통해 Web IDE 개발하기

구름톤 딥다이브 풀스택 과정을 진행하면서 
코딩 과외용 Web IDE 플랫폼 개발 프로젝트를 진행하였다.

 

나는 해당 프로젝트에서 IDE 환경 구축 부분을 담당했는데, 프로젝트를 진행하면서 고민한 점을 공유하기 위해 글을 작성하게 되었다.

 

구현해야 할 기능은 크게

 

1. 코드 실행

2. 코드 저장

3. 코드 실시간 공유

 

이렇게 세가지가 있었다.

 

해당 게시글에서는 코드 실행/저장에 관한 내용만 다루고 코드 실시간 공유는 다음 게시물에서 다뤄보도록 하겠다.

 

코드 실행

 

코드를 실행하는 기능은 JAVA에서 외부 프로세스를 만들 수 있는 java.lang 패키지의 ProcessBuilder 클래스를 사용하였다. 

 

private String runPython(String localFilePath, String input) 
    throws IOException, InterruptedException {
    Process process = new ProcessBuilder("python3", localFilePath).start();
    return getProcessOutput(process, input);
}

 

 

이렇게 ProcessBuilder를 이용해서 새로운 프로세스를 실행한다.

 

위 코드는 Python3 인터프리터를 실행하는 코드이다.

localFilePath가 /tmp/test.py 라면

터미널에서 python3 /tmp/test.py 이렇게 실행된다.

 

코드 저장

 

사용자가 IDE에서 작성하던 코드를 저장하고 다른 파일에 새로운 코드를 작성한다던가, 또는 작성한 소스 코드를 다운로드 받을 수 있는 기능을 구현하기 위해 AWS S3를 이용하였다.

 

내가 진행했던 프로젝트은 앞서 말했듯이 코딩 과외용 IDE 플랫폼 이기 때문에 매 수업마다 새로운 파일을 생성, 저장해야 할 일이 많을거고 나중 수업에서 앞서 작성했던 코드를 이용해야 할 일도 많을 것이다.

 

따라서 사용자가 강의실을 생성하면 그에 맞춰 S3에 빈 파일을 생성하고 코드를 수정 후 저장할때마다 내용을 수정해 S3에 저장하는 방식으로 개발을 진행하였다. 

 

또한 S3를 이용하였기에 소스 코드를 다운로드해야할 때 쉽게 다운로드 할 수 있었다.

public String createLectureFile(Long lectureId, String fileName) {
    try {
        String s3Path = "lectures/" + lectureId + "/" + fileName;
        
        ByteArrayInputStream emptyContent = 
            new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8));

        s3Service.uploadFile(emptyContent, s3Path, "text/plain");

        return s3Path;
    } catch (Exception e) {
        throw new CustomException(ErrorCode.S3_UPLOAD_ERROR);
    }
}

 

이렇게 빈 파일을 S3에 업로드 한후 

 

s3Service.uploadFile(inputStream, s3Path, "text/plain") 을 통해 파일 내용을 수정하거나

s3Service.getFileContent(s3Path)을 통해 파일 안의 내용을 가져오고

s3Service.getFileUrl(s3Path)을 통해 파일을 다운로드 받을 수 있다.

 

보완점

 

다른 IDE 프로젝트를 한 사람들의 블로그를 찾아보니 ProcessBuilder를 사용하는 것은 언어 지원이 추가될때마다 새로운 환경을 추가해야 하는 점, 하나의 언어 내에서도 다양한 버전을 모두 지원하기 번거로운 점이 확장성의 측면에서 단점이 있었고

또한 사용자가 악의적 의도로 코드를 작성했을 때 그 코드가 실행 서버에서 그대로 돌아가고, S3에도 그대로 저장된다는 점에서 보안상의 단점이 존재하였다.

 

후에 리팩토링을 할 때는 Docker 컨테이너에서 코드를 실행하고, S3에 파일을 저장하는 방식으로 하면 해당 단점들을 보완할 수 있을 것 같다.

 

 

 

 

 

'Back-end > Java&Spring' 카테고리의 다른 글

Spring Boot - 외부 설정 파일과 프로필 관리  (2) 2024.10.09
Spring Boot - 핵심 기능  (0) 2024.10.02
Spring JPA (3) - 매핑  (0) 2024.09.29
Spring JPA (2) - JPA 동작 과정  (4) 2024.09.24
Spring JPA (1) - JPA 이해  (0) 2024.09.23