2022-07-18 ~ 2022-09-29 진행한 NEXTSTEP 만들면서 배우는 Spring 3기 "웹 서버 구현" 미션 구현 코드입니다.
Legacy 코드를 리팩토링 하며 서비스 개선을 했으며 Java로 동작하는 Web Application Server를 구현했습니다.
주요 코드
코드리뷰 링크
- 웹 애플리케이션 서버 요구사항을 파악한다.
- 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
- 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
- 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.
http://localhost:8080/index.html 로 접속했을 때 webapp 디렉토리의 index.html 파일을 읽어 클라이언트에 응답한다.
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
- Header의 첫 번째 라인에서 요청 URL 추출.
“회원가입” 메뉴를 클릭하면 http://localhost:8080/user/form.html 으로 이동하면서 회원가입할 수 있다. 회원가입한다.
// 회원가입을 하면 다음과 같은 형태로 사용자가 입력한 값이 서버에 전달된다.
/create?userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net
HTML과 URL을 비교해 보고 사용자가 입력한 값을 파싱해 model.User 클래스에 저장한다.
GET /user/create?userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
- 추출한 요청 URL에서
접근 경로와 이름=값을 추출하여 User 클래스에 담는다. - 단위 테스트를 진행하며 개발한다.
http://localhost:8080/user/form.html 파일의 form 태그 method를 get에서 post로 수정한 후 회원가입 기능이 정상적으로 동작하도록 구현한다.
POST /user/create HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 59
Content-Type: application/x-www-form-urlencoded
Accept: */*
userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net
- form.html 파일의 form 태그 method를 get에서 post로 수정한다.
- 회원가입 기능이 정상적으로 동작하도록 구현한다.
“회원가입”을 완료하면 /index.html 페이지로 이동하고 싶다.
현재는 URL이 /user/create 로 유지되는 상태로 읽어서 전달할 파일이 없다.
따라서 redirect 방식처럼 회원가입을 완료한 후 “index.html”로 이동해야 한다.
즉, 브라우저의 URL이 /index.html로 변경해야 한다.
- 회원가입 완료 시 302 Found StatusCode를 이용하여 index.html로 redirect 한다.
“로그인” 메뉴를 클릭하면 http://localhost:8080/user/login.html 으로 이동해 로그인할 수 있다.
로그인이 성공하면 index.html로 이동하고, 로그인이 실패하면 /user/login_failed.html로 이동해야 한다.앞에서 회원가입한 사용자로 로그인할 수 있어야 한다.
로그인이 성공하면 cookie를 활용해 로그인 상태를 유지할 수 있어야 한다.
로그인이 성공할 경우 요청 header의 Cookie header 값이 logined=true, 로그인이 실패하면 Cookie header 값이 logined=false로 전달되어야 한다.
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
Cookie: logined=true
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: logined=true; Path=/
- 회원가입, 로그인 기능을 분리한다.
- Cookie 기능을 구현한다.
- 요청, 응답 책임을 추상화한다.
접근하고 있는 사용자가 “로그인” 상태일 경우(Cookie 값이 logined=true) 경우
http://localhost:8080/user/list 로 접근했을 때 사용자 목록을 출력한다.
만약 로그인하지 않은 상태라면 로그인 페이지(login.html)로 이동한다.
동적으로 html을 생성하기 위해 handlebars.java template engine을 활용한다.
- index.html 에서 사용자 목록 페이지에 접근할 수 있도록 한다.
- Handlebars.java template engine을 활용한다.
- 사용자가 로그인 한 상태일 경우 사용자 목록 조회 기능을 구현한다.
- 사용자가 로그인 하지않은 상태일 경우 로그인 페이지로 이동한다.
지금까지 구현한 소스 코드는 stylesheet 파일을 지원하지 못하고 있다.
Stylesheet 파일을 지원하도록 구현하도록 한다.
GET ./css/style.css HTTP/1.1
Host: localhost:8080
Accept: text/css,*/*;q=0.1
Connection: keep-alive