2020-11-25(Wed)

  1. 학습 날짜 // 2020-11-25(수)

  2. 학습시간 // 9:00~22:00

  3. 학습 범위 및 주제 // Webserv 에러잡기

  4. 동료 학습 방법 // sanam, yohai님과 토의

  5. 학습 목표 // webserv 에러를 잡는다.

  6. 상세 학습 내용

내 추측이 옳았다.

요청을 받을 때 속도를 위해 BUFFER_SIZE만큼 읽고 그 안에 포함된 request_line과 headers을 동시에 처리하겠다고 상정하여 receiveRequestWithoutBody 함수를 만들었던 바 있다.

문제는 우리 예상대로 요청이 들어오지 않는 경우-request_line만 포함된 경우, request_line이 포함되지 않은 경우, headers만 포함된 경우, 포함되지 않은 경우, 둘다 함께 포함된 경우, 둘다 함께 포함되었는데 headers는 끝까지 포함되지 않은 경우 등등-의 경우의 수가 많다보니 코드가 복잡해지고 오류가 많아지는 다는 것이다. 특히 CRLF가 읽어온 데이터의 끝에 걸린다면 바로 recv를 한칸만 더 해서 확인해보면 좋을텐데 subject 제약에 따라 select 거쳐서 recv를 해야한다는 점, errno 체크도 못한다는 점에서 매우 분기가 복잡해진다. 하나의 문제를 해결하면 다른 곳에서 문제가 터지는 것이 이 때문이다.

그래서, 우선 설계부터 바꾸기로 하였다.

시작은 recevieRequestWithoutBody를 receiveRequestLine과 receiveRequestHeaders로 나누는 것부터 했는데 굉장히 만족스럽게 문제를 해결할 수 있었다.

  1. 학습 내용에 대한 개인적인 총평

역시 문제를 바라볼 때 우선 구조화해서 쪼개보는 것이 중요한 것 같습니다. 그런데 이번 문제는 그렇게 해도 잘 해결이 되지 않아서 분석해보았더니, 쪼개어진 문제를 하나의 함수로 한꺼번에 해결하려다보니 지지부진했다는게 드러났습니다. 쪼개어진 문제를 함수를 쪼개어 대응하였더니 구조가 직관적으로 바뀌고 가독성도 좋아진게 느껴집니다. 슬슬 끝이보이네요.

다음 학습 계획

  • Webserv 오류잡기

Last updated