diff --git a/study/src/main/resources/application.yml b/study/src/main/resources/application.yml index c152bb20db..e3f03c808a 100644 --- a/study/src/main/resources/application.yml +++ b/study/src/main/resources/application.yml @@ -3,8 +3,8 @@ handlebars: server: tomcat: - accept-count: 1 - max-connections: 1 + accept-count: 2 + max-connections: 2 threads: min-spare: 2 max: 2 diff --git a/tomcat/src/main/java/com/techcourse/controller/AbstractController.java b/tomcat/src/main/java/com/techcourse/controller/AbstractController.java index d91f52d861..9ee8cae097 100644 --- a/tomcat/src/main/java/com/techcourse/controller/AbstractController.java +++ b/tomcat/src/main/java/com/techcourse/controller/AbstractController.java @@ -10,9 +10,11 @@ public abstract class AbstractController implements Controller { public void service(HttpRequest httpRequest, HttpResponse httpResponse) { if (httpRequest.isMethod(HttpMethod.GET)) { doGet(httpRequest, httpResponse); + return; } if (httpRequest.isMethod(HttpMethod.POST)) { doPost(httpRequest, httpResponse); + return; } throw new IllegalArgumentException("유효하지 않은 메소드입니다."); diff --git a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java index d171bb84a8..2cf5e9e874 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -4,6 +4,8 @@ import java.io.UncheckedIOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import org.apache.coyote.http11.Http11Processor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,16 +16,19 @@ public class Connector implements Runnable { private static final int DEFAULT_PORT = 8080; private static final int DEFAULT_ACCEPT_COUNT = 100; + private static final int DEFAULT_MAX_THREADS = 250; private final ServerSocket serverSocket; + private final ExecutorService executor; private boolean stopped; public Connector() { - this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT); + this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT, DEFAULT_MAX_THREADS); } - public Connector(final int port, final int acceptCount) { + public Connector(final int port, final int acceptCount, final int maxThreads) { this.serverSocket = createServerSocket(port, acceptCount); + this.executor = Executors.newFixedThreadPool(maxThreads); this.stopped = false; } @@ -38,10 +43,8 @@ private ServerSocket createServerSocket(final int port, final int acceptCount) { } public void start() { - var thread = new Thread(this); - thread.setDaemon(true); - thread.start(); stopped = false; + executor.execute(this); log.info("Web Application Server started {} port.", serverSocket.getLocalPort()); } @@ -66,7 +69,7 @@ private void process(final Socket connection) { return; } var processor = new Http11Processor(connection); - new Thread(processor).start(); + executor.execute(processor); } public void stop() { @@ -75,6 +78,8 @@ public void stop() { serverSocket.close(); } catch (IOException e) { log.error(e.getMessage(), e); + } finally { + executor.shutdown(); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java index e623c76679..20e12ff933 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -55,7 +55,6 @@ private HttpResponse createResponse(HttpRequest httpRequest) { HttpResponse httpResponse = new HttpResponse(); try { handle(httpRequest, httpResponse); - return httpResponse; } catch (NotFoundException e) { httpResponse.location(httpRequest, NOT_FOUND_PATH); } catch (UnauthorizedException e) { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java index f57c27375f..8d4c448715 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java @@ -122,7 +122,8 @@ public byte[] toResponse() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(httpStatusLine.createStatusLineResponse()) .append(RESPONSE_LINE_DELIMITER) - .append(httpResponseHeader.createHeadersResponse()); + .append(httpResponseHeader.createHeadersResponse()) + .append(RESPONSE_LINE_DELIMITER); if (httpResponseBody != null) { stringBuilder.append(RESPONSE_LINE_DELIMITER) .append(httpResponseBody.getBody()); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/session/Session.java b/tomcat/src/main/java/org/apache/coyote/http11/session/Session.java index 9054689244..c92567d2ae 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/session/Session.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/session/Session.java @@ -1,8 +1,8 @@ package org.apache.coyote.http11.session; import com.techcourse.model.User; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class Session { @@ -13,7 +13,7 @@ public class Session { public Session(String id) { this.id = id; - this.attributes = new HashMap<>(); + this.attributes = new ConcurrentHashMap<>(); } public boolean hasAttribute(String name) {