설계 | 클래스 명세서
객체 설계가 프로그램에 필요한 객체들을 관계성에 기반하여 멤버 변수와 함께 정의하는 작업이라면, 클래스 명세는 각각의 클래스에 대해 멤버 변수는 물론 멤버 메소드, 스태틱 변수까지 보다 상세하게 정의하는 작업입니다.
저희는 플로우 차트에 더해 클래스 명세서까지 작성함으로써 필요한 모든 변수와 함수, 처리 흐름을 사전에 명확하게 정의했고, 덕분에 구현 단계에서 불필요한 커뮤니케이션 비용이 거의 없었습니다. 덕을 톡톡히 봤죠. 지나고 나서 아쉬웠던 것은, 명세서의 형식을 단순화하다보니 enum, variable, method 등 항목마다 가진 개별적 속성들을 잘 기입하지 못했다는 것입니다. 다음 작업에서는 보다 나은 명세서 형식을 찾아야겠다는 생각을 했습니다.
여러분만의 형식으로 클래스 명세서를 작성해보세요.
프로젝트 초기 학습 단계에 제작했던 명세서들로, 저희가 최종적으로 이해한 내용이나 구현한 결과물과는 차이가 있습니다. 특히 Server나 Connection에 많은 멤버 변수와 메소드가 추가되었고, Libft나 static method들은 따로 작성하지 않았습니다. 참고만 하세요.
1. Config
Configuration 파일의 Server Block 밖 정보들을 저장한다. ServerManager 객체의 멤버 변수로 사용된다. |
번 | 이름 | 종류 | 역할 | 접근자 | 비고 |
1 | m_software_name | data | 웹서버 소프트웨어 이름 | private | string |
2 | m_software_version | data | 웹서버 소프트웨어 버전 | private | string |
3 | m_http_version | data | HTTP 프로토콜 버전 | private | string(1.1 fix) |
4 | m_cgi_version | data | CGI 사양 | private | string(1.1 fix) |
5 | m_base_env | data | main 함수에 의해 전달된 환경변수 | private | char** |
6 | get_m_software_name | method | getter | public | |
7 | get_m_softwrae_version | method | getter | public | |
8 | get_m_http_version | method | getter | public | |
9 | get_m_cgi_version | method | getter | public | |
10 | get_m_base_env | method | getter | public | |
11 | Config | generator | 생성자 | public | param(config_block, env) |
2. Location
Configuration 파일의 Location Block 안 정보들을 저장한다. Server 객체의 멤버 변수로 사용된다. |
번 | 이 | 종류 | 역할 | 접근자 | 비고 |
1 | m_uri | data | getter | private | |
2 | m_root_path | data | 웹서버 소프트웨어 이름 | private | string |
3 | m_allow_method | data | 허용하는 메소드 | private | string set, GET과 HEAD는 default |
4 | m_auth_basic_realm | data | 인증 영역 이름 | private | string |
5 | m_auth_basic_file | data | 인증 파일 데이터 | private | string:string map |
6 | m_index | data | 인덱스 파일 | private | string set |
7 | m_cgi | data | 허용하는 cgi 확장자 | private | string set |
8 | m_autoindex | data | 오토인덱스 설정여부 | private | bool |
9 | get_m_uri | method | getter | public | |
10 | get_m_root_path | method | getter | public | |
11 | get_m_allow_method | method | getter | public | |
12 | get_m_auth_basic_realm | method | getter | public | |
13 | get_m_auth_basic_file | method | getter | public | |
14 | get_m_index | method | getter | public | |
15 | get_m_cgi | method | getter | public | |
16 | get_m_autoindex | method | getter | public | |
17 | Location | generator | 생성자 | public | param(location_block) |
3. Connection
Server 소켓으로 들어오는 연결에 관한 정보들을 저장한다. Server 객체의 멤버 변수로 사용된다. |
번호 | 이름 | 종류 | 역할 | 접근자 | 비고 |
1 | m_fd | data | 클라이언트 fd | private | int |
2 | m_last_request_at | data | 최근 request 시각 | private | timeval |
3 | m_client_ip | data | 클라이언트 ip | private | string |
4 | m_client_port | data | 클라이언트 port | private | int |
5 | get_m_fd | method | getter | public | |
6 | get_m_last_request_at | method | getter | public | |
7 | get_m_client_ip | method | getter | public | |
8 | get_m_client_port | method | getter | public | |
9 | set_m_last_reqeust_at | method | setter | public | |
9 | Connection | generator | 생성자 | public | param(cliend_fd, client_ip, client_port) |
4. Request
Request 정보들을 저장한다. 단일 쓰레드에서는 Request가 한 번에 하나씩 완전히 처리되기 때문에 다른 객체에 의해 관리되지 않는다. |
번호 | 이름 | 종류 | 역할 | 접근자 | 비고 |
1 | Method | enum | method 열거 | private | GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE |
2 | URIType | enum | uri type 열거 | private | DIRECTORY, FILE, CGI_PROGRAM |
3 | TransferType | enum | transfer type 열거 | private | GENERAL, CHUNKED |
4 | m_connection | data | request가 송신되는 커넥션 객체 참조 | private | Connection* |
5 | m_server | data | request가 처리되는 서버 객체 참조 | private | Server* |
6 | m_location | data | request uri가 속해있는 location 참조 | private | Location* |
7 | m_start_at | data | request 처리가 시작된 시각 저장 | private | timeval |
8 | m_method | data | request method | private | Method(enum) |
9 | m_uri | data | request uri | private | string |
10 | m_uri_type | data | request uri type | private | URIType(enum) |
11 | m_headers | data | request message의 header 저장 | private | string:string map |
12 | m_trasfer_type | data | request transfer type | private | TransferType(enum) |
13 | m_content | data | request body | private | string |
14 | m_origin | data | request message 원본 저장 | private | string, TRACE 메소드에 대한 응답 목적 |
15 | get_m_connection | method | getter | public | |
16 | get_m_server | method | getter | public | |
17 | get_m_location | method | getter | public | |
18 | get_m_method | method | getter | public | |
19 | get_m_uri | method | getter | public | |
20 | get_m_uri_type | method | getter | public | |
21 | get_m_headers | method | getter | public | |
22 | get_m_transfer_type | method | getter | public | |
23 | get_m_content | method | getter | public | |
24 | get_m_origin | method | getter | public | |
25 | isOverTime | method | request가 시작한지 오래되었는지 확인 | public | ret(timeval), 현재 시각과 m_start_at의 차이 계산 |
26 | addContent | method | m_content 끝에 인자 string을 붙여넣음 | public | param(added_content) |
27 | addOrigin | method | m_origin 끝에 인자 string을 붙여넣음 | public | param(added_origin) |
28 | addHeader | method | header 라인 1줄을 파싱하여 m_headers에 저장 | public | param(string header) |
29 | isValidHeader | method | header 라인 1줄의 형식 유효성과 중복여부 검사 | public | param(string header) |
30 | Request | generator | 생성자 | public | param(connection, server, start_line) |
5. Response
Response 정보들을 저장한다. 한번에 몰아서 전송하며, 전송 순서 보장을 위해 서버 객체에 Queue 자료구조로 저장된다. |
번호 | 이름 | 종류 | 역할 | 접근자 | 비고 |
1 | TransferType | enum | transfer type 열거 | private | GENERAL, CHUNKED |
2 | status | data | status code와 사유구절(des)/응답본문(body) 저장 | private | static data, int:vector<string> map |
3 | m_connection | data | response 송신할 커넥션 참조 | private | Connection* |
4 | m_status_code | data | status code | private | int |
5 | m_status_description | data | 사유구절 | private | string |
6 | m_headers | data | 송신에 사용될 header 저장 | private | string:string map |
7 | m_transfer_type | data | response transfer type | private | TransferType(enum) |
8 | m_content | data | response body | private | string |
9 | get_m_connection | method | getter | public | |
10 | get_m_status_code | method | getter | public | |
11 | get_m_status_description | method | getter | public | |
12 | get_m_headers | method | getter | public | |
13 | get_m_transfer_type | method | getter | public | |
14 | get_m_content | method | getter | public | |
15 | addHeader | method | 전송할 header를 m_headers에 추가 | public | param(header_key, header_value) |
16 | c_str | method | 멤버 변수들을 취합하여 respone message 생성 | public | ret(char *) |
17 | make_status | function | status 초기화 함수 | ||
18 | Response | generator | 생성자 | public | param(connection *, status_code, body = "") |
6. Server
웹서버의 역할(HTTP 프로토콜에 따라 Request 수신, 해결, Response 생성 및 전송)을 수행한다. Config, Locations, Responses, Connections 등 웹서버의 역할을 하는 데 필요한 대부분의 Class를 멤버 변수로 지닌다. 여러 개 생성될 수 있다. |
번호 | 이름 | 종류 | 역할 | 접근자 | 비고 |
1 | m_manager | data | 자신을 관리하는 서버 매니저 참조 | private | ServerManager* |
2 | m_server_name | data | 서버 이름을 저장 | private | string |
3 | m_host | data | 서버 host 저장 | private | string |
4 | m_port | data | 서버 port 저장 | private | int |
5 | m_fd | data | 서버 소켓 fd 저장 | private | int |
6 | m_request_uri_limit_size | data | 허용하는 uri 최대 크기 | private | int |
7 | m_request_header_limit_size | data | 허용하는 header 최대 크기 | private | int |
8 | m_limit_client_body_size | data | 허용하는 body 최대 크기 | private | int |
9 | m_default_error_page | data | default 에러 페이지 | private | string, 읽어서 저장 |
10 | m_config | data | config 저장 | private | Config* |
11 | m_locations | data | server에 속한 location 저장 | private | Location vector |
12 | m_connections | data | server에 속한 connection 저장 | private | int:Connection map |
13 | m_responses | data | sever에 속한 response 저장 | private | Response Queue |
14 | hasException | method | 특정 커넥션에 대해 예외 발생여부 확인 | private | ret(bool), param(client_fd) |
15 | closeConnection | method | 특정 커넥션 제거 | private | param(client_fd) |
16 | isSendable | method | response 전송 가능여부 확인 | private | param(client_fd) |
17 | sendResponse | method | response 전송 | private | param(response) |
18 | hasRequest | method | 특정 커넥션에 대한 리퀘스트 존재여부 확인 | private | param(client_fd) |
19 | recvRequest | method | 특정 커넥션에 대한 리퀘스트 수신 | private | ret(request), param(client_fd) |
20 | solveRequest | method | 수신한 리퀘스트 처리 | private | param(request) |
21 | executeAutoindex | method | autonidex 실행 | private | |
22 | executeGet | method | GET method 실행 | private | param(request) |
23 | executeHead | method | HEAD method 실행 | private | param(request) |
24 | executePut | method | PUT method 실행 | private | param(request) |
25 | executePost | method | POST method 실행 | private | param(request) |
26 | executeDelete | method | DELETE method 실행 | private | param(request) |
27 | executeOptions | method | OPTIONS method 실행 | private | param(request) |
28 | executeTrace | method | TRACE method 실행 | private | param(request) |
29 | createCGIEnv | method | CGI 환경변수 생성 | private | ret(char **) |
30 | executeCGI | method | CGI 프로그램 실행 | private | param(request) |
31 | createResponse | method | 응답 객체 생성 | private | param(status_code), 응답 queue에 push |
32 | hasNewConnection | method | 서버 소켓 fd에 대한 연결 요청 확인 | private | ret(bool) |
33 | acceptNewConnection | method | 새로운 클라이언트 fd 생성 | private | |
34 | run | method | 커넥션들들을 순회하며 예외, 요청, 응답, 연결 작업 실행 | public | |
35 | Server | generator | 서버 블록과 로케이션 블록 기반으로 서버 생성 | public | param(ServerManager*, server_block, location blocks, Config*) |
7. ServerManager
웹서버들을 관리한다. configuration file을 parse한 Config 객체와 Select 함수를 실행하는 데 필요한 fd_set들을 멤버 변수로 저장한다. |
번호 | 이름 | 종류 | 역할 | 접근자 | 비고 |
1 | SetType | enum | fd_set type | public | WRITE_SET, WRITE_COPY_SET, READ_SET, READ_COPY_SET, ERROR_SET, ERROR_COPY_SET |
2 | m_servers | data | server 객체들 | private | server vector |
3 | m_config | data | configuration 파일을 파싱한 결과 | private | Config |
4 | m_max_fd | data | 관리하는 서버의 max_fd 중 가장 큰 fd | private | int |
5 | m_read_set | data | 요청 발생여부 확인을 위한 fd_set | private | fd_set |
6 | m_read_copy_set | data | select에 실제 인자로 넣을 read_set | private | fd_set |
7 | m_write_set | data | 응답 송신 가능여부 확인을 위한 fd_set | private | fd_set |
8 | m_write_copy_set | data | select에 실제 인자로 넣을 write_set | private | fd_set |
9 | m_error_set | data | 예외 발생여부 확인을 위한 fd_set | private | fd_set |
10 | m_error_copy_set | data | select에 실제 인자로 넣을 error_set | private | fd_set |
11 | splitConfigString | method | config 파일을 config block/server strings로 분리 | private | ret(bool), param(config_string, config_block, server_string vector) |
12 | splitServerString | method | server string을 server/location blocks로 분리 | private | ret(bool), param(server_string, server_block, location_block vector) |
13 | isValidConfigBlock | method | config block 유효성 확인 | private | ret(bool), param(config_block) |
14 | isValidServerBlock | method | server block 유효성 확인 | private | ret(bool), param(server_block) |
15 | isValidLocationBlock | method | location block 유효성 확인 | private | ret(bool), param(location_block) |
16 | get_m_config | method | getter | public | ret(Config) |
17 | get_m_max_fd | method | getter | public | ret(int) |
18 | set_m_config | method | setter | public | param(config) |
19 | set_m_max_fd | method | setter | public | param(fd) |
20 | fdSet | method | FD_SET | public | param(fd, SetType) |
21 | fdZero | method | FD_ZERO | public | param(SetType) |
22 | fdClear | method | FD_CLR | public | param(fd, SetType) |
23 | fdIsset | method | FD_ISSET | public | param(fd, SetType) |
24 | fdCopy | method | origin set에서 copy set으로 복사 | public | param(SetType) / Origin SetType |
25 | exitServer | method | 에러 메시지 출력 후 프로그램 종료 | public | |
26 | createServer | method | 서버 객체 생성 | public | |
27 | runServer | method | 관리하고 있는 전체 서버 실행 | public | |
28 | ServerManager | generator | 생성자 | public |
Last updated