2020-11-25(Wed)
학습 날짜 // 2020-11-25(수)
학습시간 // 9:00~22:00
학습 범위 및 주제 // Webserv 에러잡기
동료 학습 방법 // sanam, yohai님과 토의
학습 목표 // webserv 에러를 잡는다.
상세 학습 내용
내 추측이 옳았다.
요청을 받을 때 속도를 위해 BUFFER_SIZE만큼 읽고 그 안에 포함된 request_line과 headers을 동시에 처리하겠다고 상정하여 receiveRequestWithoutBody 함수를 만들었던 바 있다.
문제는 우리 예상대로 요청이 들어오지 않는 경우-request_line만 포함된 경우, request_line이 포함되지 않은 경우, headers만 포함된 경우, 포함되지 않은 경우, 둘다 함께 포함된 경우, 둘다 함께 포함되었는데 headers는 끝까지 포함되지 않은 경우 등등-의 경우의 수가 많다보니 코드가 복잡해지고 오류가 많아지는 다는 것이다. 특히 CRLF가 읽어온 데이터의 끝에 걸린다면 바로 recv를 한칸만 더 해서 확인해보면 좋을텐데 subject 제약에 따라 select 거쳐서 recv를 해야한다는 점, errno 체크도 못한다는 점에서 매우 분기가 복잡해진다. 하나의 문제를 해결하면 다른 곳에서 문제가 터지는 것이 이 때문이다.
그래서, 우선 설계부터 바꾸기로 하였다.
시작은 recevieRequestWithoutBody를 receiveRequestLine과 receiveRequestHeaders로 나누는 것부터 했는데 굉장히 만족스럽게 문제를 해결할 수 있었다.
학습 내용에 대한 개인적인 총평
역시 문제를 바라볼 때 우선 구조화해서 쪼개보는 것이 중요한 것 같습니다. 그런데 이번 문제는 그렇게 해도 잘 해결이 되지 않아서 분석해보았더니, 쪼개어진 문제를 하나의 함수로 한꺼번에 해결하려다보니 지지부진했다는게 드러났습니다. 쪼개어진 문제를 함수를 쪼개어 대응하였더니 구조가 직관적으로 바뀌고 가독성도 좋아진게 느껴집니다. 슬슬 끝이보이네요.
다음 학습 계획
Webserv 오류잡기
Last updated