Skip to content
Merged
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package db;
package app.db;

import model.User;
import app.model.User;

import java.util.Collection;
import java.util.HashMap;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package webserver;
package app.handler;

import db.Database;
import model.User;
import webserver.http.HttpMethod;
import webserver.http.request.HttpRequest;
import webserver.web.handler.DynamicViewHandler;
import webserver.web.handler.response.view.ViewResponse;
import app.db.Database;
import app.model.User;
import http.HttpMethod;
import http.request.HttpRequest;
import web.handler.DynamicViewHandler;
import web.response.ViewResponse;

public class RegisterHandlerImpl extends DynamicViewHandler {
public RegisterHandlerImpl() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package model;
package app.model;

public class User {
private String userId;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package webserver;
package bootstrap;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import dependency.DependencyLoader;
import config.DependencyLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.http.HttpServlet;
import web.dispatch.ConnectionHandler;

public class WebServer {
private static final Logger logger = LoggerFactory.getLogger(WebServer.class);
Expand All @@ -33,12 +33,12 @@ public static void main(String args[]) throws Exception {
while ((connection = listenSocket.accept()) != null) {
Socket singleConnection = connection;
executor.submit(() -> {
HttpServlet httpServlet = new HttpServlet(LOADER.wasServlet,
ConnectionHandler connectionHandler = new ConnectionHandler(LOADER.dispatcher,
LOADER.exceptionHandlerMapping,
LOADER.httpResponseConverter,
LOADER.httpRequestConverter,
singleConnection);
httpServlet.run();
connectionHandler.run();
});
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package dependency;
package config;

import webserver.RegisterHandlerImpl;
import webserver.exception.ExceptionHandlerMapping;
import webserver.exception.handler.ErrorExceptionHandler;
import webserver.exception.handler.ServiceExceptionHandler;
import webserver.exception.handler.UnhandledErrorHandler;
import webserver.http.request.HttpBufferedReaderRequestConverter;
import webserver.http.request.HttpRequestConverter;
import webserver.http.response.HttpBufferedStreamResponseConverter;
import webserver.http.response.HttpResponseConverter;
import webserver.web.WasServlet;
import webserver.web.handler.StaticContentHandler;
import webserver.web.handler.WebHandler;
import webserver.web.handler.response.handler.StaticContentResponseHandler;
import webserver.web.handler.response.handler.ViewResponseHandler;
import webserver.web.handler.response.handler.WebHandlerResponseHandler;
import app.handler.RegisterHandlerImpl;
import exception.ExceptionHandlerMapping;
import exception.handler.ErrorExceptionHandler;
import exception.handler.ServiceExceptionHandler;
import exception.handler.UnhandledErrorHandler;
import http.request.HttpBufferedReaderRequestConverter;
import http.request.HttpRequestConverter;
import http.response.HttpBufferedStreamResponseConverter;
import http.response.HttpResponseConverter;
import web.dispatch.Dispatcher;
import web.handler.StaticContentHandler;
import web.handler.WebHandler;
import web.posthandler.StaticContentResponseHandler;
import web.posthandler.ViewResponseHandler;
import web.posthandler.WebHandlerResponseHandler;

import java.util.List;

Expand All @@ -37,8 +37,8 @@ public HttpResponseConverter httpResponseConverter(){


//Web
public WasServlet wasServlet(){
return new WasServlet(
public Dispatcher dispatcher(){
return new Dispatcher(
webHandlerList(),
webHandlerResponseHandlerList()
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package dependency;
package config;

import webserver.exception.ExceptionHandlerMapping;
import webserver.http.request.HttpRequestConverter;
import webserver.http.response.HttpResponseConverter;
import webserver.web.WasServlet;
import exception.ExceptionHandlerMapping;
import http.request.HttpRequestConverter;
import http.response.HttpResponseConverter;
import web.dispatch.Dispatcher;

public class DependencyLoader {
private final AppConfig appConfig;

public final HttpRequestConverter httpRequestConverter;
public final HttpResponseConverter httpResponseConverter;
public final ExceptionHandlerMapping exceptionHandlerMapping;
public final WasServlet wasServlet;
public final Dispatcher dispatcher;

public DependencyLoader(){
this.appConfig = new AppConfig();
this.httpRequestConverter = appConfig.httpRequestConverter();
this.httpResponseConverter = appConfig.httpResponseConverter();
this.exceptionHandlerMapping = appConfig.exceptionHandlerMapping();
this.wasServlet = appConfig.wasServlet();
this.dispatcher = appConfig.dispatcher();
}
}
9 changes: 9 additions & 0 deletions src/main/java/config/VariableConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package config;

import java.util.List;

public class VariableConfig {
public static final List<String> STATIC_RESOURCE_ROOTS = List.of(
"./src/main/resources",
"./src/main/resources/static");
}
Comment on lines +5 to +9
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정적 리소스 경로가 하드코딩되어 있습니다. 프로덕션 환경에서는 배포 구조에 따라 경로가 달라질 수 있으므로, 환경 변수나 설정 파일에서 읽도록 개선하는 것이 좋습니다. 또한 './src/main/resources'는 개발 환경 전용 경로로 보이므로, 런타임 환경에서 올바른 리소스 경로를 동적으로 결정하는 로직이 필요합니다."

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package webserver.exception;
package exception;


import webserver.http.HttpStatus;
import http.HttpStatus;

public enum ErrorCode {
/* Internal Error */
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

public class ErrorException extends RuntimeException {
private final ErrorCode errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

import java.net.Socket;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

import java.net.Socket;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

public class ServiceException extends RuntimeException {
private final ErrorCode errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package webserver.exception.handler;
package exception.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.exception.ErrorCode;
import webserver.exception.ErrorException;
import webserver.exception.ExceptionHandler;
import webserver.http.HttpStatus;
import exception.ErrorCode;
import exception.ErrorException;
import exception.ExceptionHandler;
import http.HttpStatus;

import java.io.IOException;
import java.io.OutputStream;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package webserver.exception.handler;
package exception.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.exception.ErrorCode;
import webserver.exception.ServiceException;
import webserver.exception.ExceptionHandler;
import webserver.http.HttpStatus;
import exception.ErrorCode;
import exception.ServiceException;
import exception.ExceptionHandler;
import http.HttpStatus;

import java.io.IOException;
import java.io.OutputStream;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package webserver.exception.handler;
package exception.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.exception.ExceptionHandler;
import exception.ExceptionHandler;

import java.io.IOException;
import java.io.OutputStream;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http;
package http;

public enum HttpMethod {
GET,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http;
package http;

public enum HttpStatus {
OK(200),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.request;
package http.request;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package webserver.http.request;
package http.request;

import webserver.exception.ErrorCode;
import webserver.exception.ErrorException;
import webserver.exception.ServiceException;
import webserver.http.HttpMethod;
import exception.ErrorCode;
import exception.ErrorException;
import exception.ServiceException;
import http.HttpMethod;

import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.request;
package http.request;

import java.net.Socket;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.response;
package http.response;

import java.io.BufferedOutputStream;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package webserver.http.response;
package http.response;

import webserver.http.HttpStatus;
import http.HttpStatus;

import java.io.File;
import java.net.URLConnection;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
Expand Down Expand Up @@ -58,4 +60,28 @@ public void setBody(byte[] body) {
this.body = body;
setHeader("Content-Length", String.valueOf(body.length));
}

public void setBody(File file, byte[] body) {
this.body = body;
setHeader("Content-Type", guessContentType(file));
setHeader("Content-Length", String.valueOf(body.length));
}

private String guessContentType(File file) {
String byName = URLConnection.guessContentTypeFromName(file.getName());
if (byName != null) return byName;

String name = file.getName().toLowerCase();
if (name.endsWith(".html") || name.endsWith(".htm")) return "text/html; charset=utf-8";
if (name.endsWith(".css")) return "text/css; charset=utf-8";
if (name.endsWith(".js")) return "application/javascript; charset=utf-8";
if (name.endsWith(".json")) return "application/json; charset=utf-8";
if (name.endsWith(".png")) return "image/png";
if (name.endsWith(".jpg") || name.endsWith(".jpeg")) return "image/jpeg";
if (name.endsWith(".gif")) return "image/gif";
if (name.endsWith(".svg")) return "image/svg+xml";
if (name.endsWith(".txt")) return "text/plain; charset=utf-8";

return "application/octet-stream";
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.response;
package http.response;

import java.net.Socket;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
package webserver.http;
package web.dispatch;

import webserver.exception.ExceptionHandlerMapping;
import webserver.http.response.HttpResponseConverter;
import webserver.web.WasServlet;
import webserver.http.request.HttpRequestConverter;
import webserver.http.request.HttpRequest;
import webserver.http.response.HttpResponse;
import exception.ExceptionHandlerMapping;
import http.response.HttpResponseConverter;
import http.request.HttpRequestConverter;
import http.request.HttpRequest;
import http.response.HttpResponse;

import java.net.Socket;

public class HttpServlet implements Runnable{
public class ConnectionHandler implements Runnable{
private final Socket connection;
private final HttpRequestConverter requestConverter;
private final HttpResponseConverter responseConverter;
private final ExceptionHandlerMapping exceptionHandlerMapping;
private final WasServlet wasServlet;

public HttpServlet(WasServlet wasServlet,
ExceptionHandlerMapping exceptionHandlerMapping,
HttpResponseConverter responseConverter,
HttpRequestConverter requestConverter,
Socket connection) {
this.wasServlet = wasServlet;
private final Dispatcher dispatcher;

public ConnectionHandler(Dispatcher dispatcher,
ExceptionHandlerMapping exceptionHandlerMapping,
HttpResponseConverter responseConverter,
HttpRequestConverter requestConverter,
Socket connection) {
this.dispatcher = dispatcher;
this.exceptionHandlerMapping = exceptionHandlerMapping;
this.responseConverter = responseConverter;
this.requestConverter = requestConverter;
Expand All @@ -34,7 +33,7 @@ public void run() {
try {

HttpRequest request = requestConverter.parseRequest(connection);
HttpResponse response = wasServlet.handle(request);
HttpResponse response = dispatcher.handle(request);
responseConverter.sendResponse(response, connection);

} catch (Exception e){
Expand Down
Loading