From caae46af8510526d013b227fc503c19331fe55f8 Mon Sep 17 00:00:00 2001 From: Jang Hyeok-su <76612738+zangsu@users.noreply.github.com> Date: Wed, 4 Sep 2024 13:37:11 +0900 Subject: [PATCH 01/11] =?UTF-8?q?=EC=9D=B4=EC=8A=88=20=ED=85=9C=ED=94=8C?= =?UTF-8?q?=EB=A6=BF=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/Feature Template | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/Feature Template diff --git a/.github/ISSUE_TEMPLATE/Feature Template b/.github/ISSUE_TEMPLATE/Feature Template new file mode 100644 index 0000000000..2de2c831b2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Feature Template @@ -0,0 +1,23 @@ +--- +name: Feature Template +about: 기능 추가 이슈 템플릿 +title: "[FEAT] " +labels: feature +assignees: '' + +--- + +## 📌 어떤 기능인가요? +> 추가하려는 기능에 대해 간결하게 설명해주세요 + + +## 📜 작업 상세 내용 +- [ ] TODO +- [ ] TODO +- [ ] TODO + +## ⏳ 예상 소요 시간 +> 이슈를 완료하기까지 예상되는 소요 시간을 분 or 시간 or 일 단위로 작성해주세요. + + +## 🔍 참고할만한 자료(선택) From fed02f6f5f4308400e55c160d9495cad010f5bfb Mon Sep 17 00:00:00 2001 From: Gyeongho Yang Date: Thu, 5 Sep 2024 11:11:09 +0900 Subject: [PATCH 02/11] fix: remove implementation logback-classic on gradle (#501) --- study/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/study/build.gradle b/study/build.gradle index 5c69542f84..87a1f0313c 100644 --- a/study/build.gradle +++ b/study/build.gradle @@ -19,7 +19,6 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-webflux' - implementation 'ch.qos.logback:logback-classic:1.5.7' implementation 'org.apache.commons:commons-lang3:3.14.0' implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1' implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.4.1' From 7e9135698878932274ddc1f523ba817ed9c56c70 Mon Sep 17 00:00:00 2001 From: Gyeongho Yang Date: Thu, 5 Sep 2024 13:51:07 +0900 Subject: [PATCH 03/11] fix: add threads min-spare configuration on properties (#502) --- study/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/study/src/main/resources/application.yml b/study/src/main/resources/application.yml index 4e8655a962..e3503a5fb9 100644 --- a/study/src/main/resources/application.yml +++ b/study/src/main/resources/application.yml @@ -6,4 +6,5 @@ server: accept-count: 1 max-connections: 1 threads: + min-spare: 2 max: 2 From 8b282f7bcf57c4f2bf1bbb1146d8976580b70c7d Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 13 Sep 2024 16:41:06 +0900 Subject: [PATCH 04/11] =?UTF-8?q?refactor:=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EB=A0=88=EB=B2=A8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/apache/coyote/http11/Http11Processor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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..056422b203 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -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); From 465fa4a44d3574b1b5d0fcbd61500416bffe9c97 Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 13 Sep 2024 16:41:22 +0900 Subject: [PATCH 05/11] =?UTF-8?q?refactor:=20=EC=8A=A4=EB=A0=88=EB=93=9C?= =?UTF-8?q?=ED=92=80=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/connector/Connector.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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..2e178bc2c1 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 = 250; 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) { @@ -43,9 +48,7 @@ private ServerSocket createServerSocket(int port, int acceptCount) { } public void start() { - var thread = new Thread(this); - thread.setDaemon(true); - thread.start(); + executorService.submit(this); stopped = false; log.info("Web Application Server started {} port.", serverSocket.getLocalPort()); } From 85c117e0d9b323f85eba2a1be9b8ad64a30f80ad Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 13 Sep 2024 16:43:10 +0900 Subject: [PATCH 06/11] =?UTF-8?q?refactor:=20=EB=8F=99=EC=8B=9C=EC=84=B1?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/coyote/session/SessionManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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() {} From b1ce6e7603e5f3f61ff70183d1133de5c711c54a Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 13 Sep 2024 17:19:58 +0900 Subject: [PATCH 07/11] =?UTF-8?q?test:=20=ED=95=99=EC=8A=B5=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20stage=202=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/thread/stage2/SampleController.java | 7 ++++--- study/src/main/resources/application.yml | 2 +- study/src/test/java/thread/stage2/AppTest.java | 11 ++++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) 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(); } From 01b3a00ee24b561f962e6e8ef68f6d822d711c59 Mon Sep 17 00:00:00 2001 From: zangsu Date: Fri, 13 Sep 2024 17:36:16 +0900 Subject: [PATCH 08/11] =?UTF-8?q?refactor:=20=EB=86=93=EC=B3=A4=EB=8D=98?= =?UTF-8?q?=20=EC=8A=A4=EB=A0=88=EB=93=9C=20=EC=84=A4=EC=A0=95=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/apache/catalina/connector/Connector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2e178bc2c1..6612d98a82 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -74,7 +74,7 @@ private void process(Socket connection) { return; } var processor = new Http11Processor(servletContainer, connection); - new Thread(processor).start(); + executorService.submit(processor); } public void stop() { From f48b05d6a451e60ed4b95d0effd7c6df1423684b Mon Sep 17 00:00:00 2001 From: zangsu Date: Wed, 18 Sep 2024 17:40:13 +0900 Subject: [PATCH 09/11] =?UTF-8?q?refactor:=20`start()`=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EC=97=90=20=ED=95=A0=EB=8B=B9=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=8A=A4=EB=A0=88=EB=93=9C=EB=A5=BC=20=EC=8A=A4?= =?UTF-8?q?=EB=A0=88=EB=93=9C=ED=92=80=EC=97=90=EC=84=9C=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EC=A7=80=20=EC=95=8A=EA=B3=A0=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/catalina/connector/Connector.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 6612d98a82..caef265bf3 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -18,7 +18,7 @@ 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 = 250; + private static final int DEFAULT_MAX_THREAD_COUNT = 5; private final ServerSocket serverSocket; private final ServletContainer servletContainer; @@ -48,7 +48,9 @@ private ServerSocket createServerSocket(int port, int acceptCount) { } public void start() { - executorService.submit(this); + var thread = new Thread(this); + thread.setDaemon(true); + thread.start(); stopped = false; log.info("Web Application Server started {} port.", serverSocket.getLocalPort()); } From 36a521e7758c3cc13a7f5c3f3dccc315a1a055c7 Mon Sep 17 00:00:00 2001 From: zangsu Date: Wed, 18 Sep 2024 23:41:31 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor:=20trace=20=EB=A0=88=EB=B2=A8?= =?UTF-8?q?=EC=9D=98=20=EB=A1=9C=EA=B7=B8=EB=A5=BC=20=EB=B3=B4=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/coyote/http11/Http11Processor.java | 2 +- tomcat/src/main/resources/logback.xml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 tomcat/src/main/resources/logback.xml 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 056422b203..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; 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 + + + + + + + From 8a7ef8e8ce7b58b3c388ab11a647ac7a97bafe5c Mon Sep 17 00:00:00 2001 From: zangsu Date: Thu, 19 Sep 2024 20:26:23 +0900 Subject: [PATCH 11/11] =?UTF-8?q?feat:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=EC=9C=BC=EB=A1=9C=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=8B=9C=EB=8F=84=EC=8B=9C=20401=20=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/controller/LoginController.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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)) {