설계 | 클래스 명세서

객체 설계가 프로그램에 필요한 객체들을 관계성에 기반하여 멤버 변수와 함께 정의하는 작업이라면, 클래스 명세는 각각의 클래스에 대해 멤버 변수는 물론 멤버 메소드, 스태틱 변수까지 보다 상세하게 정의하는 작업입니다.

저희는 플로우 차트에 더해 클래스 명세서까지 작성함으로써 필요한 모든 변수와 함수, 처리 흐름을 사전에 명확하게 정의했고, 덕분에 구현 단계에서 불필요한 커뮤니케이션 비용이 거의 없었습니다. 덕을 톡톡히 봤죠. 지나고 나서 아쉬웠던 것은, 명세서의 형식을 단순화하다보니 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