[42Seoul] - Webserv

Joey·2023년 6월 5일
0

42 SEOUL

목록 보기
20/20



1.무엇을 하는 과제인가?

: I/O Multiplexing 기술을 활용한 서버를 만드는 과제이다.
: Multi thread, Multi processing을 하는 방법을 넘어서 우리가 원하는 이벤트를 이벤트 루프에 넣고 이를 하나씩 처리 하는 방식을 배우게 된다.
: Webserv가 어떻게 돌아가는지 배우게 되고,
1) config 파일을 파싱 > 2) 클라이언트의 요청 수신(이벤트 루프) > 3) 클라이언트 요청 파싱 > 4) 정적처리 / cgi처리(이벤트 루프) > 5) 클라이언트로 송신(이벤트 루프)등의 과정을 배우게 된다.

-. 이 과제는 본 과정의 과제 중에서 추천 과제로 꼽히는데, 그 이유는 그간 배웠던 것들의 많은 것들을 사용해야 하기 때문이다.
: 아래의 내용 외에도 다양한 것들이 많이 사용되었다.
1)minishell의 파싱과 파이프 처리들
2)philosopher의 멀티프로세스/멀티쓰레드(직접적으로는 안쓰이고 I/O multiplexing을 이해하기 위해 쓰인다.)
3)netpractice의 지식들
4)cpp 및 container에서 배웠던 cpp활용법들
5)inception에서 쓰인 nginx에 대한 이해도 및 도커(우리 팀은 epoll을 사용해서, 클러스터 환경에서 돌아가지 않았기 때문에 도커를 운용하였다.))




2.과제를 하면서 참고 했던 곳들

1) 정리를 잘 해두신 카뎃분들

: 워낙 알아야 하는 내용들이 많았던 과제였는데, 먼저 진행하였던 카뎃분들이 정리를 잘해주셔서 참고해서 과제를 수행할 수 있었다. 카뎃분들의 링크를 달까 하다가 전부 허락을 받지 않은 상태라 이 부분은 넘어가도록 하겠다. slack에 조금만 검색해도 많은 내용들이 나온다.


2) 서버 설정 파일(config) 관련

-.nginx parsing
: nginx의 config 파일의 server block과 location block을 어떻게 파싱했는지 보여준다.
링크 : https://www.nginx.com/wp-content/uploads/2018/12/NGINX-Conf-2018-slides_Hulegaard-config-analysis.pdf

-.nginx development guide
: nginx가 어떻게 이뤄졌는지 살펴볼 수 있다. 꽤 긴 글이라서 시간을 두고 읽어야 한다.
링크 : https://nginx.org/en/docs/dev/development_guide.html#http_phases


3) Event 함수 관련

: Epoll로 팀은 진행하였지만, 해당 함수는 따로 깊이 공부를 해보진 못하였고, kqueue 함수를 직접 써보고 에코서버들을 구현해 보았다.

-. 소켓프로그래밍 관련(에코서버 만들기)
: 전체를 다 설계하고 하는 것보다 미니 서버를 만들어보고(유닛 테스트), 다른 것들과 함께 설계하는 것을 추천한다.
링크1(긱스) : https://www.geeksforgeeks.org/socket-programming-cc/
링크2(파이썬 서버) : https://uiandwe.tistory.com/1245

-. 블로킹과 논블로킹에 대한 강의
링크 : https://www.youtube.com/watch?v=mb-QHxVfmcs

-. I/O multiplexing 쉽게 설명하신 분
링크 : https://blog.naver.com/n_cloudplatform/222255261317

-. kqueue 공식 site
링크 : https://man.freebsd.org/cgi/man.cgi?kqueue


4) cgi관련

: 다양한 request에 대하여 하나씩 다 처리를 해주었는데, 알고보니 cgi로도 가능한 것을 알고 나중에 굉장히 허무했다. 처음에 구현한 함수들도 크게 이상은 없었으나, cgi로 바꾸는게 맞다고 생각되어 대부분 교체하였다.(예를 들면 multipart/form-data의 경우 body가 특이한 형태로 들어오는데, 이걸 하나씩 다 처리를 해줬었는데 알고 보니 cgi에 넣어주면 알아서 처리를 해줘서 허무했다.)

-.cgi 설명
링크: https://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm

-.cgi 예제
링크 : https://kibua20.tistory.com/107

-.POST를 어떻게 cgi로 처리할 것인지에 대한 내용. POST의 정보들은 BODY에 실려 나간다.
링크 : https://www.oreilly.com/library/view/cgi-programming-on/9781565921689/07_chapter-04.html

-.파일 보내기(multipart/form-data)
링크1 : https://lng1982.tistory.com/209
링크2 : https://lena-chamna.netlify.app/post/http_multipart_form-data/


5) RFC관련

: RFC는 Request for comment로서 공식문서로 현 시대에서 인정받고 있으나, 이 내용들이 전부 프로그램들에 반영되어 있지는 않다. Must에 대한 내용들만 구현하길 추천한다.

-.RFC해석본
링크1 : https://roka88.dev/106
링크2(개인적 추천) : https://hochan049.gitbook.io/cs-interview/web/rfc-7320


6) 기타

: 과제를 하면서 도움이 많이 되었던 내용들이다.

-.웹 입문자를 위한 강의
링크 : https://rentry.co/pr7bs

-.HTTPS 작동방식
링크 : https://howhttps.works/ko/

-.쿠키 vs 세션
링크1 : https://zorba91.tistory.com/163
링크2 : https://interconnection.tistory.com/74
링크3 : https://hongong.hanbit.co.kr/%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-%ED%86%A0%ED%81%B0-%EC%BA%90%EC%8B%9C-%EA%B7%B8%EB%A6%AC%EA%B3%A0-cdn/

-.JWT Token
링크 : https://brunch.co.kr/@jinyoungchoi95/1

-.O Auth
링크 : https://neverfadeaway.tistory.com/44?category=1140611

-.디자인패턴 강의
: 설계할때 많은 도움이 되었다.
링크 : https://www.youtube.com/watch?v=jlQkWM7Tu7o&list=PLDV-cCQnUlIZcWXE4PrxJx6U3qKfRTJcK


3.회고

1) 설계의 중요성

: 사실 이 과제는 nginx의 일부분을 구현하는 과제라고 해도 될 정도로 nginx 기반으로 설계를 하면 된다. rfc와 nginx의 공식문서를 보고 설계를 해야되는데 아무래도 공식문서에 약한 나에게는 꽤 힘든 과제였다. 앞으로도 공식 문서 기반으로 많은 것들을 봐야 되는데, 억지로라도 더 봐야겠다는 생각을 많이 하게 되었다. 팀원들이 꼼꼼히 공식문서부터 보는 스타일이라 설계를 탄탄히 한 덕분에 서버가 크게 문제되는 일은 없었다.

2) 더하지 못한 아쉬움

: 서버는 문제가 없었지만, 아무래도 다양하게 에러를 접하고 무언가를 더 해볼 수 있는 기회가 있었으면 하는 생각이 많이 들었다. 내가 담당했던 http파싱, response 작성 영역, cgi프로그램들은 생각보다 미리 끝나서 팀원들을 계속 기다려야 했었다.(잘한게 아니라 다른 기능에 비해서 비교적 구현이 쉬웠다.)

3) 팀원들과의 호흡의 중요성

: 이곳에 오면서 많은 사람들과 팀 활동을 진행해야 겠다는 생각이 들었다. 그래서 이번 팀도 기존에 아는 분들이 아닌 새로운 분들과 진행하였다. 이번 팀과는 조금은 스타일이 안맞는 부분(나는 빠른 구현에 집중하고, 팀원들은 탄탄한 설계에 집중함)이 있었지만 다름이 있기에 배울 수 있는 부분도 있었다. 팀원들의 장점을 완전히 흡수할 지는 의문이었지만, 지금 어떤 부분이 내게 부족하고 보충해야 되는지를 느낄 수 있었다.

4) 협업

: 팀원들이 도커와 git사용에 능숙해서 많은 것을 배울 수 있었다. 사실 git을 clone, commit, push에만 집중을 해서 그 외는 잘 사용하지 않았는데, 브랜치를 나눠서 협업도 해보고, pull request시에는 항상 리뷰를 진행하였다. 또한 git project를 사용하여서 프로젝트 전반적인 것을 관리도 해보았다.

profile
세상을 이롭게 하는 프로그램 만들기

0개의 댓글