diff --git a/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java b/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java index 1ca30e8383..d043a8f1f2 100644 --- a/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java +++ b/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java @@ -1,27 +1,35 @@ package nextstep.jwp.db; -import nextstep.jwp.model.User; - import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import nextstep.jwp.model.User; public class InMemoryUserRepository { private static final Map database = new ConcurrentHashMap<>(); + private static final AtomicLong auto_increment = new AtomicLong(1); static { - final User user = new User(1L, "gugu", "password", "hkkang@woowahan.com"); + final User user = new User(auto_increment.getAndIncrement(), "gugu", "password", "hkkang@woowahan.com"); database.put(user.getAccount(), user); } public static void save(User user) { - database.put(user.getAccount(), user); + final User saveUser = new User( + auto_increment.getAndIncrement(), + user.getAccount(), + user.getPassword(), + user.getEmail() + ); + database.put(saveUser.getAccount(), saveUser); } public static Optional findByAccount(String account) { return Optional.ofNullable(database.get(account)); } - private InMemoryUserRepository() {} + private InMemoryUserRepository() { + } } diff --git a/tomcat/src/main/java/nextstep/jwp/model/User.java b/tomcat/src/main/java/nextstep/jwp/model/User.java index 4c2a2cd184..158ae5cce5 100644 --- a/tomcat/src/main/java/nextstep/jwp/model/User.java +++ b/tomcat/src/main/java/nextstep/jwp/model/User.java @@ -26,6 +26,14 @@ public String getAccount() { return account; } + public String getPassword() { + return password; + } + + public String getEmail() { + return email; + } + @Override public String toString() { return "User{" + 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 3b2c4dda7c..fd71342758 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -1,13 +1,16 @@ package org.apache.catalina.connector; -import org.apache.coyote.http11.Http11Processor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.UncheckedIOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import org.apache.coyote.http11.Http11Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Connector implements Runnable { @@ -15,15 +18,25 @@ public class Connector implements Runnable { private static final int DEFAULT_PORT = 8080; private static final int DEFAULT_ACCEPT_COUNT = 100; + private static final int MAX_THREAD = 250; + private static final int MAX_WAITING_COUNT = 100; + private final ExecutorService executorService; private final ServerSocket serverSocket; private boolean stopped; public Connector() { - this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT); + this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT, MAX_THREAD); } - public Connector(final int port, final int acceptCount) { + public Connector(final int port, final int acceptCount, final int maxThreads) { + this.executorService = new ThreadPoolExecutor( + maxThreads, + maxThreads, + 0, + TimeUnit.MILLISECONDS, + new LinkedBlockingDeque<>(MAX_WAITING_COUNT) + ); this.serverSocket = createServerSocket(port, acceptCount); this.stopped = false; } @@ -67,12 +80,13 @@ private void process(final Socket connection) { return; } var processor = new Http11Processor(connection); - new Thread(processor).start(); + executorService.submit(processor); } public void stop() { stopped = true; try { + executorService.shutdown(); serverSocket.close(); } catch (IOException e) { log.error(e.getMessage(), e); diff --git a/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java b/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java index 3044cbe1b5..59b81b058e 100644 --- a/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java +++ b/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java @@ -1,11 +1,11 @@ package org.apache.coyote.common; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class SessionManager { - private static final Map SESSIONS = new HashMap<>(); + private static final Map SESSIONS = new ConcurrentHashMap<>(); private SessionManager() { } @@ -15,6 +15,9 @@ public static void add(final Session session) { } public static Session findSession(final String id) { + if (id == null) { + return null; + } return SESSIONS.get(id); }