diff --git a/study/src/main/java/thread/stage2/SampleController.java b/study/src/main/java/thread/stage2/SampleController.java index a9636dd934..729b3bbadd 100644 --- a/study/src/main/java/thread/stage2/SampleController.java +++ b/study/src/main/java/thread/stage2/SampleController.java @@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.ResponseBody; import java.util.concurrent.atomic.AtomicInteger; @@ -23,11 +24,11 @@ public SampleController(final HelloWorldService helloWorldService) { this.helloWorldService = helloWorldService; } - @GetMapping("/test") + @GetMapping("/test/{threadNumber}") @ResponseBody - public String helloWorld() throws InterruptedException { + public String helloWorld(@PathVariable int threadNumber) throws InterruptedException { Thread.sleep(500); - log.info("http call count : {}", count.incrementAndGet()); + log.info("Thread-[{}] : http call count : {}", threadNumber, count.incrementAndGet()); return helloWorldService.helloWorld(); } } diff --git a/study/src/main/resources/application.yml b/study/src/main/resources/application.yml index 8b74bdfd88..9e7edae7af 100644 --- a/study/src/main/resources/application.yml +++ b/study/src/main/resources/application.yml @@ -4,7 +4,7 @@ handlebars: server: tomcat: accept-count: 1 - max-connections: 1 + max-connections: 2 threads: min-spare: 2 max: 2 diff --git a/study/src/test/java/thread/stage2/AppTest.java b/study/src/test/java/thread/stage2/AppTest.java index e253c4a249..a43c93c2ca 100644 --- a/study/src/test/java/thread/stage2/AppTest.java +++ b/study/src/test/java/thread/stage2/AppTest.java @@ -1,6 +1,8 @@ package thread.stage2; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.net.http.HttpResponse; import java.util.concurrent.atomic.AtomicInteger; @@ -10,6 +12,7 @@ class AppTest { private static final AtomicInteger count = new AtomicInteger(0); + private static final Logger log = LoggerFactory.getLogger(AppTest.class); /** * 1. App 클래스의 애플리케이션을 실행시켜 서버를 띄운다. @@ -27,7 +30,8 @@ void test() throws Exception { var threads = new Thread[NUMBER_OF_THREAD]; for (int i = 0; i < NUMBER_OF_THREAD; i++) { - threads[i] = new Thread(() -> incrementIfOk(TestHttpUtils.send("/test"))); + final int threadNumber = i; + threads[i] = new Thread(() -> incrementIfOk(TestHttpUtils.send("/test/" + threadNumber))); } for (final var thread : threads) { @@ -36,13 +40,14 @@ void test() throws Exception { } for (final var thread : threads) { - thread.join(); + thread.join(0); } + System.out.println("end"); assertThat(count.intValue()).isEqualTo(2); } - private static void incrementIfOk(final HttpResponse response) { + private synchronized static void incrementIfOk(final HttpResponse response) { if (response.statusCode() == 200) { count.incrementAndGet(); } diff --git a/tomcat/src/main/java/com/techcourse/controller/LoginController.java b/tomcat/src/main/java/com/techcourse/controller/LoginController.java index c2b8933b2b..cf40fbb3d2 100644 --- a/tomcat/src/main/java/com/techcourse/controller/LoginController.java +++ b/tomcat/src/main/java/com/techcourse/controller/LoginController.java @@ -3,6 +3,7 @@ import static org.apache.coyote.http11.httpmessage.HttpHeaders.JSESSIONID; import java.util.Objects; +import java.util.Optional; import org.apache.catalina.servlet.AbstractController; import org.apache.coyote.http11.httpmessage.request.HttpRequest; @@ -21,7 +22,14 @@ protected void doPost(HttpRequest request, HttpResponse response) throws Excepti HttpRequestParameters requestParams = HttpRequestParameters.parseFrom(request.getBody()); String account = requestParams.getParam("account"); String password = requestParams.getParam("password"); - User user = InMemoryUserRepository.fetchByAccount(account); + + Optional optionalUser = InMemoryUserRepository.findByAccount(account); + if(optionalUser.isEmpty()) { + response.setStatusFound("/401.html"); + return; + } + + User user = optionalUser.get(); if (user.checkPassword(password)) { Session session = request.getSession(true); session.setAttribute("user", user); @@ -35,6 +43,7 @@ protected void doPost(HttpRequest request, HttpResponse response) throws Excepti response.setStatusFound("/401.html"); } + @Override protected void doGet(HttpRequest request, HttpResponse response) throws Exception { if (isLoggedIn(request)) { 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 447c9853cd..caef265bf3 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.ServletContainer; import org.apache.coyote.http11.Http11Processor; @@ -16,20 +18,23 @@ 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_THREAD_COUNT = 5; private final ServerSocket serverSocket; private final ServletContainer servletContainer; + private final ExecutorService executorService; private boolean stopped; public Connector(ServletContainer servletContainer) { - this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT, servletContainer); + this(servletContainer, DEFAULT_PORT, DEFAULT_ACCEPT_COUNT, DEFAULT_MAX_THREAD_COUNT); } - public Connector(int port, int acceptCount, ServletContainer servletContainer) { + public Connector(ServletContainer servletContainer, int port, int acceptCount, int maxThreads) { this.servletContainer = servletContainer; this.serverSocket = createServerSocket(port, acceptCount); this.stopped = false; + this.executorService = Executors.newFixedThreadPool(maxThreads); } private ServerSocket createServerSocket(int port, int acceptCount) { @@ -71,7 +76,7 @@ private void process(Socket connection) { return; } var processor = new Http11Processor(servletContainer, connection); - new Thread(processor).start(); + executorService.submit(processor); } public void stop() { 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 cd60a86516..290f200e51 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -16,7 +16,7 @@ public class Http11Processor implements Runnable, Processor { - private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); + private static final Logger log = LoggerFactory.getLogger("ConsoleTraceLogger"); private final ServletContainer servletContainer; private final Socket connection; @@ -39,7 +39,7 @@ public void process(Socket connection) { var outputStream = connection.getOutputStream()) { HttpRequest httpRequest = HttpRequest.readFrom(requestBufferedReader); - log.info("request : {}", httpRequest); + log.trace("request : {}", httpRequest); HttpResponse httpResponse = new HttpResponse(httpRequest); service(httpRequest, httpResponse); diff --git a/tomcat/src/main/java/org/apache/coyote/session/SessionManager.java b/tomcat/src/main/java/org/apache/coyote/session/SessionManager.java index 482a7a8967..76b4e7ed85 100644 --- a/tomcat/src/main/java/org/apache/coyote/session/SessionManager.java +++ b/tomcat/src/main/java/org/apache/coyote/session/SessionManager.java @@ -2,12 +2,13 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.catalina.Manager; public class SessionManager implements Manager { // static! - private static final Map SESSIONS = new HashMap<>(); + private static final Map SESSIONS = new ConcurrentHashMap<>(); private static SessionManager instance; private SessionManager() {} diff --git a/tomcat/src/main/resources/logback.xml b/tomcat/src/main/resources/logback.xml new file mode 100644 index 0000000000..b8a852dbf0 --- /dev/null +++ b/tomcat/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm} %-5level %logger{36} - %msg%n + + + + + + +