/nextstep-jwp-was

2022.07.18 ~ 2022.09.29 넥스트스텝 작업 내역: Java로 만드는 WAS

Primary LanguageJava

웹 애플리케이션 서버

2022-07-18 ~ 2022-09-29 진행한 NEXTSTEP 만들면서 배우는 Spring 3기 "웹 서버 구현" 미션 구현 코드입니다.
Legacy 코드를 리팩토링 하며 서비스 개선을 했으며 Java로 동작하는 Web Application Server를 구현했습니다.

주요 코드

코드리뷰 링크

진행 방법

  • 웹 애플리케이션 서버 요구사항을 파악한다.
  • 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
  • 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
  • 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.

온라인 코드 리뷰 과정

2단계 - HTTP 웹 서버 구현

기능 요구사항1

http://localhost:8080/index.html 로 접속했을 때 webapp 디렉토리의 index.html 파일을 읽어 클라이언트에 응답한다.

GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
  • Header의 첫 번째 라인에서 요청 URL 추출.

기능 요구사항2

“회원가입” 메뉴를 클릭하면 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 클래스에 저장한다.

HTTP Request Header 예

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 클래스에 담는다.
  • 단위 테스트를 진행하며 개발한다.

기능 요구사항3

http://localhost:8080/user/form.html 파일의 form 태그 method를 get에서 post로 수정한 후 회원가입 기능이 정상적으로 동작하도록 구현한다.

HTTP Request Header 예

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로 수정한다.
  • 회원가입 기능이 정상적으로 동작하도록 구현한다.

기능 요구사항4

“회원가입”을 완료하면 /index.html 페이지로 이동하고 싶다.
현재는 URL이 /user/create 로 유지되는 상태로 읽어서 전달할 파일이 없다.
따라서 redirect 방식처럼 회원가입을 완료한 후 “index.html”로 이동해야 한다.
즉, 브라우저의 URL이 /index.html로 변경해야 한다.

  • 회원가입 완료 시 302 Found StatusCode를 이용하여 index.html로 redirect 한다.

기능 요구사항5

“로그인” 메뉴를 클릭하면 http://localhost:8080/user/login.html 으로 이동해 로그인할 수 있다.
로그인이 성공하면 index.html로 이동하고, 로그인이 실패하면 /user/login_failed.html로 이동해야 한다.

앞에서 회원가입한 사용자로 로그인할 수 있어야 한다.
로그인이 성공하면 cookie를 활용해 로그인 상태를 유지할 수 있어야 한다.
로그인이 성공할 경우 요청 header의 Cookie header 값이 logined=true, 로그인이 실패하면 Cookie header 값이 logined=false로 전달되어야 한다.

HTTP Request Header 예

GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
Cookie: logined=true

HTTP Response Header 예

HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: logined=true; Path=/
  • 회원가입, 로그인 기능을 분리한다.
  • Cookie 기능을 구현한다.
  • 요청, 응답 책임을 추상화한다.

기능 요구사항6

접근하고 있는 사용자가 “로그인” 상태일 경우(Cookie 값이 logined=true) 경우
http://localhost:8080/user/list 로 접근했을 때 사용자 목록을 출력한다.
만약 로그인하지 않은 상태라면 로그인 페이지(login.html)로 이동한다.

동적으로 html을 생성하기 위해 handlebars.java template engine을 활용한다.

  • index.html 에서 사용자 목록 페이지에 접근할 수 있도록 한다.
  • Handlebars.java template engine을 활용한다.
  • 사용자가 로그인 한 상태일 경우 사용자 목록 조회 기능을 구현한다.
  • 사용자가 로그인 하지않은 상태일 경우 로그인 페이지로 이동한다.

기능 요구사항7

지금까지 구현한 소스 코드는 stylesheet 파일을 지원하지 못하고 있다.
Stylesheet 파일을 지원하도록 구현하도록 한다.

HTTP Request Header 예

GET ./css/style.css HTTP/1.1
Host: localhost:8080
Accept: text/css,*/*;q=0.1
Connection: keep-alive