파일 CRUD
- 파일에 변경이 발생했을 때, 변경과 관련된 내용(line, 변경내용)만을 서버로 전달하여 저장하는 방법이 있을 것이고, 변경된 파일을 통째로 서버로 전달하여 저장하는 방법이 있을 것이다.
- 변경 내용만을 서버로 전달하여 저장하는 방법에 대해서
- diff2html.js, node-diff3 등을 사용하면 git의 파일 변경 추적과 비슷한 방식으로 파일의 변경사항을 확인할 수 있을 것 같다.
- 이 경우 서버는 파일 시스템을 통해 파일을 저장할 때 해당 파일을 세밀하게 조정해야한다.
- 변경된 파일을 통째로 서버로 전달하여 저장하는 방법에 대해서
- 이 경우 서버는 새로운 파일을 만들어 덮어씌우면 되므로 세밀한 조정이 필요 없어진다.
- 이 문제를 미약하게 해결하기 위해서 압축 전*수송 방식을 사용할 수 있을 것으로 보인다.
- 결론: 전자가 최적의 방법으로 보이지만 현실적으로는 후자를 선택하는 것이 좋아 보인다.
- 프로젝트 생성 시 해당 파일은 반영구적으로 저장되어야 한다. 이를 저장하는 방법에는 여러가지가 있을 것 같다.
- 리눅스 파일 시스템에 원본 파일과 디렉터리 구조를 그대로 유지하며 저장
- 다른 방법으로 저장
- DB?
- 압축
- 결론: 리눅스 파일 시스템을 통해 저장하는 것이 좋을 것 같다. 일단 파일 시스템에 저장되어 있으면 도커 가상화를 통해 수행시키기에 훨씬 수월하다.
- 디렉터리를 어떻게 추상화할 것인가?
프로그램 실행
- 프로그램 실행은 도커 가상화 기술을 통해 수행되면 좋을 것 같다. 서버 자체에서 실행되는 경우 malicious 한 코드에 대해 보안 헛점 발생 가능
터미널
- 터미널은 어떻게 구현해야하나?
- Web IDE의 터미널은 주로 XTermJS 라는 웹 기반 터미널 에뮬레이터 라이브러리와 웹소켓을 통해 구현된다.
- 이것은 곧 프로젝트에 사용자가 접속되어있다면 도커 컨테이너도 실행중이어야함을 의미한다.
- 프론트
- XTermJS를 통해 터미널 뷰를 제공하며, 사용자의 입력을 처리한다.
- 사용자의 요청을 백엔드 서버로 넘긴다 - Web Socket 사용
- 백엔드
- 백엔드 서버는 요청을 받아 해당하는 도커 컨테이너에 명령을 수행시킨다.
- 이후 결과가 READ 되는대로 웹소켓을 통해 클라이언트로 전달한다.]
- 이때 이벤트 기반 프로그래밍 적용해보면 좋을 듯!