설계 | 클래스 명세서
Last updated
Last updated
객체 설계가 프로그램에 필요한 객체들을 관계성에 기반하여 멤버 변수와 함께 정의하는 작업이라면, 클래스 명세는 각각의 클래스에 대해 멤버 변수는 물론 멤버 메소드, 스태틱 변수까지 보다 상세하게 정의하는 작업입니다.
저희는 플로우 차트에 더해 클래스 명세서까지 작성함으로써 필요한 모든 변수와 함수, 처리 흐름을 사전에 명확하게 정의했고, 덕분에 구현 단계에서 불필요한 커뮤니케이션 비용이 거의 없었습니다. 덕을 톡톡히 봤죠. 지나고 나서 아쉬웠던 것은, 명세서의 형식을 단순화하다보니 enum, variable, method 등 항목마다 가진 개별적 속성들을 잘 기입하지 못했다는 것입니다. 다음 작업에서는 보다 나은 명세서 형식을 찾아야겠다는 생각을 했습니다.
여러분만의 형식으로 클래스 명세서를 작성해보세요.
프로젝트 초기 학습 단계에 제작했던 명세서들로, 저희가 최종적으로 이해한 내용이나 구현한 결과물과는 차이가 있습니다. 특히 Server나 Connection에 많은 멤버 변수와 메소드가 추가되었고, Libft나 static method들은 따로 작성하지 않았습니다. 참고만 하세요.
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)
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)
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)
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)
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 = "")
웹서버의 역할(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*)
웹서버들을 관리한다. 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