Compare commits

..

No commits in common. "648653df59aaa5a5e3c8673500883861c1ae2ac5" and "482837d7f007002c7cb04980b06cc361922dc801" have entirely different histories.

6 changed files with 101 additions and 260 deletions

5
.gitignore vendored
View File

@ -1,6 +1 @@
book
.env
cache
.DS_Store
build

56
cli.py
View File

@ -1,56 +0,0 @@
#! /usr/bin/env python
import argparse
import subprocess
import sys
import os
def build(args):
parser = argparse.ArgumentParser(description='Compiling the documentation')
parser.add_argument('-v', '--verbose', action='store_true', help='verbose mode')
parser.add_argument('--update_issues', action='store_true', help='update issues')
args = parser.parse_args(args)
if args.verbose:
print("build start")
if args.update_issues:
if args.verbose:
print("get issues")
p = subprocess.run(["deno", "run", "-A","tools/getIssue.ts", "--path","./build/issues.json"])
p.check_returncode()
if args.verbose:
print("build issues")
p = subprocess.run(["deno", "run", "-A","tools/printDocument.ts", "--overall", "--path", "./build/issues.json", "--outpath", "./build/overall.md"])
p.check_returncode()
p = subprocess.run(["deno", "run", "-A","tools/printDocument.ts", "--path", "./build/issues.json", "--outpath", "./build/specific.md"])
p.check_returncode()
def help(_args):
global commandList
print("subcommands:")
for command in commandList.keys():
print("\t", command)
commandList = {
'build': build,
'help': help
}
def main():
args = sys.argv
if len(args) < 2:
print("no subcommand", file=sys.stderr)
help(args)
return
_command = args[0]
subCommand = args[1]
if subCommand not in commandList:
print("Command not found", file=sys.stderr)
help(args)
sys.exit(1)
args = args[2:]
os.makedirs("build", exist_ok=True)
commandList[subCommand](args)
if __name__ == '__main__':
main()

View File

@ -61,7 +61,7 @@
4. #8 Document: Drag And Drop Upload
5. #9 Document: Auto-Refresh
6. #12 Document: Share
7. #13 Document: Navigator
7. #13 Document: 네비게이터
### 2.2.3 File Operation
@ -71,21 +71,21 @@
### 2.2.4 Search Operation
1. #16 Search: Document Search
1. #16 Search: 문서 검색
### 2.2.5 Stash Operation
1. #17 Stash: read
2. #19 Stash: add
3. #20 Stash: remove
4. #21 Stash: Drag and Drop to Document
1. #17 Stash: 보기
2. #19 Stash: 추가
3. #20 Stash: 삭제
4. #21 Stash: 드래그 앤 드롭
### 2.2.6 Management Operation
1. #22 Management: Login
2. #23 Management: Configure
3. #24 Management: Localization
4. #25 Management: Theme
3. #24 Management: 현지화
4. #25 Management: 테마
### 2.2.7 Extension Operation
@ -105,11 +105,21 @@
## 2.4. 제약사항(Constraints)
- 이 프로젝트는 MIT License로 개발되고 있으므로 라이브러리의 라이센스도 신경을 쓴다.
- XSS 공격에 안전해야 한다.
- 1000 RPS에서 문제없이 작동한다.
- 첫 로드후 로딩하면 0.5s 이내에 동작해야합ㄴ.다
- 동시 편집 이용자를 5명까지는 허용해야 합니다.
이 프로젝트는 MIT License로 개발되고 있으므로 라이브러리의 라이센스도 신경을 쓴다.
> - 개발자의 선택을 제한할 모든 항목에 관한 일반적인 설명을 제공해야 한다.
> - 포함되는 내용
> 1. Regulatory plocies
> 1. Hardware limitations (e.g., signal timing requirements)
> 1. Interfaces to other applications
> 1. Parallel operation
> 1. Audit functions
> 1. Control functions
> 1. Higher-order language requirements
> 1. Signal handshake protocols(e.g., XON-XOFF, ACK-NACK)
> 1. Reliability requirements
> 1. Criticality of the application
> 1. Safety and security considerations
## 2.5. 가정 및 의존성(Assumptions and dependencies)

View File

@ -16,28 +16,23 @@
## 3.2. 기능 요구사항(Functional requirements)
### (1) Chunk: Focus/Unfocus
액터: 사용자
시작 조건: Chunk를 편집할 수 있는 권한을 가져야 한다.
목표: 지금 편집하고자 하는 Chunk를 보여준다.
액터: 사용자
시작 조건: Chunk를 편집할 수 있는 권한을 가져야 한다.
1. 사용자가 Chunk의 영역에 클릭을 했을때, Focus 된다. 그떄 다른 Chunk의 Focus를 사라지게 한다.
2. Focus를 얻었을때, Focus를 얻은 Chunk을 눈에 띄이도록 표시한다.
3. Focus가 사라졌을때, 변경되었으면 변경된 Chunk를 저장한다.
### (2) Chunk: remove
액터: 사용자
시작 조건: Chunk를 수정가능한 권한을 가지고 있어야함.
목표: Chunk를 지운다.
액터: 사용자
시작 조건: Chunk를 수정가능한 권한을 가지고 있어야함.
1. Chunk의 좌측 상단의 Context Menu에 삭제 아이콘을 클릭할 때나 빈 내용의 Chunk에서 <kbd>Backspace</kbd><kbd>Del</kbd>를 입력할 때 시작한다.
2. 해당 Chunk를 삭제한다.
3. 서버에서 그 Chunk를 삭제한다.
4. 아래의 Chunk가 있다면 끌어 올린다.
### (3) Chunk: read
액터: 사용자
시작조건: 없음
목표: Chunk를 보여준다.
액터: 사용자
시작조건: 없음
1. 서버에서 내용을 읽는다.
2. 그 내용을 chunk안 영역에 사람이 보기 좋게 그 타입에 따라 렌더링한다.
@ -54,25 +49,22 @@ A. 렌더링 실패
1. 렌더링 실패에 실패하면 실패의 이유를 보여준다.
### (4) Chunk: previews
액터: 사용자
사용조건: 편집 중일때
목표: 미리보기를 보여주어 편집을 편하게 한다.
액터: 사용자
사용조건: 편집 중일때
1. Chunk의 내용을 바꾸면 시작된다.
2. 보기모드에서 어떻게 보여질지 미리보기 창을 띄워준다. 미리보기는 기본적으로 하단에 띄우고 밑에 공간이 없으면 상단에 띄운다.
3. 내용이 바뀌면 미리보기 창의 내용도 갱신한다.
### (5) Document: view Chunk
액터: 사용자
시작조건: 읽기 권한이 있어야 한다.
목표: Chunk들을 보여준다.
액터: 사용자
시작조건: 없음.
1. Document가 로딩되면 시작한다.
2. 경로가 주어지면 Document Component에서 그 경로의 문서를 읽고 파싱한다. 그동안 로딩 바를 보여준다.
3. 로딩이 완료되면 파싱된 결과물인 Chunk들을 보여준다.
대안흐름:
A. 읽기 실패:
1. 읽기에 실패한 경우 읽기에 실패한 이유를 띄운다.
@ -80,9 +72,8 @@ B. 파싱 실패:
1. 파싱에 실패한 경우 파싱에 실패한 이유를 띄우고 raw text가 담긴 Chunk로 렌더링한다.
### (6) Document: remove
액터: 사용자
시작조건: 문서를 삭제할 권한이 있어야함.
목표: 앱에서 문서를 삭제한다.
액터: 사용자
시작조건: 문서를 삭제할 권한이 있어야함.
1. Document의 AppBar에 놓여있는 삭제 아이콘을 클릭하면 시작한다.
2. 정말로 삭제하겠냐는 다이얼로고가 띄운다.
@ -92,9 +83,8 @@ B. 파싱 실패:
1. 다이얼로그에서 아니오를 누르면 다이얼로고를 닫고 종료한다.
### (7) Document: add/delete tag
액터: 사용자
시작조건: 태그 수정 권한이 있을 때
목표: 문서의 태그를 추가/수정/삭제한다.
액터: 사용자
시작조건: 태그 수정 권한이 있을 때
1. Document의 AppBar에 놓여있는 태그 수정 아이콘을 클릭하면 시작한다. 태그 수정 다이얼로그를 띄운다.
2. 태그 수정 다이얼로그에서 태그를 생성, 삭제한다.
@ -105,9 +95,8 @@ B. 파싱 실패:
1. 취소 버튼을 누르면 다이얼로그를 닫고 종료한다.
### (8) Document: Drag And Drop Upload
액터: 사용자
시작조건: 문서 수정 권한이 있어야 한다.
목표: 업로드를 드래그 앤 드롭으로 한다.
액터: 사용자
시작조건: 문서 수정 권한이 있어야 한다.
1. 웹사이트의 그림이나 비디오 등의 파일을 Drag And Drop 해서 Chunk 사이에 놓으면 시작된다.
2. Drag And Drop된 파일을 서버에 업로드한다. 업로드시 파일 이름이 중복될 때 파일 이름이 밑줄과 숫자로 끝나지 않으면 이름의 뒤에 "_1"을 붙여 업로드 한다. 숫자로 끝나면 다음 숫자를 붙여서 업로드 한다. 파일 이름이 없다면 임의의 이름을 붙여서 업로드 한다.
@ -124,17 +113,15 @@ B. 작은 파일 사이즈
2. 파일을 base64로 인코딩해서 Chunk로 삽입한다.
### (9) Document: Auto-Refresh
액터: 외부 편집기
시작조건: 없음
목적: 변화를 실시간으로 따라갈 수 있게 한다.
액터: 외부 편집기
시작조건: 없음
1. Document나 Document가 포함하는 미디어의 파일이 다른 편집 프로그램에 의해서 변경되었을 시에 시작한다.
2. 보고 있는 사용자의 Document 뷰를 변경 부분만 Refresh한다. 이때 보고 있던 스크롤이 변하지 않게 유의한다.
### (10) Chunk: autocomplete
액터: 사용자
시작조건: chunk 수정시어야 한다.
목표: 링크 등을 자동으로 완성해서 편집을 편하게 한다.
액터: 사용자
시작조건: chunk 수정시어야 한다.
1. <kbd>Ctrl+Space</kbd>로 자동완성 창을 띄울 수 있다.
2. 방향키로 고른다.
@ -142,185 +129,74 @@ B. 작은 파일 사이즈
4. 선택한 단어로 완성시킨다.
### (11) Chunk: swap positions
액터: 사용자
시작 조건: Document 수정권한이 있어야 한다.
목적: 앱에서 Chunk 위치를 바꿀 수 있다.
액터: 사용자
시작 조건: Document 수정권한이 있어야 한다.
1. Focus를 얻고 핸들 아이콘을 누를때 시작한다.
2. 이때 오버레이를 표시해서 놓여졌을 때의 상황을 미리 볼 수 있게 한다.
3. 드래그해서 원하는 장소에 놓으면 위치를 바꿀 수 있다.
### (12) Document: Share
액터: 사용자
시작 조건: 문서를 공유할 수 있는 권한을 가져야한다.
목표: 문서를 공유한다.
액터: 사용자
시작 조건: 문서를 공유할 수 있는 권한을 가져야한다.
1. Document의 AppBar에 놓여있는 공유 아이콘을 누르면 시작한다.
2. 공유 링크를 복사한다. 그리고 공유 설정아이콘을 띄워준다. 여기서 종료할 수 있다.
3. 공유 설정아이콘을 클릭하면 공유 설정 다이얼로그를 띄운다. 이 다이얼로그에서는 공유 기간과 편집 가능여부 등을 설정할 수 있고 공유 링크를 복사할 수 있다. 공류를 취소할 수도 있다.
3. 공유 설정아이콘을 클릭하면 공유 설정 다이얼로그를 띄운다. 이 다이얼로그에서는 공유 기간과 편집 가능여부 등을 설정할 수 있고 공유 링크를 복사할 수 있다.
### (13) Document: Navigator
액터: 사용자
시작 조건: 없음
목표: 문서들을 쉽게 이동할 수 있는 네비게이터를 보여준다.
### (13) Document: 네비게이터
액터: 사용자
시작 조건: 없음
1. 만일 문서가 속하는 디렉토리에 Summary.md 가 있고 올바른 형식(링크와 리스트로 이루어져 있음)이면 시작한다.
1. 만일 문서가 속하는 디렉토리에 Summary.md 가 있고 링크와 리스트로 이루어져 있으면 시작한다.
2. Document의 왼쪽에 Summary의 내용을 네비게이터 역할로 표시한다.
### (14) File: create/delete/rename file
액터: 사용자
시작조건: 디렉토리에 대한 권한을 가지고 있어야한다.
목표: 앱상에서 파일을 생성하거나 삭제 할 수 있어야 한다.
1. Treeview에 포커스가 간 상태에서 시작한다.
2. Treeview에서 오른쪽 클릭을 하면 Context Menu가 나오고 새파일을 클릭하면 이름을 지정해서 파일을 생성할 수 있다.
3. Context Menu에서 삭제를 클릭하면 해당 파일을 삭제한다.
4. 이름 바꾸기를 클릭하거나 Treeview에서 파일에 포커스가 간 상태에서 <kbd>F2</kbd>를 입력하면 이름을 바꿀 수 있도록 한다.
앱상에서 파일을 생성하거나 삭제 할 수 있어야 한다. Treeview에서 오른쪽 클릭을 하면 Context Menu가 나오고 새파일을 클릭하면 이름을 지정해서 파일을 생성할 수 있다. Context Menu에서 삭제를 클릭하면 해당 파일을 삭제한다. 이름 바꾸기를 클릭하거나 Treeview에서 파일에 포커스가 간 상태에서 <kbd>F2</kbd>를 입력하면 이름을 바꿀 수 있도록 한다.
### (15) File: upload/download files
액터: 사용자
시작조건: 디렉토리의 권한이 있어야 한다.
목표: 파일을 업로드하거나 다운로드 할 수 있어야 한다.
파일을 업로드하거나 다운로드 할 수 있어야 한다. Treeview의 Context menu에서 다운로드 버튼을 클릭해서 다운로드 할 수 있다. Treeview에 파일을 드래그 앤 드롭하는 것으로 업로드 할 수 있다.
1. Treeview의 Context menu에서 다운로드 버튼을 클릭해서 다운로드 할 수 있다.
2. Treeview에 파일을 드래그 앤 드롭하는 것으로 업로드 할 수 있다.
### (16) Search: 문서 검색
Drawer에서 문서 검색 버튼을 누르면 문서 검색 창이 뜬다. 문서 검색 창에서 태그 검색을 선택하고 태그를 입력한다. 검색 버튼을 누르면 태그를 가진 문서를 리스트로 보여준다. 내용 검색을 선택하고 텍스트를 입력해서 검색하면 텍스트를 포함한 문서를 리스트로 보여준다.
### (16) Search: Document Search
액터: 사용자
시작조건: 문서를 읽을 수 있는 권한이 있어야 한다.
목표: 문서나 문서들을 검색할 수 있다.
1. Drawer에서 문서 검색 버튼을 누르면 문서 검색 창이 뜬다.
2. 문서 검색창에서 범위를 지정한다. 기본 범위는 현재 보고 있는 문서로 한다.
3. 문서 검색 창에서 태그를 검색할지 내용으로 검색을 할지 지정한다. 기본값은 내용이다.
4. 정규식을 사용할 것인지 지정한다. 기본값은 사용 안함이다.
5. 검색 버튼을 누르면 해당 조건을 만족하는 문서를 리스트로 보여준다.
### (17) Stash: read
액터: 사용자
시작조건: 화면크기가 768px 이상일때 보여준다.
목표: Stash를 보여준다.
1. 오른쪽에 작은 버튼을 두고 버튼을 클릭하면 시작한다.
2. 오른쪽 Drawer가 열려서 Stash의 내용을 보여준다. 최대 지정된 숫자만큼의 내용들을 보여준다.
3. 다시 버튼을 누르면 Stash Drawer를 닫는다.
### (17) Stash: 보기
오른쪽에 작은 버튼을 두고 버튼을 클릭하면 오른쪽 Drawer가 열려서 Stash의 내용을 보여준다.
최대 지정된 숫자만큼의 내용들을 보여준다.
모바일에선 보여주지 않는다.
### (18) File: export document
액터: 사용자
시작조건: 문서를 읽을 수 있는 권한이 있어야 한다. 문서 타입에만 가능하다.
목표: 문서를 보기 모드에서 보이는 것처럼 출력할 수 있다.
문서를 보기 모드에서 보이는 것처럼 출력할 수 있다. 메뉴의 Context menu에서 접근 할 수 있다. 문서 타입에만 가능하다.
1. 메뉴의 Context menu에서 접근 할 때 시작한다.
2. 출력하기를 누르면 출력 다이얼로그가 뜬다.
3. 출력할 문서 타입을 문서 타입을 설정한다. 출력할 수 있는 문서 타입은 다음과 같다.
- pdf
- html
4. 출력하기를 누르면 출력된 문서를 다운로드한다.
### (19) Stash: 추가
Stash 창을 연 상태에서 포커스가 Stash 창에 주어져 있을때 <kbd>Ctrl+V</kbd>를 누르면 Stash에 클립보드의 내용이 추가되고 클립보드는 비워진다.
대안흐름:
### (20) Stash: 삭제
Stash 창의 각각 항목의 삭제 아이콘을 클릭하면 선택된 항목을 삭제한다. Stash에 붙어있는 삭제 아이콘을 클릭하면 전체 항목을 삭제한다.
A. 취소
1. 단계 2에서 시작한다.
2. 취소하기를 누르면 다이얼로그 창을 닫고 종료한다.
### (19) Stash: add
액터: 사용자
시작 조건: Stash 창을 연 상태에서 포커스가 Stash 창에 주어져 있어야 한다.
목표: Stash를 추가한다.
1. \<\< 포함 #17 \>\>
2. <kbd>Ctrl+V</kbd>를 누르면 Stash에 클립보드의 내용이 Stash로 추가되고 클립보드는 비워진다.
3. <kbd>Ctrl+Z</kbd>를 눌러서 추가를 되돌릴 수 있다.
### (20) Stash: remove
액터: 사용자
시작조건: Stash 창을 연 상태에서 포커스가 Stash 창에 주어져 있어야 한다.
목표: 원하는 Stash를 삭제한다.
1. Stash 창의 각각 항목의 삭제 아이콘을 클릭하면 선택된 항목을 삭제한다.
2. Stash에 붙어있는 삭제 아이콘을 클릭하면 전체 항목을 삭제한다.
3. <kbd>Ctrl+Z</kbd>를 눌러서 삭제를 되돌릴 수 있다.
### (21) Stash: Drag and Drop to Document
액터: 사용자
시작 조건: 문서 편집 권한이 있어야 한다.
목표: 드래그 앤 드롭으로 Chunk를 Stash에서 꺼내 삽입할 수 있다.
1. Stash 창의 Stash을 Document에 드래그하면 시작된다.
2. Document의 Chunk 사이에 Stash을 드롭하면 그 자리에 Chunk가 삽입된다. 사이의 결정은 제일 가까운 청크로 정한다.
3. Stash을 그 위치로 업로드시킨다. 업로드는 #8 와 한 것 같이 한다.
4. 해당 Stash를 Stash창에서 삭제한다.
대안흐름:
A. 취소
1. Stash 창에 놓으면 작업을 취소한다.
### (21) Stash: 드래그 앤 드롭
Stash 창의 항목을 Document에 드래그해서 드롭하면 그 자리에 Chunk가 삽입된다. 그리고 항목을 그 위치로 업로드시킨다. 업로드는 #8 와 한 것 같이 한다.
### (22) Management: Login
액터: 사용자
시작조건: 없음.
목표: 사용자가 액세스하기 위해 로그인할 수 있다.
1. 사용자가 로컬에서 지정된 프로그램이 아닌 외부에서 접근한다면 시작한다.
2. 로그인 암호를 요구한다. 초기 로그인 암호는 환경변수에 의해서 결정된다.
3. 알맞은 암호를 입력했다면 권한을 부여한다.
사용자가 로컬에서 지정된 프로그램이 아닌 외부에서 접근한다면 로그인을 요구한다. 초기 로그인 암호는 환경변수에 의해서 결정된다.
### (23) Management: Configure
액터: 사용자
시작조건: 없음.
목표: 앱 정책등에 대해 앱에서 설정할 수 있다.
편집기 내부에서 <kbd>F1</kbd>키를 입력하거나 설정 아이콘을 클릭하면 설정창을 보여준다. 설정창은 프로그램의 속성을 설정할 수 있고 로그를 볼 수 있다. 설정창은 다음 항목들을 포함한다.
- 로그인 암호
- 테마 설정
- 언어 설정
1. 편집기 내부에서 설정 아이콘을 클릭하면 설정창을 보여준다. 설정창은 프로그램의 속성을 설정할 수 있고 로그를 볼 수 있다. 설정창은 다음 항목들을 포함한다.
- 로그인 암호
- 테마 설정
- 언어 설정
이것은 권한에 따라 선택적으로 렌더링된다.
2. 다시 설정 아이콘을 클릭하면 설정창을 닫는다.
### (24) Management: 현지화
어플리케이션을 여러가지 다양한 언어로 제공한다. 설정창에서 다른 언어로 바꿀 수 있다.
### (24) Management: Localization
> 어플리케이션을 여러가지 다양한 언어로 제공한다.
> 다음은 다른 언어로 바꾸는 사용 사례이다.
액터: 사용자
시작조건: 없음.
목표: 설정창에서 다른 언어로 바꿀 수 있다.
1. 설정창을 연다.
2. 언어 항목으로 간다. 지원되는 언어 리스트 창이 놓여저있다.
3. 언어 항목에서 다른 언어로 바꾼다. 이때 창을 다시 렌더링한다.
### (25) Management: Theme
액터: 사용자
시작조건: 없음.
목표: 설정창에서 테마를 설정할 수 있다.
1. 설정창에서 테마로 이동한다.
2. 기본적으로 제공하는 밝은 테마과 어두운 테마를 고른다. 기본값은 밝은 색이다. 바꾸는 즉시 테마를 변경한다.
3. 커스텀 css 를 올려서 테마로 등록한다.
### (25) Management: 테마
테마를 설정할 수 있다. 설정창에서 바꿀 수 있고 기본적으로 밝은 테마과 어두운 테마를 제공한다. 커스텀 css 를 테마로 등록할 수 있다.
### (27) Chunk: edit
액터: 사용자
시작조건: Chunk의 Focus를 얻어야 한다.
목표: Chunk안의 컨텐츠를 수정할 수 있다.
액터: 사용자
시작조건: Chunk의 Focus를 얻어야 한다.
1. Chunk 안의 text를 수정한다.
1. 수정가능한 타입인지 확인한다.
2. 타입에 맞는 에디터를 띄운다. 예를 들어 text 타입이면 해당 Chunk 안의 text를 수정할 수 있게 한다.
### (28) Extension: API
액터: API 사용자
시작조건: 없음.
목표: 외부에서 API를 가지고 접근가능하도록 인터페이스를 제공한다.
1. 설정에 들어가서 API 토큰을 발급받는다.
2. api를 사용할때 Header에 발급받은 토큰을 넣고 통신한다.
### (29) Extension: Plugin
액터: 사용자
시작 조건: 없음
목표: Plugin으로 편집환경을 확장 가능하게 한다.
1. 플러그인을 폴더에 추가해 플러그인을 설치한다.
2. 플러그인을 사용한다.
> - 기능 요구사항은 소프트웨어가 입력을 처리하고 출력을 생성하는 기본적인 행동을 정의해야 한다.
> - 포함하는 행동들
> 1. Validity checks on the inputs

View File

@ -1,7 +1,6 @@
#! /usr/bin/env deno run --allow-net --allow-env
import {Issue} from "./githubType.ts";
import {parse} from "https://deno.land/std@0.135.0/flags/mod.ts";
import "https://deno.land/std@0.136.0/dotenv/load.ts";
/**
* get issue from github

View File

@ -69,17 +69,34 @@
}
%>
### 2.2.8 비기능적 기능
- Docker 배포
- .env 설정
- 첫 로드후 로딩 0.5s 이내
- 동시 편집 이용자 5명 이내
- 1000 RPS 정도 버티기
## 2.3. 사용자 특성(User characteristics)
사용자는 기본적인 GUI 조작을 할 줄 알며 인터넷 사용을 원활히 할 수 있고 기본적인 영어를 읽고 쓸 줄 알며, markdown을 작성할 수 있는 사용자로 한정한다. 일반적으로 13세 이상 65세 이하의 사람을 사용자로 가정한다.
## 2.4. 제약사항(Constraints)
- 이 프로젝트는 MIT License로 개발되고 있으므로 라이브러리의 라이센스도 신경을 쓴다.
- XSS 공격에 안전해야 한다.
- 1000 RPS에서 문제없이 작동한다.
- 첫 로드후 로딩하면 0.5s 이내에 동작해야합ㄴ.다
- 동시 편집 이용자를 5명까지는 허용해야 합니다.
이 프로젝트는 MIT License로 개발되고 있으므로 라이브러리의 라이센스도 신경을 쓴다.
> - 개발자의 선택을 제한할 모든 항목에 관한 일반적인 설명을 제공해야 한다.
> - 포함되는 내용
> 1. Regulatory plocies
> 1. Hardware limitations (e.g., signal timing requirements)
> 1. Interfaces to other applications
> 1. Parallel operation
> 1. Audit functions
> 1. Control functions
> 1. Higher-order language requirements
> 1. Signal handshake protocols(e.g., XON-XOFF, ACK-NACK)
> 1. Reliability requirements
> 1. Criticality of the application
> 1. Safety and security considerations
## 2.5. 가정 및 의존성(Assumptions and dependencies)