Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,24 @@
- 동적으로 html을 생성하기 위해 handlebars.java template engine을 활용한다.

- [x] 요구사항 7
- Stylesheet 파일을 지원하도록 구현하도록 한다.
- Stylesheet 파일을 지원하도록 구현하도록 한다.

### Step3: HTTP 웹 서버 리팩토링

- 모든 로직에 단위 테스트를 구현한다. 단, 테스트하기 어려운 UI 로직은 제외
- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다.
- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- 이 과정의 Code Style은 intellij idea Code Style. Java을 따른다.
- intellij idea Code Style. Java을 따르려면 code formatting 단축키(Windows : Ctrl + Alt + L. Mac : ⌥ (Option) + ⌘ (Command) + L.)를 사용한다.
- 규칙 1: 한 메서드에 오직 한 단계의 들여쓰기(indent)만 한다.
- indent가 2이상인 메소드의 경우 메소드를 분리하면 indent를 줄일 수 있다.
- else를 사용하지 않아 indent를 줄일 수 있다.
- 규칙 3: 모든 원시값과 문자열을 포장한다.
- 규칙 8: 일급 콜렉션을 쓴다.

- 리팩토링 힌트 - 1단계
- 메소드 분리 및 클래스 분리
- 리팩토링 힌트 - 2단계
- 클라이언트 요청 데이터를 처리하는 로직을 별도의 클래스로 분리한다.(HttpRequest)
- 클라이언트 응답 데이터를 처리하는 로직을 별도의 클래스로 분리한다.(HttpResponse)
20 changes: 10 additions & 10 deletions src/main/java/controller/CreatUserMappingController.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package controller;

import db.DataBase;
import webserver.http.*;
import model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.*;

public class CreatUserMappingController extends RequestMappingControllerAdapter {
private static final Logger logger = LoggerFactory.getLogger(CreatUserMappingController.class);
Expand All @@ -15,19 +15,19 @@ public boolean checkUrl(String url) {
}

@Override
public Response doPost(Request request) {
DataBase.addUser(getUserFromRequest(request));
public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) {
DataBase.addUser(getUserFromRequest(httpRequest));
logger.debug("findAll: {}", DataBase.findAll());
return new Response(HttpStatus.FOUND, MediaType.TEXT_HTML_UTF8, "/index.html", null);

httpResponse.redirect("/index.html");
}

private User getUserFromRequest(Request request) {
QueryString queryString = QueryString.parse(request.getRequestBody());
private User getUserFromRequest(HttpRequest httpRequest) {
return new User(
queryString.get("userId"),
queryString.get("password"),
queryString.get("name"),
queryString.get("email")
httpRequest.getParameter("userId"),
httpRequest.getParameter("password"),
httpRequest.getParameter("name"),
httpRequest.getParameter("email")
);
}
}
13 changes: 6 additions & 7 deletions src/main/java/controller/IndexMappingController.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package controller;

import webserver.MediaType;
import webserver.Request;
import webserver.RequestLine;
import webserver.Response;
import webserver.http.HttpRequest;
import webserver.http.HttpResponse;
import webserver.http.MediaType;
import webserver.http.RequestMappingControllerAdapter;

public class IndexMappingController extends RequestMappingControllerAdapter {

Expand All @@ -13,8 +13,7 @@ public boolean checkUrl(String url) {
}

@Override
public Response doGet(Request request) {
RequestLine requestLine = request.getRequestLine();
return new Response(MediaType.TEXT_HTML_UTF8, requestLine.getPath(), null);
public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) {
httpResponse.redirect("/index.html");
}
}
37 changes: 17 additions & 20 deletions src/main/java/controller/LoginMappingController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import db.DataBase;
import model.User;
import webserver.*;
import webserver.http.*;

public class LoginMappingController extends RequestMappingControllerAdapter {
@Override
Expand All @@ -11,39 +11,36 @@ public boolean checkUrl(String url) {
}

@Override
public Response doGet(Request request) {
return login(request);
public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) {
login(httpRequest, httpResponse);
}

@Override
public Response doPost(Request request) {
return login(request);
public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) {
login(httpRequest, httpResponse);
}

private Response login(Request request) {
User user = getUserFromRequest(request);
private void login(HttpRequest httpRequest, HttpResponse httpResponse) {
User user = getUserFromRequest(httpRequest);

User userById = DataBase.findUserById(user.getUserId());

if (userById == null || !userById.checkPassword(user.getPassword())) {
return new Response(HttpStatus.BAD_REQUEST, MediaType.TEXT_HTML_UTF8, "/user/login_failed.html", "logined=false; Path=/");
httpResponse.addHeader("Set-Cookie", "logined=false; Path=/");
httpResponse.redirect(HttpStatus.BAD_REQUEST, "/user/login_failed.html");
return;
}

return new Response(HttpStatus.FOUND, MediaType.TEXT_HTML_UTF8, "/index.html", "logined=true; Path=/");
httpResponse.addHeader("Set-Cookie", "logined=true; Path=/");
httpResponse.redirect("/index.html");
}

private User getUserFromRequest(Request request) {
QueryString queryString = request.getRequestLine().toQueryString();

if (request.getRequestLine().getMethod() == HttpMethod.POST) {
queryString = QueryString.parse(request.getRequestBody());
}

private User getUserFromRequest(HttpRequest httpRequest) {
return new User(
queryString.get("userId"),
queryString.get("password"),
queryString.get("name"),
queryString.get("email")
httpRequest.getParameter("userId"),
httpRequest.getParameter("password"),
httpRequest.getParameter("name"),
httpRequest.getParameter("email")
);
}
}
13 changes: 0 additions & 13 deletions src/main/java/controller/RequestController.java

This file was deleted.

21 changes: 0 additions & 21 deletions src/main/java/controller/RequestMappingControllerAdapter.java

This file was deleted.

30 changes: 16 additions & 14 deletions src/main/java/controller/StaticResourceController.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,34 @@
package controller;

import utils.FileIoUtils;
import webserver.Request;
import webserver.RequestLine;
import webserver.Response;
import webserver.http.HttpRequest;
import webserver.http.HttpResponse;
import webserver.http.RequestAbstractController;
import webserver.http.RequestController;

import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;

public class StaticResourceController implements RequestController {
public class StaticResourceController extends RequestAbstractController {

@Override
public Response doGet(Request request) {
RequestLine requestLine = request.getRequestLine();
String path = requestLine.getPath();
String resourcePath = FileIoUtils.getResourcePath(requestLine.getPath());
public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws Exception {
doGet(httpRequest, httpResponse);
}

@Override
public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException {
String resourcePath = FileIoUtils.getResourcePath(httpRequest.getPath());

if (!isExists(resourcePath)) {
throw new IllegalArgumentException("NotFound");
}

return new Response(request.getContentType(), path, null);
httpResponse.addHeader("Content-Type", httpRequest.getHeader("Accept"));
httpResponse.ok(FileIoUtils.loadFileFromClasspath(FileIoUtils.getResourcePath(httpRequest.getPath())));
}

private boolean isExists(String resourcePath) {
Expand All @@ -35,9 +42,4 @@ private boolean isExists(String resourcePath) {
return Files.exists(Paths.get(path));
}

@Override
public Response doPost(Request request) {
return null;
}

}
32 changes: 15 additions & 17 deletions src/main/java/controller/UserListMappingController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@
import com.github.jknack.handlebars.io.ClassPathTemplateLoader;
import com.github.jknack.handlebars.io.TemplateLoader;
import db.DataBase;
import model.User;
import webserver.HttpStatus;
import webserver.MediaType;
import webserver.Request;
import webserver.Response;
import model.Users;
import webserver.http.HttpRequest;
import webserver.http.HttpResponse;
import webserver.http.RequestMappingControllerAdapter;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

Expand All @@ -23,19 +21,19 @@ public boolean checkUrl(String url) {
}

@Override

public Response doGet(Request request) throws IOException {
if (!checkLogin(getCookie(request))) {
return new Response(HttpStatus.FOUND, MediaType.TEXT_HTML_UTF8, "/index.html", null);

public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
if (!checkLogin(getCookie(httpRequest))) {
httpResponse.redirect("/index.html");
return;
}

return new Response(HttpStatus.OK, MediaType.TEXT_HTML_UTF8, "/user/list.html", rendering(DataBase.findAll()));
httpResponse.addHeader("Content-Type", httpRequest.getHeader("Accept"));
httpResponse.ok(rendering(DataBase.findAll()).getBytes());
}

private String rendering(Collection<User> users) throws IOException {
private String rendering(Users users) throws IOException {
Map<String, Object> parameterMap = new HashMap<>();
parameterMap.put("users", users);
parameterMap.put("users", users.toList());

TemplateLoader loader = new ClassPathTemplateLoader();
loader.setPrefix("/templates");
Expand All @@ -49,13 +47,13 @@ private boolean checkLogin(String cookie) {
return cookie.indexOf("logined=true") != -1;
}

private String getCookie(Request request) {
String cookie = request.getCookie();
private String getCookie(HttpRequest httpRequest) {
String cookie = httpRequest.getHeader("Cookie");

if (cookie == null) {
return "";
}

return request.getCookie();
return cookie;
}
}
5 changes: 3 additions & 2 deletions src/main/java/db/DataBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.google.common.collect.Maps;

import model.User;
import model.Users;

public class DataBase {
private static Map<String, User> users = Maps.newHashMap();
Expand All @@ -18,8 +19,8 @@ public static User findUserById(String userId) {
return users.get(userId);
}

public static Collection<User> findAll() {
return users.values();
public static Users findAll() {
return Users.from(users.values());
}

public static void clear() {
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/model/Users.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class Users {

private final List<User> users;

private Users(List<User> users) {
this.users = users;
}

public static Users from(Collection<User> users) {
return new Users(new ArrayList<>(users));
}

public List<User> toList() {
return List.copyOf(users);
}
}
Loading