Skip to content

Commit

Permalink
refactor: handler를 controller로 변환
Browse files Browse the repository at this point in the history
  • Loading branch information
shb03323 committed Sep 9, 2023
1 parent e2fd801 commit e06854c
Show file tree
Hide file tree
Showing 24 changed files with 175 additions and 149 deletions.
Original file line number Diff line number Diff line change
@@ -1,26 +1,23 @@
package org.apache.coyote.controller;

import org.apache.coyote.controller.exception.UnsupportedRequestMethodException;
import org.apache.coyote.httprequest.HttpRequest;
import org.apache.coyote.httprequest.RequestMethod;
import org.apache.coyote.httpresponse.HttpResponse;

public abstract class AbstractController implements Controller {

@Override
public void service(final HttpRequest httpRequest, final HttpResponse httpResponse) {
public HttpResponse service(final HttpRequest httpRequest) {
if (httpRequest.isSameRequestMethod(RequestMethod.GET)) {
doGet(httpRequest, httpResponse);
return;
return doGet(httpRequest);
}
if (httpRequest.isSameRequestMethod(RequestMethod.POST)) {
doPost(httpRequest, httpResponse);
return;
return doPost(httpRequest);
}
throw new UnsupportedRequestMethodException();
return new MethodNotAllowedController().service(httpRequest);
}

protected abstract void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse);
protected abstract HttpResponse doPost(final HttpRequest httpRequest);

protected abstract void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse);
protected abstract HttpResponse doGet(final HttpRequest httpRequest);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@

public interface Controller {

void service(final HttpRequest httpRequest, final HttpResponse httpResponse);
HttpResponse service(final HttpRequest httpRequest);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package org.apache.coyote.httpresponse.handler;
package org.apache.coyote.controller;

import org.apache.coyote.httprequest.HttpRequest;
import org.apache.coyote.httpresponse.HttpResponse;
import org.apache.coyote.httpresponse.HttpStatus;

public class IndexHandler implements Handler {
public class IndexController extends AbstractController {

@Override
public HttpResponse handle(final HttpRequest request) {
protected HttpResponse doPost(final HttpRequest request) {
return new MethodNotAllowedController().service(request);
}

@Override
public HttpResponse doGet(final HttpRequest request) {
return HttpResponse
.init(request.getHttpVersion())
.setHttpStatus(HttpStatus.OK)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.apache.coyote.httpresponse.handler;
package org.apache.coyote.controller;

import nextstep.jwp.db.InMemoryUserRepository;
import nextstep.jwp.model.User;
Expand All @@ -9,37 +9,38 @@
import org.apache.coyote.httpresponse.CookieResponseHeader;
import org.apache.coyote.httpresponse.HttpResponse;
import org.apache.coyote.httpresponse.HttpStatus;
import org.apache.coyote.httpresponse.handler.exception.UnauthorizedException;
import org.apache.coyote.controller.exception.UnauthorizedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoginHandler implements Handler {
public class LoginController extends AbstractController {

private static final Logger log = LoggerFactory.getLogger(LoginHandler.class);
private static final Logger log = LoggerFactory.getLogger(LoginController.class);

private static final String SESSION_ATTRIBUTE_OF_USER = "user";
private static final String USER_ACCOUNT = "account";
private static final String USER_PASSWORD = "password";
private static final String REDIRECT_URL = "/index.html";

@Override
public HttpResponse handle(final HttpRequest request) {
public HttpResponse service(final HttpRequest request) {
final RequestMethod requestMethod = request.getRequestMethod();
try {
if (requestMethod == RequestMethod.POST) {
return handlePost(request);
return doPost(request);
}
if (requestMethod == RequestMethod.GET) {
return handleGet(request);
return doGet(request);
}
} catch (UnauthorizedException e) {
log.debug("로그인 실패 : {}", e.getMessage());
return new UnAuthorizedHandler().handle(request);
return new UnAuthorizedController().service(request);
}
return new MethodNotAllowedHandler().handle(request);
return new MethodNotAllowedController().service(request);
}

private HttpResponse handlePost(final HttpRequest request) {
@Override
protected HttpResponse doPost(final HttpRequest request) {
final String resourcePath = request.getPath() + ".html";
final User user = getUser(QueryString.from(request.getRequestBody().getContents()));
return HttpResponse
Expand All @@ -50,25 +51,8 @@ private HttpResponse handlePost(final HttpRequest request) {
.setCookieHeader(createCookie(request, user));
}

private User getUser(final QueryString queryString) {
final String account = queryString.getValue(USER_ACCOUNT);
final String password = queryString.getValue(USER_PASSWORD);
final User user = InMemoryUserRepository.findByAccount(account)
.orElseThrow(() -> new UnauthorizedException("존재하지 않는 유저입니다."));
if (user.checkPassword(password)) {
log.info("user : {}", user);
return user;
}
throw new UnauthorizedException("비밀번호가 잘못되었습니다.");
}

private CookieResponseHeader createCookie(final HttpRequest request, final User user) {
final Session session = request.getSession(true);
session.setAttribute(SESSION_ATTRIBUTE_OF_USER, user);
return CookieResponseHeader.createByJSessionId(session.getId());
}

private HttpResponse handleGet(final HttpRequest request) {
@Override
protected HttpResponse doGet(final HttpRequest request) {
final String resourcePath = request.getPath() + ".html";
final HttpResponse response = HttpResponse
.init(request.getHttpVersion())
Expand All @@ -87,6 +71,24 @@ private HttpResponse handleGet(final HttpRequest request) {
return response;
}

private User getUser(final QueryString queryString) {
final String account = queryString.getValue(USER_ACCOUNT);
final String password = queryString.getValue(USER_PASSWORD);
final User user = InMemoryUserRepository.findByAccount(account)
.orElseThrow(() -> new UnauthorizedException("존재하지 않는 유저입니다."));
if (user.checkPassword(password)) {
log.info("user : {}", user);
return user;
}
throw new UnauthorizedException("비밀번호가 잘못되었습니다.");
}

private CookieResponseHeader createCookie(final HttpRequest request, final User user) {
final Session session = request.getSession(true);
session.setAttribute(SESSION_ATTRIBUTE_OF_USER, user);
return CookieResponseHeader.createByJSessionId(session.getId());
}

private boolean checkLoginUser(final HttpRequest request) {
if (request.hasJSessionId()) {
final User sessionUser = (User) request.getSession(true).getAttribute(SESSION_ATTRIBUTE_OF_USER);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package org.apache.coyote.httpresponse.handler;
package org.apache.coyote.controller;

import org.apache.coyote.httprequest.HttpRequest;
import org.apache.coyote.httpresponse.HttpResponse;
import org.apache.coyote.httpresponse.HttpStatus;

public class MethodNotAllowedHandler implements Handler {
public class MethodNotAllowedController implements Controller {

@Override
public HttpResponse handle(final HttpRequest request) {
public HttpResponse service(final HttpRequest request) {
return HttpResponse
.init(request.getHttpVersion())
.setHttpStatus(HttpStatus.METHOD_NOT_ALLOWED)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,17 @@
package org.apache.coyote.httpresponse.handler;
package org.apache.coyote.controller;

import nextstep.jwp.db.InMemoryUserRepository;
import nextstep.jwp.model.User;
import org.apache.coyote.httprequest.HttpRequest;
import org.apache.coyote.httprequest.RequestBody;
import org.apache.coyote.httprequest.RequestMethod;
import org.apache.coyote.httpresponse.HttpResponse;
import org.apache.coyote.httpresponse.HttpStatus;
import org.apache.coyote.httpresponse.handler.util.RequestBodyParser;
import org.apache.coyote.controller.util.RequestBodyParser;

public class RegisterHandler implements Handler {
public class RegisterController extends AbstractController {

@Override
public HttpResponse handle(final HttpRequest request) {
final RequestMethod requestMethod = request.getRequestMethod();
if (requestMethod == RequestMethod.POST) {
return handlePost(request);
}
if (requestMethod == RequestMethod.GET) {
return handleGet(request);
}
return new MethodNotAllowedHandler().handle(request);
}

private HttpResponse handlePost(final HttpRequest request) {
protected HttpResponse doPost(final HttpRequest request) {
saveUser(request.getRequestBody());
return HttpResponse
.init(request.getHttpVersion())
Expand All @@ -36,7 +24,8 @@ private void saveUser(final RequestBody requestBody) {
InMemoryUserRepository.save(user);
}

private HttpResponse handleGet(final HttpRequest request) {
@Override
protected HttpResponse doGet(final HttpRequest request) {
final String resourcePath = request.getPath() + ".html";
return HttpResponse
.init(request.getHttpVersion())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.apache.coyote.controller;

import org.apache.coyote.httprequest.HttpRequest;

import java.util.HashMap;
import java.util.Map;

public class RequestMapping {

private final Map<String, Controller> controllers = new HashMap<>();

public RequestMapping() {
controllers.put("/", new IndexController());
controllers.put("/index.html", new IndexController());
controllers.put("/login", new LoginController());
controllers.put("/register", new RegisterController());
}

public Controller getController(final HttpRequest httpRequest) {
final String path = httpRequest.getPath();
if (controllers.get(path) == null) {
return controllers.get("/");
}
return controllers.get(path);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package org.apache.coyote.httpresponse.handler;
package org.apache.coyote.controller;

import org.apache.coyote.controller.Controller;
import org.apache.coyote.httprequest.HttpRequest;
import org.apache.coyote.httpresponse.HttpResponse;
import org.apache.coyote.httpresponse.HttpStatus;

public class UnAuthorizedHandler implements Handler {
public class UnAuthorizedController implements Controller {

@Override
public HttpResponse handle(final HttpRequest request) {
public HttpResponse service(final HttpRequest request) {
return HttpResponse
.init(request.getHttpVersion())
.setHttpStatus(HttpStatus.UNAUTHORIZED)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.apache.coyote.httpresponse.handler.exception;
package org.apache.coyote.controller.exception;

public class UnauthorizedException extends IllegalArgumentException {

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.apache.coyote.httpresponse.handler.util;
package org.apache.coyote.controller.util;

import nextstep.jwp.model.User;
import org.apache.coyote.httprequest.QueryString;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.apache.coyote.httpresponse.handler.util;
package org.apache.coyote.controller.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
25 changes: 8 additions & 17 deletions tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import nextstep.jwp.exception.UncheckedServletException;
import org.apache.coyote.Processor;
import org.apache.coyote.controller.Controller;
import org.apache.coyote.controller.RequestMapping;
import org.apache.coyote.httprequest.HttpRequest;
import org.apache.coyote.httpresponse.HttpResponse;
import org.apache.coyote.httpresponse.handler.Handler;
import org.apache.coyote.httpresponse.handler.IndexHandler;
import org.apache.coyote.httpresponse.handler.LoginHandler;
import org.apache.coyote.httpresponse.handler.RegisterHandler;
import org.apache.coyote.controller.IndexController;
import org.apache.coyote.controller.LoginController;
import org.apache.coyote.controller.RegisterController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -21,14 +22,6 @@
public class Http11Processor implements Runnable, Processor {

private static final Logger log = LoggerFactory.getLogger(Http11Processor.class);
private static final Map<String, Handler> HANDLERS = new HashMap<>();

static {
HANDLERS.put("/", new IndexHandler());
HANDLERS.put("/index.html", new IndexHandler());
HANDLERS.put("/login", new LoginHandler());
HANDLERS.put("/register", new RegisterHandler());
}

private final Socket connection;

Expand All @@ -49,12 +42,10 @@ public void run() {
public void process(final Socket connection) {
try (final InputStream inputStream = connection.getInputStream();
final OutputStream outputStream = connection.getOutputStream()) {
final RequestMapping requestMapping = new RequestMapping();
final HttpRequest request = HttpRequest.from(inputStream);
Handler handler = HANDLERS.get(request.getPath());
if (handler == null) {
handler = HANDLERS.get("/");
}
final HttpResponse response = handler.handle(request);
final Controller controller = requestMapping.getController(request);
final HttpResponse response = controller.service(request);
outputStream.write(response.getBytes());
outputStream.flush();
} catch (IOException | UncheckedServletException | IllegalArgumentException e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.apache.coyote.httpresponse;

import org.apache.coyote.common.HttpVersion;
import org.apache.coyote.httpresponse.handler.util.ResourceReader;
import org.apache.coyote.controller.util.ResourceReader;
import org.apache.coyote.httpresponse.header.ResponseHeaders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down

This file was deleted.

Loading

0 comments on commit e06854c

Please sign in to comment.