Repository files navigation
웹 애플리케이션 서버 요구사항을 파악한다.
요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
다음 단계를 도전하고 앞의 과정을 반복한다.
코드 리뷰가 완료되면 피드백에 대한 개선 작업을 한다.
다음 단계 PR 보낼 때 이전 단계 피드백이 잘 반영되었는지 점검한다.
홈페이지를 띄우면 request 알림이 온다는 사실을 알 수 있었다.
header 내용에 해당하는 GET /index.html HTTP/1.1은 정해진 HTTP 규격에 따라 html 파일을 전해달라는 뜻임을 알 수 있었다.
1단계 구현 중 학습하게 된 내용 또는 용어 정리
inputStream은 네트워크로부터 얻어온 byte단위 숫자이다.
inputStreamReader가 이것을 읽고 문자열로 번역하는 작업을 수행한다.
BufferedReader가 문자열을 하나씩 꺼내서 읽을 수 있도록 번역한 문자열을 모아놓는 작업을 수행한다.
log.debug를 통해 읽어낸 stream을 한줄씩 출력한다. 이때 header에는 필요한 파일을 가져다달라는 문구가 출력된다.
필요한 파일을 가져다주기 위해 토큰을 공백 단위로 분리해내는 작업을 수행한다.
그 후 Files.readAllBytes를 이용하여 .webapp에 있는 파일으로부터 byte를 읽어와 저장한다. 이때 url은 이미 읽어온 요구하는 파일을 바탕으로 반영한다.
이후 실제 바이트 파일을 화면에 출력한다.
Paths.get(url).normalized().toString()을 통해 ./나 ../같은 경로 이동 흔적을 제외하고 필요한 경로만 찾아낼 수 있다.
2단계 구현 중 학습하게 된 내용 또는 용어 정리
extractPath에서 반환한 String을 ? 기준으로 앞과 뒤를 구분하여 경로와 사용자 정보로 구분한다.
사용자 정보는 & 기준으로 객체 인스턴스로 구분이 가능하다.
=을 기준으로 객체의 이름과 값을 구분한다.
받아온 HashMap에서 객체 이름을 기준으로 value 값을 받아와 객체를 생성한다.
Paths.normalized()에 ?가 들어가면 오류를 뿜으며 강제 종료된다.
따라서 extractPath에서 정규화를 하는 것이 아닌 ?가 있는지 없는지 판단한 후 ?가 있는 부분을 제거하고 정규화를 진행해야 한다.
URLDecoder.decode(value, "UTF-8")를 통해 메시지가 한글이나 특수문자가 와도 해독할 수 있다.
3단계 구현 중 학습하게 된 내용 또는 용어 정리
HTTP의 POST 메소드는 GET 메소드와 다르게 링크로 중요한 정보가 노출되는 것이 아닌 response 이후에 따로 정보가 저장된다는 사실을 알 수 있었다.
Content-Length에 HTTP body의 크기가 저장되는데 Content-Length으로 문자열이 시작할 경우 해당 정보를 extractLength 메소드를 통해 받아온다.
Header의 내용을 readLine()이 읽어오는데 HTTP body는 Header 내용 이후 한줄 띄고 시작하기에 Header 내용을 모두 불러오면 line.isEmpty()에 걸려 Header를 읽는 로직이 끝난다.
이후 readData()를 통해 body 내용을 읽어온다.
/user/create일 경우에만 회원가입을 후 리다이렉션을 진행하므로 리다이렉션 전용 응답인 302번을, 그렇지 않으면 200번을 응답으로 보낸다.
Location: /index.html으로 redirection 위치를 지정하여 자동으로 이동하게 구현한다.
You can’t perform that action at this time.