From 7bbffafd94126faf9ffa58fe059c71d5e4b41e47 Mon Sep 17 00:00:00 2001 From: lowoon Date: Mon, 16 Nov 2020 13:52:16 +0900 Subject: [PATCH 1/3] refactor: separate session service from controller --- src/main/java/controller/FileController.java | 14 +++---- .../java/domain/user/web/LoginController.java | 26 +++++------- .../domain/user/web/UserCreateController.java | 2 +- .../domain/user/web/UserListController.java | 3 +- .../domain/user/web/UserReadController.java | 3 +- .../java/session/db/SessionRepository.java | 4 ++ .../java/session/service/SessionService.java | 6 ++- src/main/java/utils/Extension.java | 18 ++++----- src/main/java/webserver/Context.java | 2 +- src/main/java/webserver/HttpRequest.java | 23 ++++++++++- src/main/java/webserver/RequestHandler.java | 13 ++++++ src/main/java/webserver/WebServer.java | 3 +- .../domain/user/web/LoginControllerTest.java | 12 +----- .../user/web/UserCreateControllerTest.java | 8 +--- .../user/web/UserListControllerTest.java | 5 +-- src/test/java/utils/ExtensionTest.java | 40 ++++--------------- 16 files changed, 88 insertions(+), 94 deletions(-) diff --git a/src/main/java/controller/FileController.java b/src/main/java/controller/FileController.java index bc87d5338..adfe5fb94 100644 --- a/src/main/java/controller/FileController.java +++ b/src/main/java/controller/FileController.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.net.URISyntaxException; +import java.util.Objects; import utils.Extension; import utils.FileIoUtils; @@ -16,13 +17,13 @@ public class FileController extends AbstractController { public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException { String path = httpRequest.getPath(); byte[] body = FileIoUtils.findStaticFile(path); - if (body != null) { + if (Objects.nonNull(body)) { httpResponse.setHttpStatus(HttpStatus.OK); addContentType(httpResponse, path); httpResponse.addHeader(HttpHeader.CONTENT_LENGTH, String.valueOf(body.length)); httpResponse.forward(body); } - if (body == null) { + if (Objects.isNull(body)) { httpResponse.setHttpStatus(HttpStatus.NOT_FOUND); httpResponse.error(); } @@ -30,12 +31,9 @@ public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOE private void addContentType(HttpResponse httpResponse, String path) { String extension = RequestUtils.extractExtension(path); - if (Extension.isJS(extension)) { - httpResponse.addHeader(HttpHeader.CONTENT_TYPE, "application/javascript;charset=utf-8"); - } - if (Extension.isCSS(extension) || Extension.isHTML(extension)) { - httpResponse.addHeader(HttpHeader.CONTENT_TYPE, - String.format("text/%s;charset=utf-8", RequestUtils.extractExtension(path))); + String contentType = Extension.getContentType(extension); + if (Objects.nonNull(contentType)) { + httpResponse.addHeader(HttpHeader.CONTENT_TYPE, contentType); } } } diff --git a/src/main/java/domain/user/web/LoginController.java b/src/main/java/domain/user/web/LoginController.java index 575adb954..ef0f3a8b3 100644 --- a/src/main/java/domain/user/web/LoginController.java +++ b/src/main/java/domain/user/web/LoginController.java @@ -1,12 +1,12 @@ package domain.user.web; import java.io.IOException; +import java.util.Objects; import controller.AbstractController; import domain.user.model.User; import domain.user.service.UserService; import session.model.HttpSession; -import session.service.SessionService; import webserver.HttpCookie; import webserver.HttpRequest; import webserver.HttpResponse; @@ -14,11 +14,9 @@ public class LoginController extends AbstractController { private final UserService userService; - private final SessionService sessionService; - public LoginController(UserService userService, SessionService sessionService) { + public LoginController(UserService userService) { this.userService = userService; - this.sessionService = sessionService; } @Override @@ -28,27 +26,23 @@ public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IO httpResponse.error(); return; } - HttpSession httpSession = new HttpSession(); - setHttpResponse(httpRequest, httpResponse, httpSession); - sessionService.addSession(httpSession); + setHttpResponse(httpRequest, httpResponse); } - private void setHttpResponse(HttpRequest httpRequest, HttpResponse httpResponse, HttpSession httpSession) throws + private void setHttpResponse(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID)); HttpCookie httpCookie = new HttpCookie(); - if (user == null) { - httpResponse.setHttpStatus(HttpStatus.FOUND); + HttpSession httpSession = httpRequest.getHttpSession(); + httpResponse.setHttpStatus(HttpStatus.FOUND); + httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); + httpCookie.apply(httpResponse); + if (Objects.isNull(user)) { httpSession.setAttribute("logined", false); - httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); - httpCookie.apply(httpResponse); httpResponse.sendRedirect("/user/login_failed.html"); } - if (user != null) { - httpResponse.setHttpStatus(HttpStatus.FOUND); + if (Objects.nonNull(user)) { httpSession.setAttribute("logined", true); - httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); - httpCookie.apply(httpResponse); httpResponse.sendRedirect("/index.html"); } } diff --git a/src/main/java/domain/user/web/UserCreateController.java b/src/main/java/domain/user/web/UserCreateController.java index cfb91582d..2febe8265 100644 --- a/src/main/java/domain/user/web/UserCreateController.java +++ b/src/main/java/domain/user/web/UserCreateController.java @@ -33,7 +33,7 @@ public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IO userService.addUser(user); HttpSession httpSession = new HttpSession(); httpSession.setAttribute("logined", true); - sessionService.addSession(httpSession); + sessionService.add(httpSession); HttpCookie httpCookie = new HttpCookie(); httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); httpCookie.apply(httpResponse); diff --git a/src/main/java/domain/user/web/UserListController.java b/src/main/java/domain/user/web/UserListController.java index 6a1839cc1..cb68c36e1 100644 --- a/src/main/java/domain/user/web/UserListController.java +++ b/src/main/java/domain/user/web/UserListController.java @@ -27,8 +27,7 @@ public UserListController(UserService userService, SessionService sessionService @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { - if (httpRequest.getSessionId() == null || - !(boolean)sessionService.findById(httpRequest.getSessionId()).getAttribute("logined")) { + if (httpRequest.notAuthorized()) { httpResponse.setHttpStatus(HttpStatus.UNAUTHORIZED); httpResponse.sendRedirect("/user/login.html"); return; diff --git a/src/main/java/domain/user/web/UserReadController.java b/src/main/java/domain/user/web/UserReadController.java index db8f7b328..517a52e14 100644 --- a/src/main/java/domain/user/web/UserReadController.java +++ b/src/main/java/domain/user/web/UserReadController.java @@ -1,6 +1,7 @@ package domain.user.web; import java.io.IOException; +import java.util.Objects; import com.fasterxml.jackson.databind.ObjectMapper; @@ -24,7 +25,7 @@ public UserReadController(UserService userService, ObjectMapper objectMapper) { @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID)); - if (user == null) { + if (Objects.isNull(user)) { validateParameter(httpRequest, httpResponse); httpResponse.error(); return; diff --git a/src/main/java/session/db/SessionRepository.java b/src/main/java/session/db/SessionRepository.java index be58c889b..b950a026a 100644 --- a/src/main/java/session/db/SessionRepository.java +++ b/src/main/java/session/db/SessionRepository.java @@ -16,4 +16,8 @@ public static void addSession(String sessionId, HttpSession httpSession) { public static HttpSession findById(String id) { return sessions.get(id); } + + public static void update(HttpSession httpSession) { + sessions.replace(httpSession.getId(), httpSession); + } } diff --git a/src/main/java/session/service/SessionService.java b/src/main/java/session/service/SessionService.java index 94b22df48..6cf9c490f 100644 --- a/src/main/java/session/service/SessionService.java +++ b/src/main/java/session/service/SessionService.java @@ -13,11 +13,15 @@ public static SessionService getInstance() { return instance; } - public void addSession(HttpSession httpSession) { + public void add(HttpSession httpSession) { SessionRepository.addSession(httpSession.getId(), httpSession); } public HttpSession findById(String id) { return SessionRepository.findById(id); } + + public void update(HttpSession httpSession) { + SessionRepository.update(httpSession); + } } diff --git a/src/main/java/utils/Extension.java b/src/main/java/utils/Extension.java index ae9837460..21fb11751 100644 --- a/src/main/java/utils/Extension.java +++ b/src/main/java/utils/Extension.java @@ -11,15 +11,13 @@ public enum Extension { this.title = title; } - public static boolean isJS(String extension) { - return extension.equals(JS.title); - } - - public static boolean isCSS(String extension) { - return extension.equals(CSS.title); - } - - public static boolean isHTML(String extension) { - return extension.equals(HTML.title); + public static String getContentType(String extension) { + if (JS.title.equals(extension)) { + return "application/javascript;charset=utf-8"; + } + if (CSS.title.equals(extension) || HTML.title.equals(extension)) { + return String.format("text/%s;charset=utf-8", extension); + } + return null; } } diff --git a/src/main/java/webserver/Context.java b/src/main/java/webserver/Context.java index 0fa276912..f9a96e8f8 100644 --- a/src/main/java/webserver/Context.java +++ b/src/main/java/webserver/Context.java @@ -33,7 +33,7 @@ public Map createControllerBifurcation() { controllers.put("file", new FileController()); controllers.put("/user/create", new UserCreateController(userService, sessionService)); controllers.put("/user/profile", new UserReadController(userService, objectMapper)); - controllers.put("/user/login", new LoginController(userService, sessionService)); + controllers.put("/user/login", new LoginController(userService)); controllers.put("/user/list", new UserListController(userService, sessionService, objectMapper)); return controllers; } diff --git a/src/main/java/webserver/HttpRequest.java b/src/main/java/webserver/HttpRequest.java index fadf1a502..921977b0e 100644 --- a/src/main/java/webserver/HttpRequest.java +++ b/src/main/java/webserver/HttpRequest.java @@ -4,8 +4,10 @@ import java.io.IOException; import java.util.Arrays; import java.util.Map; +import java.util.Objects; import java.util.TreeMap; +import session.model.HttpSession; import utils.IOUtils; import utils.RequestUtils; @@ -23,6 +25,7 @@ public class HttpRequest { private final Map header; private final Map parameter; private String path; + private HttpSession httpSession; public HttpRequest(BufferedReader br) throws IOException { this.header = new TreeMap<>(); @@ -52,7 +55,7 @@ private String readRequest(BufferedReader br) throws IOException { private void createHeader(BufferedReader br) throws IOException { String line = br.readLine(); - while (!EMPTY.equals(line) && line != null) { + while (!EMPTY.equals(line) && Objects.nonNull(line)) { String key = line.split(COLON)[KEY_INDEX]; String value = line.substring(key.length() + 2); header.put(key, value); @@ -70,7 +73,7 @@ private Map createParameter(BufferedReader br) throws IOExceptio public String getSessionId() { String cookie = header.get(HttpHeader.COOKIE); - if (cookie == null) { + if (Objects.isNull(cookie)) { return null; } return RequestUtils.extractSessionId(cookie); @@ -101,6 +104,22 @@ public boolean containsParameter(String key) { return parameter.containsKey(key); } + public boolean notAuthorized() { + Object logined = httpSession.getAttribute("logined"); + return Objects.isNull(logined) || !(boolean)logined; + } + + public void setHttpSession(HttpSession httpSession) { + this.httpSession = httpSession; + } + + public HttpSession getHttpSession() { + if (Objects.isNull(this.httpSession)) { + this.httpSession = new HttpSession(); + } + return this.httpSession; + } + public String getHeader(String key) { return header.get(key); } diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 55d6ebcd9..58f8fe7d5 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -9,11 +9,14 @@ import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import controller.Controller; +import session.model.HttpSession; +import session.service.SessionService; public class RequestHandler implements Runnable { private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class); @@ -21,11 +24,13 @@ public class RequestHandler implements Runnable { private final Socket connection; private final Context context; private final Map controllers; + private final SessionService sessionService; public RequestHandler(Socket connectionSocket) { this.connection = connectionSocket; this.context = Context.getInstance(); controllers = context.createControllerBifurcation(); + sessionService = SessionService.getInstance(); } public void run() { @@ -35,10 +40,18 @@ public void run() { try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); HttpRequest httpRequest = new HttpRequest(br); + if (Objects.isNull(httpRequest.getSessionId())) { + sessionService.add(httpRequest.getHttpSession()); + } + if (Objects.nonNull(httpRequest.getSessionId())) { + HttpSession httpSession = sessionService.findById(httpRequest.getSessionId()); + httpRequest.setHttpSession(httpSession); + } printHeader(httpRequest); printParameter(httpRequest); Controller controller = controllers.getOrDefault(httpRequest.getPath(), controllers.get("file")); controller.service(httpRequest, new HttpResponse(out)); + sessionService.update(httpRequest.getHttpSession()); } catch (IOException | URISyntaxException e) { logger.error(e.getMessage()); } diff --git a/src/main/java/webserver/WebServer.java b/src/main/java/webserver/WebServer.java index 2e7b08048..8451458f2 100644 --- a/src/main/java/webserver/WebServer.java +++ b/src/main/java/webserver/WebServer.java @@ -2,6 +2,7 @@ import java.net.ServerSocket; import java.net.Socket; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -15,7 +16,7 @@ public class WebServer { public static void main(String[] args) throws Exception { int port = 0; - if (args == null || args.length == 0) { + if (Objects.isNull(args) || args.length == 0) { port = DEFAULT_PORT; } else { port = Integer.parseInt(args[0]); diff --git a/src/test/java/domain/user/web/LoginControllerTest.java b/src/test/java/domain/user/web/LoginControllerTest.java index dcb7bc4f1..0eb94018a 100644 --- a/src/test/java/domain/user/web/LoginControllerTest.java +++ b/src/test/java/domain/user/web/LoginControllerTest.java @@ -13,15 +13,14 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import domain.user.model.User; import domain.user.service.UserService; -import session.service.SessionService; import webserver.HttpRequest; import webserver.HttpResponse; @@ -30,16 +29,9 @@ class LoginControllerTest { @Mock private UserService userService; - @Mock - private SessionService sessionService; - + @InjectMocks private LoginController loginController; - @BeforeEach - void setUp() { - loginController = new LoginController(userService, sessionService); - } - @Test void doPost() throws IOException { String request = "GET /admin/ HTTP/1.1\n" diff --git a/src/test/java/domain/user/web/UserCreateControllerTest.java b/src/test/java/domain/user/web/UserCreateControllerTest.java index 19e02ea89..fe4add7c9 100644 --- a/src/test/java/domain/user/web/UserCreateControllerTest.java +++ b/src/test/java/domain/user/web/UserCreateControllerTest.java @@ -11,9 +11,9 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -30,13 +30,9 @@ class UserCreateControllerTest { @Mock private SessionService sessionService; + @InjectMocks private UserCreateController userCreateController; - @BeforeEach - void setUp() { - userCreateController = new UserCreateController(userService, sessionService); - } - @Test void doPost() throws IOException { String request = "POST /admin/ HTTP/1.1\n" diff --git a/src/test/java/domain/user/web/UserListControllerTest.java b/src/test/java/domain/user/web/UserListControllerTest.java index 34d784c75..5014b5a07 100644 --- a/src/test/java/domain/user/web/UserListControllerTest.java +++ b/src/test/java/domain/user/web/UserListControllerTest.java @@ -53,10 +53,10 @@ void doGet() throws IOException { HttpRequest httpRequest = new HttpRequest(br); HttpSession httpSession = new HttpSession(); httpSession.setAttribute("logined", true); + httpRequest.setHttpSession(httpSession); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); HttpResponse httpResponse = new HttpResponse(byteArrayOutputStream); - given(sessionService.findById(anyString())).willReturn(httpSession); given(userService.list()).willReturn( Collections.singletonList(new User("userId", "password", "name", "email"))); @@ -78,11 +78,10 @@ void sessionNotExist() throws IOException { HttpRequest httpRequest = new HttpRequest(br); HttpSession httpSession = new HttpSession(); httpSession.setAttribute("logined", false); + httpRequest.setHttpSession(httpSession); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); HttpResponse httpResponse = new HttpResponse(byteArrayOutputStream); - given(sessionService.findById(anyString())).willReturn(httpSession); - userListController.doGet(httpRequest, httpResponse); String result = byteArrayOutputStream.toString("UTF-8"); diff --git a/src/test/java/utils/ExtensionTest.java b/src/test/java/utils/ExtensionTest.java index 996bdb57b..32edc2904 100644 --- a/src/test/java/utils/ExtensionTest.java +++ b/src/test/java/utils/ExtensionTest.java @@ -10,41 +10,17 @@ class ExtensionTest { @ParameterizedTest - @MethodSource("provideJSAndAnswer") - void isJS(String extension, boolean result) { - assertThat(Extension.isJS(extension)).isEqualTo(result); + @MethodSource("provideExtensionAndResult") + void getContentType(String extension, String result) { + assertThat(Extension.getContentType(extension)).isEqualTo(result); } - @ParameterizedTest - @MethodSource("provideCSSAndAnswer") - void isCSS(String extension, boolean result) { - assertThat(Extension.isCSS(extension)).isEqualTo(result); - } - - @ParameterizedTest - @MethodSource("provideHTMLAndAnswer") - void isHTML(String extension, boolean result) { - assertThat(Extension.isHTML(extension)).isEqualTo(result); - } - - private static Stream provideJSAndAnswer() { - return Stream.of( - Arguments.of("js", true), - Arguments.of("css", false) - ); - } - - private static Stream provideCSSAndAnswer() { - return Stream.of( - Arguments.of("css", true), - Arguments.of("js", false) - ); - } - - private static Stream provideHTMLAndAnswer() { + private static Stream provideExtensionAndResult() { return Stream.of( - Arguments.of("html", true), - Arguments.of("js", false) + Arguments.of("js", "application/javascript;charset=utf-8"), + Arguments.of("css", "text/css;charset=utf-8"), + Arguments.of("html", "text/html;charset=utf-8"), + Arguments.of("woff", null) ); } } From e3cf275aa1c4fb2b02551697d57f9cb36c037463 Mon Sep 17 00:00:00 2001 From: lowoon Date: Mon, 16 Nov 2020 17:27:46 +0900 Subject: [PATCH 2/3] feat: implement multi module --- .gitignore | 2 +- build.gradle | 42 ++++++------ module-api/.gitignore | 22 +++++++ module-api/build.gradle | 8 +++ module-api/module-api.iml | 8 +++ .../java/controller/AbstractController.java | 0 .../src}/main/java/controller/Controller.java | 0 .../main/java/controller/FileController.java | 0 .../controller/user}/LoginController.java | 8 +-- .../user}/UserCreateController.java | 10 +-- .../controller/user}/UserListController.java | 8 +-- .../controller/user}/UserReadController.java | 6 +- .../java/service/session}/SessionService.java | 6 +- .../main/java/service/user}/UserService.java | 6 +- .../src}/main/java/webserver/Context.java | 12 ++-- .../main/java/webserver/RequestHandler.java | 4 +- .../src}/main/java/webserver/WebServer.java | 0 module-api/src/main/resources/logback.xml | 13 ++++ .../controller/user}/LoginControllerTest.java | 6 +- .../user}/UserCreateControllerTest.java | 6 +- .../user}/UserListControllerTest.java | 10 +-- .../user}/UserReadControllerTest.java | 6 +- .../java/service/user}/UserServiceTest.java | 6 +- .../src/test/java/utils}/ExecutorsTest.java | 2 +- .../src}/test/java/utils/HandlebarsTest.java | 2 +- .../src}/test/resources/http/not_allowed.http | 0 .../src}/test/resources/http/not_found.http | 0 .../src}/test/resources/http/ok.http | 0 .../src}/test/resources/http/user.http | 0 module-common/.gitignore | 22 +++++++ module-common/build.gradle | 7 ++ module-common/module-common.iml | 8 +++ .../src/main/java/session}/HttpSession.java | 2 +- .../main/java/session}/SessionRepository.java | 4 +- .../src/main/java/user}/User.java | 2 +- .../src/main/java/user}/UserRepository.java | 4 +- .../src}/main/java/webserver/HttpCookie.java | 0 .../src}/main/java/webserver/HttpHeader.java | 0 .../src}/main/java/webserver/HttpMethod.java | 0 .../src}/main/java/webserver/HttpRequest.java | 2 +- .../main/java/webserver/HttpResponse.java | 0 .../src}/main/java/webserver/HttpStatus.java | 0 .../test/java/session}/HttpSessionTest.java | 2 +- .../test/java/webserver/HttpRequestTest.java | 0 .../test/java/webserver/HttpResponseTest.java | 5 +- .../src}/test/resources/Http_Error.txt | 0 .../src}/test/resources/Http_Forward.txt | 0 .../src}/test/resources/Http_Redirect.txt | 0 module-core/.gitignore | 22 +++++++ module-core/build.gradle | 7 ++ module-core/module-core.iml | 11 ++++ .../src}/main/java/utils/Extension.java | 0 .../src}/main/java/utils/FileIoUtils.java | 6 +- .../src}/main/java/utils/IOUtils.java | 0 .../src}/main/java/utils/RequestUtils.java | 0 .../resources/static/css/bootstrap.min.css | 0 .../src}/main/resources/static/css/styles.css | 0 .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin .../fonts/glyphicons-halflings-regular.woff2 | Bin .../main/resources/static/images/80-text.png | Bin .../src}/main/resources/static/js/api/user.js | 0 .../main/resources/static/js/bootstrap.min.js | 0 .../resources/static/js/jquery-2.2.0.min.js | 0 .../src}/main/resources/static/js/scripts.js | 0 .../main/resources/static/js/templates.js | 0 .../main/resources/static/js/user_list.js | 0 .../src}/main/resources/templates/favicon.ico | Bin .../src}/main/resources/templates/index.html | 0 .../main/resources/templates/qna/form.html | 0 .../main/resources/templates/qna/show.html | 0 .../main/resources/templates/user/form.html | 0 .../main/resources/templates/user/list.html | 0 .../main/resources/templates/user/login.html | 0 .../templates/user/login_failed.html | 0 .../resources/templates/user/profile.html | 0 .../src}/test/java/utils/ExtensionTest.java | 0 .../src}/test/java/utils/FileIoUtilsTest.java | 0 .../src}/test/java/utils/IOUtilsTest.java | 0 .../test/java/utils/RequestUtilsTest.java | 0 settings.gradle | 2 + src/main/resources/logback.xml | 13 ---- src/test/java/coordinate/AbstractFigure.java | 24 ------- src/test/java/coordinate/Figure.java | 13 ---- src/test/java/coordinate/FigureCreator.java | 7 -- src/test/java/coordinate/FigureFactory.java | 21 ------ .../java/coordinate/FigureFactoryTest.java | 46 ------------- src/test/java/coordinate/Line.java | 24 ------- src/test/java/coordinate/Point.java | 62 ------------------ src/test/java/coordinate/Rectangle.java | 24 ------- src/test/java/coordinate/Triangle.java | 24 ------- 93 files changed, 210 insertions(+), 347 deletions(-) create mode 100644 module-api/.gitignore create mode 100644 module-api/build.gradle create mode 100644 module-api/module-api.iml rename {src => module-api/src}/main/java/controller/AbstractController.java (100%) rename {src => module-api/src}/main/java/controller/Controller.java (100%) rename {src => module-api/src}/main/java/controller/FileController.java (100%) rename {src/main/java/domain/user/web => module-api/src/main/java/controller/user}/LoginController.java (92%) rename {src/main/java/domain/user/web => module-api/src/main/java/controller/user}/UserCreateController.java (90%) rename {src/main/java/domain/user/web => module-api/src/main/java/controller/user}/UserListController.java (90%) rename {src/main/java/domain/user/web => module-api/src/main/java/controller/user}/UserReadController.java (94%) rename {src/main/java/session/service => module-api/src/main/java/service/session}/SessionService.java (85%) rename {src/main/java/domain/user/service => module-api/src/main/java/service/user}/UserService.java (84%) rename {src => module-api/src}/main/java/webserver/Context.java (82%) rename {src => module-api/src}/main/java/webserver/RequestHandler.java (97%) rename {src => module-api/src}/main/java/webserver/WebServer.java (100%) create mode 100644 module-api/src/main/resources/logback.xml rename {src/test/java/domain/user/web => module-api/src/test/java/controller/user}/LoginControllerTest.java (97%) rename {src/test/java/domain/user/web => module-api/src/test/java/controller/user}/UserCreateControllerTest.java (96%) rename {src/test/java/domain/user/web => module-api/src/test/java/controller/user}/UserListControllerTest.java (94%) rename {src/test/java/domain/user/web => module-api/src/test/java/controller/user}/UserReadControllerTest.java (96%) rename {src/test/java/domain/user/service => module-api/src/test/java/service/user}/UserServiceTest.java (91%) rename {src/test/java/webserver => module-api/src/test/java/utils}/ExecutorsTest.java (98%) rename {src => module-api/src}/test/java/utils/HandlebarsTest.java (96%) rename {src => module-api/src}/test/resources/http/not_allowed.http (100%) rename {src => module-api/src}/test/resources/http/not_found.http (100%) rename {src => module-api/src}/test/resources/http/ok.http (100%) rename {src => module-api/src}/test/resources/http/user.http (100%) create mode 100644 module-common/.gitignore create mode 100644 module-common/build.gradle create mode 100644 module-common/module-common.iml rename {src/main/java/session/model => module-common/src/main/java/session}/HttpSession.java (97%) rename {src/main/java/session/db => module-common/src/main/java/session}/SessionRepository.java (90%) rename {src/main/java/domain/user/model => module-common/src/main/java/user}/User.java (97%) rename {src/main/java/domain/user/db => module-common/src/main/java/user}/UserRepository.java (90%) rename {src => module-common/src}/main/java/webserver/HttpCookie.java (100%) rename {src => module-common/src}/main/java/webserver/HttpHeader.java (100%) rename {src => module-common/src}/main/java/webserver/HttpMethod.java (100%) rename {src => module-common/src}/main/java/webserver/HttpRequest.java (99%) rename {src => module-common/src}/main/java/webserver/HttpResponse.java (100%) rename {src => module-common/src}/main/java/webserver/HttpStatus.java (100%) rename {src/test/java/session/model => module-common/src/test/java/session}/HttpSessionTest.java (97%) rename {src => module-common/src}/test/java/webserver/HttpRequestTest.java (100%) rename {src => module-common/src}/test/java/webserver/HttpResponseTest.java (91%) rename {src => module-common/src}/test/resources/Http_Error.txt (100%) rename {src => module-common/src}/test/resources/Http_Forward.txt (100%) rename {src => module-common/src}/test/resources/Http_Redirect.txt (100%) create mode 100644 module-core/.gitignore create mode 100644 module-core/build.gradle create mode 100644 module-core/module-core.iml rename {src => module-core/src}/main/java/utils/Extension.java (100%) rename {src => module-core/src}/main/java/utils/FileIoUtils.java (80%) rename {src => module-core/src}/main/java/utils/IOUtils.java (100%) rename {src => module-core/src}/main/java/utils/RequestUtils.java (100%) rename {src => module-core/src}/main/resources/static/css/bootstrap.min.css (100%) rename {src => module-core/src}/main/resources/static/css/styles.css (100%) rename {src => module-core/src}/main/resources/static/fonts/glyphicons-halflings-regular.eot (100%) rename {src => module-core/src}/main/resources/static/fonts/glyphicons-halflings-regular.svg (100%) rename {src => module-core/src}/main/resources/static/fonts/glyphicons-halflings-regular.ttf (100%) rename {src => module-core/src}/main/resources/static/fonts/glyphicons-halflings-regular.woff (100%) rename {src => module-core/src}/main/resources/static/fonts/glyphicons-halflings-regular.woff2 (100%) rename {src => module-core/src}/main/resources/static/images/80-text.png (100%) rename {src => module-core/src}/main/resources/static/js/api/user.js (100%) rename {src => module-core/src}/main/resources/static/js/bootstrap.min.js (100%) rename {src => module-core/src}/main/resources/static/js/jquery-2.2.0.min.js (100%) rename {src => module-core/src}/main/resources/static/js/scripts.js (100%) rename {src => module-core/src}/main/resources/static/js/templates.js (100%) rename {src => module-core/src}/main/resources/static/js/user_list.js (100%) rename {src => module-core/src}/main/resources/templates/favicon.ico (100%) rename {src => module-core/src}/main/resources/templates/index.html (100%) rename {src => module-core/src}/main/resources/templates/qna/form.html (100%) rename {src => module-core/src}/main/resources/templates/qna/show.html (100%) rename {src => module-core/src}/main/resources/templates/user/form.html (100%) rename {src => module-core/src}/main/resources/templates/user/list.html (100%) rename {src => module-core/src}/main/resources/templates/user/login.html (100%) rename {src => module-core/src}/main/resources/templates/user/login_failed.html (100%) rename {src => module-core/src}/main/resources/templates/user/profile.html (100%) rename {src => module-core/src}/test/java/utils/ExtensionTest.java (100%) rename {src => module-core/src}/test/java/utils/FileIoUtilsTest.java (100%) rename {src => module-core/src}/test/java/utils/IOUtilsTest.java (100%) rename {src => module-core/src}/test/java/utils/RequestUtilsTest.java (100%) create mode 100644 settings.gradle delete mode 100644 src/main/resources/logback.xml delete mode 100644 src/test/java/coordinate/AbstractFigure.java delete mode 100644 src/test/java/coordinate/Figure.java delete mode 100644 src/test/java/coordinate/FigureCreator.java delete mode 100644 src/test/java/coordinate/FigureFactory.java delete mode 100644 src/test/java/coordinate/FigureFactoryTest.java delete mode 100644 src/test/java/coordinate/Line.java delete mode 100644 src/test/java/coordinate/Point.java delete mode 100644 src/test/java/coordinate/Rectangle.java delete mode 100644 src/test/java/coordinate/Triangle.java diff --git a/.gitignore b/.gitignore index 76611b072..1e30cbf03 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ bin/ .idea *.iws *.iml -*.ipr \ No newline at end of file +*.ipr diff --git a/build.gradle b/build.gradle index 2c9a6618c..59abdc060 100644 --- a/build.gradle +++ b/build.gradle @@ -1,28 +1,24 @@ -plugins { - id 'java' - id 'idea' - id 'eclipse' -} +subprojects { + version = '1.0.0' -version = '1.0.0' -sourceCompatibility = 1.8 + apply plugin: 'java' + apply plugin: 'idea' + apply plugin: 'eclipse' -repositories { - mavenCentral() -} + repositories { + mavenCentral() + } -dependencies { - implementation 'com.google.guava:guava:29.0-jre' - implementation 'ch.qos.logback:logback-classic:1.2.3' - implementation 'com.github.jknack:handlebars:4.2.0' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.0' - implementation 'org.springframework:spring-core:5.2.6.RELEASE' - implementation 'org.mockito:mockito-core:3.5.15' - implementation 'org.mockito:mockito-junit-jupiter:3.5.15' - testImplementation 'org.junit.jupiter:junit-jupiter:5.6.2' - testImplementation 'org.assertj:assertj-core:3.16.1' -} + dependencies { + implementation 'com.google.guava:guava:29.0-jre' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.0' + implementation 'org.mockito:mockito-core:3.5.15' + implementation 'org.mockito:mockito-junit-jupiter:3.5.15' + testImplementation 'org.junit.jupiter:junit-jupiter:5.6.2' + testImplementation 'org.assertj:assertj-core:3.16.1' + } -test { - useJUnitPlatform() + test { + useJUnitPlatform() + } } diff --git a/module-api/.gitignore b/module-api/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/module-api/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/module-api/build.gradle b/module-api/build.gradle new file mode 100644 index 000000000..816976dcf --- /dev/null +++ b/module-api/build.gradle @@ -0,0 +1,8 @@ +dependencies { + implementation project(':module-core') + implementation project(':module-common') + + implementation 'org.springframework:spring-core:5.2.6.RELEASE' + implementation 'com.github.jknack:handlebars:4.2.0' + implementation 'ch.qos.logback:logback-classic:1.2.3' +} diff --git a/module-api/module-api.iml b/module-api/module-api.iml new file mode 100644 index 000000000..4a4ce5540 --- /dev/null +++ b/module-api/module-api.iml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/controller/AbstractController.java b/module-api/src/main/java/controller/AbstractController.java similarity index 100% rename from src/main/java/controller/AbstractController.java rename to module-api/src/main/java/controller/AbstractController.java diff --git a/src/main/java/controller/Controller.java b/module-api/src/main/java/controller/Controller.java similarity index 100% rename from src/main/java/controller/Controller.java rename to module-api/src/main/java/controller/Controller.java diff --git a/src/main/java/controller/FileController.java b/module-api/src/main/java/controller/FileController.java similarity index 100% rename from src/main/java/controller/FileController.java rename to module-api/src/main/java/controller/FileController.java diff --git a/src/main/java/domain/user/web/LoginController.java b/module-api/src/main/java/controller/user/LoginController.java similarity index 92% rename from src/main/java/domain/user/web/LoginController.java rename to module-api/src/main/java/controller/user/LoginController.java index ef0f3a8b3..6b7e6a540 100644 --- a/src/main/java/domain/user/web/LoginController.java +++ b/module-api/src/main/java/controller/user/LoginController.java @@ -1,12 +1,12 @@ -package domain.user.web; +package controller.user; import java.io.IOException; import java.util.Objects; import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; -import session.model.HttpSession; +import service.user.UserService; +import session.HttpSession; +import user.User; import webserver.HttpCookie; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/main/java/domain/user/web/UserCreateController.java b/module-api/src/main/java/controller/user/UserCreateController.java similarity index 90% rename from src/main/java/domain/user/web/UserCreateController.java rename to module-api/src/main/java/controller/user/UserCreateController.java index 2febe8265..e7efcdc8e 100644 --- a/src/main/java/domain/user/web/UserCreateController.java +++ b/module-api/src/main/java/controller/user/UserCreateController.java @@ -1,12 +1,12 @@ -package domain.user.web; +package controller.user; import java.io.IOException; import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; -import session.model.HttpSession; -import session.service.SessionService; +import service.session.SessionService; +import service.user.UserService; +import session.HttpSession; +import user.User; import webserver.HttpCookie; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/main/java/domain/user/web/UserListController.java b/module-api/src/main/java/controller/user/UserListController.java similarity index 90% rename from src/main/java/domain/user/web/UserListController.java rename to module-api/src/main/java/controller/user/UserListController.java index cb68c36e1..216292fb0 100644 --- a/src/main/java/domain/user/web/UserListController.java +++ b/module-api/src/main/java/controller/user/UserListController.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import java.io.IOException; import java.util.List; @@ -6,9 +6,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; -import session.service.SessionService; +import service.session.SessionService; +import service.user.UserService; +import user.User; import webserver.HttpHeader; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/main/java/domain/user/web/UserReadController.java b/module-api/src/main/java/controller/user/UserReadController.java similarity index 94% rename from src/main/java/domain/user/web/UserReadController.java rename to module-api/src/main/java/controller/user/UserReadController.java index 517a52e14..0e350ae78 100644 --- a/src/main/java/domain/user/web/UserReadController.java +++ b/module-api/src/main/java/controller/user/UserReadController.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import java.io.IOException; import java.util.Objects; @@ -6,8 +6,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; +import service.user.UserService; +import user.User; import webserver.HttpHeader; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/main/java/session/service/SessionService.java b/module-api/src/main/java/service/session/SessionService.java similarity index 85% rename from src/main/java/session/service/SessionService.java rename to module-api/src/main/java/service/session/SessionService.java index 6cf9c490f..bd4fde9e9 100644 --- a/src/main/java/session/service/SessionService.java +++ b/module-api/src/main/java/service/session/SessionService.java @@ -1,7 +1,7 @@ -package session.service; +package service.session; -import session.db.SessionRepository; -import session.model.HttpSession; +import session.HttpSession; +import session.SessionRepository; public class SessionService { private static SessionService instance = new SessionService(); diff --git a/src/main/java/domain/user/service/UserService.java b/module-api/src/main/java/service/user/UserService.java similarity index 84% rename from src/main/java/domain/user/service/UserService.java rename to module-api/src/main/java/service/user/UserService.java index 1c17c30d1..e38d0d357 100644 --- a/src/main/java/domain/user/service/UserService.java +++ b/module-api/src/main/java/service/user/UserService.java @@ -1,10 +1,10 @@ -package domain.user.service; +package service.user; import java.util.ArrayList; import java.util.List; -import domain.user.db.UserRepository; -import domain.user.model.User; +import user.User; +import user.UserRepository; public class UserService { private static final UserService instance = new UserService(); diff --git a/src/main/java/webserver/Context.java b/module-api/src/main/java/webserver/Context.java similarity index 82% rename from src/main/java/webserver/Context.java rename to module-api/src/main/java/webserver/Context.java index f9a96e8f8..829dc79be 100644 --- a/src/main/java/webserver/Context.java +++ b/module-api/src/main/java/webserver/Context.java @@ -7,12 +7,12 @@ import controller.Controller; import controller.FileController; -import domain.user.service.UserService; -import domain.user.web.LoginController; -import domain.user.web.UserCreateController; -import domain.user.web.UserListController; -import domain.user.web.UserReadController; -import session.service.SessionService; +import controller.user.LoginController; +import controller.user.UserCreateController; +import controller.user.UserListController; +import controller.user.UserReadController; +import service.session.SessionService; +import service.user.UserService; public class Context { private static final ObjectMapper objectMapper = new ObjectMapper(); diff --git a/src/main/java/webserver/RequestHandler.java b/module-api/src/main/java/webserver/RequestHandler.java similarity index 97% rename from src/main/java/webserver/RequestHandler.java rename to module-api/src/main/java/webserver/RequestHandler.java index 58f8fe7d5..5e2a57be9 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/module-api/src/main/java/webserver/RequestHandler.java @@ -15,8 +15,8 @@ import org.slf4j.LoggerFactory; import controller.Controller; -import session.model.HttpSession; -import session.service.SessionService; +import service.session.SessionService; +import session.HttpSession; public class RequestHandler implements Runnable { private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class); diff --git a/src/main/java/webserver/WebServer.java b/module-api/src/main/java/webserver/WebServer.java similarity index 100% rename from src/main/java/webserver/WebServer.java rename to module-api/src/main/java/webserver/WebServer.java diff --git a/module-api/src/main/resources/logback.xml b/module-api/src/main/resources/logback.xml new file mode 100644 index 000000000..d601ca22e --- /dev/null +++ b/module-api/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + + %d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n + + + + + + + diff --git a/src/test/java/domain/user/web/LoginControllerTest.java b/module-api/src/test/java/controller/user/LoginControllerTest.java similarity index 97% rename from src/test/java/domain/user/web/LoginControllerTest.java rename to module-api/src/test/java/controller/user/LoginControllerTest.java index 0eb94018a..efc048855 100644 --- a/src/test/java/domain/user/web/LoginControllerTest.java +++ b/module-api/src/test/java/controller/user/LoginControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; @@ -19,8 +19,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import domain.user.model.User; -import domain.user.service.UserService; +import service.user.UserService; +import user.User; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/test/java/domain/user/web/UserCreateControllerTest.java b/module-api/src/test/java/controller/user/UserCreateControllerTest.java similarity index 96% rename from src/test/java/domain/user/web/UserCreateControllerTest.java rename to module-api/src/test/java/controller/user/UserCreateControllerTest.java index fe4add7c9..4182985c5 100644 --- a/src/test/java/domain/user/web/UserCreateControllerTest.java +++ b/module-api/src/test/java/controller/user/UserCreateControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; @@ -17,8 +17,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import domain.user.service.UserService; -import session.service.SessionService; +import service.session.SessionService; +import service.user.UserService; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/test/java/domain/user/web/UserListControllerTest.java b/module-api/src/test/java/controller/user/UserListControllerTest.java similarity index 94% rename from src/test/java/domain/user/web/UserListControllerTest.java rename to module-api/src/test/java/controller/user/UserListControllerTest.java index 5014b5a07..775e4aeba 100644 --- a/src/test/java/domain/user/web/UserListControllerTest.java +++ b/module-api/src/test/java/controller/user/UserListControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; @@ -20,10 +20,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import domain.user.model.User; -import domain.user.service.UserService; -import session.model.HttpSession; -import session.service.SessionService; +import service.session.SessionService; +import service.user.UserService; +import session.HttpSession; +import user.User; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/test/java/domain/user/web/UserReadControllerTest.java b/module-api/src/test/java/controller/user/UserReadControllerTest.java similarity index 96% rename from src/test/java/domain/user/web/UserReadControllerTest.java rename to module-api/src/test/java/controller/user/UserReadControllerTest.java index b1b8e9d51..19fca2d94 100644 --- a/src/test/java/domain/user/web/UserReadControllerTest.java +++ b/module-api/src/test/java/controller/user/UserReadControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; @@ -19,8 +19,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import domain.user.model.User; -import domain.user.service.UserService; +import service.user.UserService; +import user.User; import webserver.HttpRequest; import webserver.HttpResponse; diff --git a/src/test/java/domain/user/service/UserServiceTest.java b/module-api/src/test/java/service/user/UserServiceTest.java similarity index 91% rename from src/test/java/domain/user/service/UserServiceTest.java rename to module-api/src/test/java/service/user/UserServiceTest.java index 6369abe56..c602f4a7e 100644 --- a/src/test/java/domain/user/service/UserServiceTest.java +++ b/module-api/src/test/java/service/user/UserServiceTest.java @@ -1,4 +1,4 @@ -package domain.user.service; +package service.user; import static org.assertj.core.api.Assertions.*; @@ -7,8 +7,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import domain.user.db.UserRepository; -import domain.user.model.User; +import user.User; +import user.UserRepository; class UserServiceTest { private final UserService userService = UserService.getInstance(); diff --git a/src/test/java/webserver/ExecutorsTest.java b/module-api/src/test/java/utils/ExecutorsTest.java similarity index 98% rename from src/test/java/webserver/ExecutorsTest.java rename to module-api/src/test/java/utils/ExecutorsTest.java index 449b5aa4b..1dc63c558 100644 --- a/src/test/java/webserver/ExecutorsTest.java +++ b/module-api/src/test/java/utils/ExecutorsTest.java @@ -1,4 +1,4 @@ -package webserver; +package utils; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/src/test/java/utils/HandlebarsTest.java b/module-api/src/test/java/utils/HandlebarsTest.java similarity index 96% rename from src/test/java/utils/HandlebarsTest.java rename to module-api/src/test/java/utils/HandlebarsTest.java index 835b8c61f..36dc0b985 100644 --- a/src/test/java/utils/HandlebarsTest.java +++ b/module-api/src/test/java/utils/HandlebarsTest.java @@ -9,7 +9,7 @@ import com.github.jknack.handlebars.io.ClassPathTemplateLoader; import com.github.jknack.handlebars.io.TemplateLoader; -import domain.user.model.User; +import user.User; public class HandlebarsTest { private static final Logger log = LoggerFactory.getLogger(HandlebarsTest.class); diff --git a/src/test/resources/http/not_allowed.http b/module-api/src/test/resources/http/not_allowed.http similarity index 100% rename from src/test/resources/http/not_allowed.http rename to module-api/src/test/resources/http/not_allowed.http diff --git a/src/test/resources/http/not_found.http b/module-api/src/test/resources/http/not_found.http similarity index 100% rename from src/test/resources/http/not_found.http rename to module-api/src/test/resources/http/not_found.http diff --git a/src/test/resources/http/ok.http b/module-api/src/test/resources/http/ok.http similarity index 100% rename from src/test/resources/http/ok.http rename to module-api/src/test/resources/http/ok.http diff --git a/src/test/resources/http/user.http b/module-api/src/test/resources/http/user.http similarity index 100% rename from src/test/resources/http/user.http rename to module-api/src/test/resources/http/user.http diff --git a/module-common/.gitignore b/module-common/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/module-common/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/module-common/build.gradle b/module-common/build.gradle new file mode 100644 index 000000000..491f64f5c --- /dev/null +++ b/module-common/build.gradle @@ -0,0 +1,7 @@ +jar { + enabled = true +} + +dependencies { + implementation project(':module-core') +} diff --git a/module-common/module-common.iml b/module-common/module-common.iml new file mode 100644 index 000000000..4a4ce5540 --- /dev/null +++ b/module-common/module-common.iml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/session/model/HttpSession.java b/module-common/src/main/java/session/HttpSession.java similarity index 97% rename from src/main/java/session/model/HttpSession.java rename to module-common/src/main/java/session/HttpSession.java index e478aafde..54ea223ec 100644 --- a/src/main/java/session/model/HttpSession.java +++ b/module-common/src/main/java/session/HttpSession.java @@ -1,4 +1,4 @@ -package session.model; +package session; import java.util.Map; import java.util.UUID; diff --git a/src/main/java/session/db/SessionRepository.java b/module-common/src/main/java/session/SessionRepository.java similarity index 90% rename from src/main/java/session/db/SessionRepository.java rename to module-common/src/main/java/session/SessionRepository.java index b950a026a..0366c46c2 100644 --- a/src/main/java/session/db/SessionRepository.java +++ b/module-common/src/main/java/session/SessionRepository.java @@ -1,11 +1,9 @@ -package session.db; +package session; import java.util.Map; import com.google.common.collect.Maps; -import session.model.HttpSession; - public class SessionRepository { private static final Map sessions = Maps.newHashMap(); diff --git a/src/main/java/domain/user/model/User.java b/module-common/src/main/java/user/User.java similarity index 97% rename from src/main/java/domain/user/model/User.java rename to module-common/src/main/java/user/User.java index 3e6b83667..874d36b4e 100644 --- a/src/main/java/domain/user/model/User.java +++ b/module-common/src/main/java/user/User.java @@ -1,4 +1,4 @@ -package domain.user.model; +package user; public class User { public static final String USER_ID = "userId"; diff --git a/src/main/java/domain/user/db/UserRepository.java b/module-common/src/main/java/user/UserRepository.java similarity index 90% rename from src/main/java/domain/user/db/UserRepository.java rename to module-common/src/main/java/user/UserRepository.java index 4ac7ec2b0..a1bf1fdb5 100644 --- a/src/main/java/domain/user/db/UserRepository.java +++ b/module-common/src/main/java/user/UserRepository.java @@ -1,12 +1,10 @@ -package domain.user.db; +package user; import java.util.Collection; import java.util.Map; import com.google.common.collect.Maps; -import domain.user.model.User; - public class UserRepository { private static final Map users = Maps.newHashMap(); diff --git a/src/main/java/webserver/HttpCookie.java b/module-common/src/main/java/webserver/HttpCookie.java similarity index 100% rename from src/main/java/webserver/HttpCookie.java rename to module-common/src/main/java/webserver/HttpCookie.java diff --git a/src/main/java/webserver/HttpHeader.java b/module-common/src/main/java/webserver/HttpHeader.java similarity index 100% rename from src/main/java/webserver/HttpHeader.java rename to module-common/src/main/java/webserver/HttpHeader.java diff --git a/src/main/java/webserver/HttpMethod.java b/module-common/src/main/java/webserver/HttpMethod.java similarity index 100% rename from src/main/java/webserver/HttpMethod.java rename to module-common/src/main/java/webserver/HttpMethod.java diff --git a/src/main/java/webserver/HttpRequest.java b/module-common/src/main/java/webserver/HttpRequest.java similarity index 99% rename from src/main/java/webserver/HttpRequest.java rename to module-common/src/main/java/webserver/HttpRequest.java index 921977b0e..1ee24fbbb 100644 --- a/src/main/java/webserver/HttpRequest.java +++ b/module-common/src/main/java/webserver/HttpRequest.java @@ -7,7 +7,7 @@ import java.util.Objects; import java.util.TreeMap; -import session.model.HttpSession; +import session.HttpSession; import utils.IOUtils; import utils.RequestUtils; diff --git a/src/main/java/webserver/HttpResponse.java b/module-common/src/main/java/webserver/HttpResponse.java similarity index 100% rename from src/main/java/webserver/HttpResponse.java rename to module-common/src/main/java/webserver/HttpResponse.java diff --git a/src/main/java/webserver/HttpStatus.java b/module-common/src/main/java/webserver/HttpStatus.java similarity index 100% rename from src/main/java/webserver/HttpStatus.java rename to module-common/src/main/java/webserver/HttpStatus.java diff --git a/src/test/java/session/model/HttpSessionTest.java b/module-common/src/test/java/session/HttpSessionTest.java similarity index 97% rename from src/test/java/session/model/HttpSessionTest.java rename to module-common/src/test/java/session/HttpSessionTest.java index 79cda7828..933f65b4b 100644 --- a/src/test/java/session/model/HttpSessionTest.java +++ b/module-common/src/test/java/session/HttpSessionTest.java @@ -1,4 +1,4 @@ -package session.model; +package session; import static org.assertj.core.api.Assertions.*; diff --git a/src/test/java/webserver/HttpRequestTest.java b/module-common/src/test/java/webserver/HttpRequestTest.java similarity index 100% rename from src/test/java/webserver/HttpRequestTest.java rename to module-common/src/test/java/webserver/HttpRequestTest.java diff --git a/src/test/java/webserver/HttpResponseTest.java b/module-common/src/test/java/webserver/HttpResponseTest.java similarity index 91% rename from src/test/java/webserver/HttpResponseTest.java rename to module-common/src/test/java/webserver/HttpResponseTest.java index 54986eb7c..1bf1671b1 100644 --- a/src/test/java/webserver/HttpResponseTest.java +++ b/module-common/src/test/java/webserver/HttpResponseTest.java @@ -3,7 +3,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.IOException; import java.io.OutputStream; import org.junit.jupiter.api.Test; @@ -34,14 +33,14 @@ public void responseRedirect() throws Exception { } @Test - public void error() throws IOException { + public void error() throws Exception { HttpResponse response = new HttpResponse(createOutputStream("Http_Error.txt")); response.setHttpStatus(HttpStatus.BAD_REQUEST); response.error(); } private OutputStream createOutputStream(String filename) throws FileNotFoundException { - String testDirectory = "./src/test/resources/"; + String testDirectory = "/Users/sangbo/Projects/woowa/jwp-was/module-common/src/test/resources/"; return new FileOutputStream(new File(testDirectory + filename)); } } diff --git a/src/test/resources/Http_Error.txt b/module-common/src/test/resources/Http_Error.txt similarity index 100% rename from src/test/resources/Http_Error.txt rename to module-common/src/test/resources/Http_Error.txt diff --git a/src/test/resources/Http_Forward.txt b/module-common/src/test/resources/Http_Forward.txt similarity index 100% rename from src/test/resources/Http_Forward.txt rename to module-common/src/test/resources/Http_Forward.txt diff --git a/src/test/resources/Http_Redirect.txt b/module-common/src/test/resources/Http_Redirect.txt similarity index 100% rename from src/test/resources/Http_Redirect.txt rename to module-common/src/test/resources/Http_Redirect.txt diff --git a/module-core/.gitignore b/module-core/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/module-core/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/module-core/build.gradle b/module-core/build.gradle new file mode 100644 index 000000000..3c31111ab --- /dev/null +++ b/module-core/build.gradle @@ -0,0 +1,7 @@ +jar { + enabled = true +} + +dependencies { + implementation 'org.slf4j:slf4j-log4j12:1.7.29' +} diff --git a/module-core/module-core.iml b/module-core/module-core.iml new file mode 100644 index 000000000..98212fd64 --- /dev/null +++ b/module-core/module-core.iml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/utils/Extension.java b/module-core/src/main/java/utils/Extension.java similarity index 100% rename from src/main/java/utils/Extension.java rename to module-core/src/main/java/utils/Extension.java diff --git a/src/main/java/utils/FileIoUtils.java b/module-core/src/main/java/utils/FileIoUtils.java similarity index 80% rename from src/main/java/utils/FileIoUtils.java rename to module-core/src/main/java/utils/FileIoUtils.java index 7de203157..94f74e287 100644 --- a/src/main/java/utils/FileIoUtils.java +++ b/module-core/src/main/java/utils/FileIoUtils.java @@ -8,8 +8,8 @@ import java.nio.file.Paths; public class FileIoUtils { - public static final String TEMPLATE_PATH = "./src/main/resources/templates"; - public static final String STATIC_PATH = "./src/main/resources/static"; + public static final String TEMPLATE_PATH = "/Users/sangbo/Projects/woowa/jwp-was/module-core/src/main/resources/templates"; + public static final String STATIC_PATH = "/Users/sangbo/Projects/woowa/jwp-was/module-core/src/main/resources/static"; public static final String TEMPLATE_CLASS_PATH = "./templates"; public static final String STATIC_CLASS_PATH = "./static"; @@ -24,7 +24,7 @@ public static byte[] findStaticFile(String path) throws IOException, URISyntaxEx } return null; } - + public static byte[] loadFileFromClasspath(String filePath) throws IOException, URISyntaxException { Path path = Paths.get(FileIoUtils.class.getClassLoader().getResource(filePath).toURI()); return Files.readAllBytes(path); diff --git a/src/main/java/utils/IOUtils.java b/module-core/src/main/java/utils/IOUtils.java similarity index 100% rename from src/main/java/utils/IOUtils.java rename to module-core/src/main/java/utils/IOUtils.java diff --git a/src/main/java/utils/RequestUtils.java b/module-core/src/main/java/utils/RequestUtils.java similarity index 100% rename from src/main/java/utils/RequestUtils.java rename to module-core/src/main/java/utils/RequestUtils.java diff --git a/src/main/resources/static/css/bootstrap.min.css b/module-core/src/main/resources/static/css/bootstrap.min.css similarity index 100% rename from src/main/resources/static/css/bootstrap.min.css rename to module-core/src/main/resources/static/css/bootstrap.min.css diff --git a/src/main/resources/static/css/styles.css b/module-core/src/main/resources/static/css/styles.css similarity index 100% rename from src/main/resources/static/css/styles.css rename to module-core/src/main/resources/static/css/styles.css diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.eot b/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.eot rename to module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.svg b/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.svg rename to module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf b/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.ttf rename to module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.woff b/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.woff rename to module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 b/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 rename to module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 diff --git a/src/main/resources/static/images/80-text.png b/module-core/src/main/resources/static/images/80-text.png similarity index 100% rename from src/main/resources/static/images/80-text.png rename to module-core/src/main/resources/static/images/80-text.png diff --git a/src/main/resources/static/js/api/user.js b/module-core/src/main/resources/static/js/api/user.js similarity index 100% rename from src/main/resources/static/js/api/user.js rename to module-core/src/main/resources/static/js/api/user.js diff --git a/src/main/resources/static/js/bootstrap.min.js b/module-core/src/main/resources/static/js/bootstrap.min.js similarity index 100% rename from src/main/resources/static/js/bootstrap.min.js rename to module-core/src/main/resources/static/js/bootstrap.min.js diff --git a/src/main/resources/static/js/jquery-2.2.0.min.js b/module-core/src/main/resources/static/js/jquery-2.2.0.min.js similarity index 100% rename from src/main/resources/static/js/jquery-2.2.0.min.js rename to module-core/src/main/resources/static/js/jquery-2.2.0.min.js diff --git a/src/main/resources/static/js/scripts.js b/module-core/src/main/resources/static/js/scripts.js similarity index 100% rename from src/main/resources/static/js/scripts.js rename to module-core/src/main/resources/static/js/scripts.js diff --git a/src/main/resources/static/js/templates.js b/module-core/src/main/resources/static/js/templates.js similarity index 100% rename from src/main/resources/static/js/templates.js rename to module-core/src/main/resources/static/js/templates.js diff --git a/src/main/resources/static/js/user_list.js b/module-core/src/main/resources/static/js/user_list.js similarity index 100% rename from src/main/resources/static/js/user_list.js rename to module-core/src/main/resources/static/js/user_list.js diff --git a/src/main/resources/templates/favicon.ico b/module-core/src/main/resources/templates/favicon.ico similarity index 100% rename from src/main/resources/templates/favicon.ico rename to module-core/src/main/resources/templates/favicon.ico diff --git a/src/main/resources/templates/index.html b/module-core/src/main/resources/templates/index.html similarity index 100% rename from src/main/resources/templates/index.html rename to module-core/src/main/resources/templates/index.html diff --git a/src/main/resources/templates/qna/form.html b/module-core/src/main/resources/templates/qna/form.html similarity index 100% rename from src/main/resources/templates/qna/form.html rename to module-core/src/main/resources/templates/qna/form.html diff --git a/src/main/resources/templates/qna/show.html b/module-core/src/main/resources/templates/qna/show.html similarity index 100% rename from src/main/resources/templates/qna/show.html rename to module-core/src/main/resources/templates/qna/show.html diff --git a/src/main/resources/templates/user/form.html b/module-core/src/main/resources/templates/user/form.html similarity index 100% rename from src/main/resources/templates/user/form.html rename to module-core/src/main/resources/templates/user/form.html diff --git a/src/main/resources/templates/user/list.html b/module-core/src/main/resources/templates/user/list.html similarity index 100% rename from src/main/resources/templates/user/list.html rename to module-core/src/main/resources/templates/user/list.html diff --git a/src/main/resources/templates/user/login.html b/module-core/src/main/resources/templates/user/login.html similarity index 100% rename from src/main/resources/templates/user/login.html rename to module-core/src/main/resources/templates/user/login.html diff --git a/src/main/resources/templates/user/login_failed.html b/module-core/src/main/resources/templates/user/login_failed.html similarity index 100% rename from src/main/resources/templates/user/login_failed.html rename to module-core/src/main/resources/templates/user/login_failed.html diff --git a/src/main/resources/templates/user/profile.html b/module-core/src/main/resources/templates/user/profile.html similarity index 100% rename from src/main/resources/templates/user/profile.html rename to module-core/src/main/resources/templates/user/profile.html diff --git a/src/test/java/utils/ExtensionTest.java b/module-core/src/test/java/utils/ExtensionTest.java similarity index 100% rename from src/test/java/utils/ExtensionTest.java rename to module-core/src/test/java/utils/ExtensionTest.java diff --git a/src/test/java/utils/FileIoUtilsTest.java b/module-core/src/test/java/utils/FileIoUtilsTest.java similarity index 100% rename from src/test/java/utils/FileIoUtilsTest.java rename to module-core/src/test/java/utils/FileIoUtilsTest.java diff --git a/src/test/java/utils/IOUtilsTest.java b/module-core/src/test/java/utils/IOUtilsTest.java similarity index 100% rename from src/test/java/utils/IOUtilsTest.java rename to module-core/src/test/java/utils/IOUtilsTest.java diff --git a/src/test/java/utils/RequestUtilsTest.java b/module-core/src/test/java/utils/RequestUtilsTest.java similarity index 100% rename from src/test/java/utils/RequestUtilsTest.java rename to module-core/src/test/java/utils/RequestUtilsTest.java diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..054065431 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'jwp-was' +include 'module-core', 'module-api', 'module-common' diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index ed8ef09ef..000000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n - - - - - - - \ No newline at end of file diff --git a/src/test/java/coordinate/AbstractFigure.java b/src/test/java/coordinate/AbstractFigure.java deleted file mode 100644 index 80d6e69bc..000000000 --- a/src/test/java/coordinate/AbstractFigure.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public abstract class AbstractFigure implements Figure { - private final List points; - - public AbstractFigure(List points) { - if (points.size() != size()) { - throw new IllegalArgumentException(getName() + "의 길이는 " + size() + "이어야 합니다."); - } - - this.points = points; - } - - protected Point getPoint(int index) { - return points.get(index); - } - - @Override - public List getPoints() { - return points; - } -} diff --git a/src/test/java/coordinate/Figure.java b/src/test/java/coordinate/Figure.java deleted file mode 100644 index f8f005903..000000000 --- a/src/test/java/coordinate/Figure.java +++ /dev/null @@ -1,13 +0,0 @@ -package coordinate; - -import java.util.List; - -public interface Figure { - List getPoints(); - - int size(); - - String getName(); - - double area(); -} diff --git a/src/test/java/coordinate/FigureCreator.java b/src/test/java/coordinate/FigureCreator.java deleted file mode 100644 index 609104623..000000000 --- a/src/test/java/coordinate/FigureCreator.java +++ /dev/null @@ -1,7 +0,0 @@ -package coordinate; - -import java.util.List; - -public interface FigureCreator { - Figure create(List points); -} diff --git a/src/test/java/coordinate/FigureFactory.java b/src/test/java/coordinate/FigureFactory.java deleted file mode 100644 index d30c19e7c..000000000 --- a/src/test/java/coordinate/FigureFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package coordinate; - -import java.util.List; - -public class FigureFactory { - static Figure getInstance(List points) { - if (points.size() == 2) { - return new Line(points); - } - - if (points.size() == 3) { - return new Triangle(points); - } - - if (points.size() == 4) { - return new Rectangle(points); - } - - throw new IllegalArgumentException("유효하지 않은 도형입니다."); - } -} diff --git a/src/test/java/coordinate/FigureFactoryTest.java b/src/test/java/coordinate/FigureFactoryTest.java deleted file mode 100644 index 91d1a8ff4..000000000 --- a/src/test/java/coordinate/FigureFactoryTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package coordinate; - -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class FigureFactoryTest { - @Test - public void line() { - List points = Arrays.asList( - Point.of(1, 2), - Point.of(2, 3)); - - Figure figure = FigureFactory.getInstance(points); - assertThat(figure).isInstanceOfAny(Line.class); - assertThat(figure.getName()).isEqualTo("선"); - } - - @Test - public void triangle() { - List points = Arrays.asList( - Point.of(1, 1), - Point.of(4, 1), - Point.of(1, 4)); - - Figure figure = FigureFactory.getInstance(points); - assertThat(figure).isInstanceOfAny(Triangle.class); - assertThat(figure.getName()).isEqualTo("삼각형"); - } - - @Test - public void rectangle() { - List points = Arrays.asList( - Point.of(1, 1), - Point.of(4, 1), - Point.of(1, 4), - Point.of(4, 4)); - - Figure figure = FigureFactory.getInstance(points); - assertThat(figure).isInstanceOfAny(Rectangle.class); - assertThat(figure.getName()).isEqualTo("사각형"); - } -} diff --git a/src/test/java/coordinate/Line.java b/src/test/java/coordinate/Line.java deleted file mode 100644 index 1e0d4a5ec..000000000 --- a/src/test/java/coordinate/Line.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public class Line extends AbstractFigure { - public Line(List points) { - super(points); - } - - @Override - public int size() { - return 2; - } - - @Override - public String getName() { - return "선"; - } - - @Override - public double area() { - return 0; - } -} diff --git a/src/test/java/coordinate/Point.java b/src/test/java/coordinate/Point.java deleted file mode 100644 index 39b4888e3..000000000 --- a/src/test/java/coordinate/Point.java +++ /dev/null @@ -1,62 +0,0 @@ -package coordinate; - -import java.util.Objects; - -public class Point { - private final int x; - private final int y; - - private Point(int x, int y) { - this.x = x; - if (x < 0 || x > 24) { - throw new IllegalArgumentException(); - } - - this.y = y; - if (y < 0 || y > 24) { - throw new IllegalArgumentException(); - } - } - - public double getDistance(Point other) { - int xDifference = other.minusX(x); - int yDifference = other.minusY(y); - return Math.sqrt(square(xDifference) + square(yDifference)); - } - - private int minusX(int number) { - return this.x - number; - } - - private int minusY(int number) { - return this.y - number; - } - - private static int square(int number) { - return number * number; - } - - public static Point of(int x, int y) { - return new Point(x, y); - } - - public static Point ofCommaSeparator(String text) { - String[] values = text.split(","); - return new Point(Integer.parseInt(values[0]), Integer.parseInt(values[1])); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Point point = (Point) o; - return x == point.x && - y == point.y; - } - - @Override - public int hashCode() { - - return Objects.hash(x, y); - } -} diff --git a/src/test/java/coordinate/Rectangle.java b/src/test/java/coordinate/Rectangle.java deleted file mode 100644 index d87821c5f..000000000 --- a/src/test/java/coordinate/Rectangle.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public class Rectangle extends AbstractFigure { - public Rectangle(List points) { - super(points); - } - - @Override - public int size() { - return 4; - } - - @Override - public String getName() { - return "사각형"; - } - - @Override - public double area() { - return 0; - } -} diff --git a/src/test/java/coordinate/Triangle.java b/src/test/java/coordinate/Triangle.java deleted file mode 100644 index cb076dd56..000000000 --- a/src/test/java/coordinate/Triangle.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public class Triangle extends AbstractFigure { - public Triangle(List points) { - super(points); - } - - @Override - public int size() { - return 3; - } - - @Override - public String getName() { - return "삼각형"; - } - - @Override - public double area() { - return 0; - } -} From 9fa35805cf0763f6f2072c375e121a5f641ccc73 Mon Sep 17 00:00:00 2001 From: lowoon Date: Wed, 25 Nov 2020 12:48:07 +0900 Subject: [PATCH 3/3] refactor: apply review --- {module-api => application}/.gitignore | 0 application/build.gradle | 11 ++ .../module-api}/.gitignore | 0 .../module-api}/build.gradle | 9 +- .../java/controller/AbstractController.java | 6 +- .../src/main/java/controller/Controller.java | 4 +- .../main/java/controller/FileController.java | 13 +- .../java/controller/user/LoginController.java | 17 +- .../controller/user/UserCreateController.java | 23 +-- .../controller/user/UserListController.java | 23 ++- .../controller/user/UserReadController.java | 18 ++- .../main/java/service/user/UserService.java | 0 .../controller/user/LoginControllerTest.java | 4 +- .../user/UserCreateControllerTest.java | 8 +- .../user/UserListControllerTest.java | 10 +- .../user/UserReadControllerTest.java | 4 +- .../java/service/user/UserServiceTest.java | 0 .../src/test/java/utils/ExecutorsTest.java | 0 .../src/test/java/utils/HandlebarsTest.java | 0 .../src/test/resources/http/not_allowed.http | 0 .../src/test/resources/http/not_found.http | 0 .../src/test/resources/http/ok.http | 0 .../src/test/resources/http/user.http | 0 .../module-common}/.gitignore | 0 application/module-common/build.gradle | 7 + .../src/main/java/user/User.java | 0 .../src/main/java/user/UserRepository.java | 0 application/module-core/.gitignore | 22 +++ application/module-core/build.gradle | 3 + .../src/main/java/utils/FileIoUtils.java | 19 +-- .../resources/static/css/bootstrap.min.css | 0 .../src/main/resources/static/css/styles.css | 0 .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin .../fonts/glyphicons-halflings-regular.woff2 | Bin .../main/resources/static/images/80-text.png | Bin .../src/main/resources/static/js/api/user.js | 0 .../main/resources/static/js/bootstrap.min.js | 0 .../resources/static/js/jquery-2.2.0.min.js | 0 .../src/main/resources/static/js/scripts.js | 0 .../src/main/resources/static/js/templates.js | 0 .../src/main/resources/static/js/user_list.js | 0 .../src/main/resources/templates/favicon.ico | Bin .../src/main/resources/templates/index.html | 0 .../main/resources/templates/qna/form.html | 0 .../main/resources/templates/qna/show.html | 0 .../main/resources/templates/user/form.html | 0 .../main/resources/templates/user/list.html | 0 .../main/resources/templates/user/login.html | 0 .../templates/user/login_failed.html | 0 .../resources/templates/user/profile.html | 0 .../src/test/java/utils/FileIoUtilsTest.java | 7 +- application/src/main/java/Application.java | 6 + framework/module-webserver/.gitignore | 22 +++ framework/module-webserver/build.gradle | 4 + .../src/main/java/Context.java | 96 ++++++++++++ .../src/main/java}/RequestHandler.java | 20 +-- .../src/main/java}/WebServer.java | 7 +- .../src/main/java/annotations/Controller.java | 11 ++ .../main/java/annotations/RequestMapping.java | 16 ++ .../src/main/java/cookie}/HttpCookie.java | 5 +- .../src/main/java/domain}/HttpHeader.java | 2 +- .../src/main/java/domain}/HttpMethod.java | 2 +- .../src/main/java/domain}/HttpRequest.java | 2 +- .../src/main/java/domain}/HttpResponse.java | 2 +- .../src/main/java/domain}/HttpStatus.java | 2 +- .../src/main/java/session/HttpSession.java | 0 .../main/java/session/SessionRepository.java | 0 .../main/java}/session/SessionService.java | 5 +- .../src/main/java/utils/Extension.java | 0 .../src/main/java/utils/IOUtils.java | 0 .../src/main/java/utils/RequestUtils.java | 0 .../src/main/resources/logback.xml | 0 .../test/java/domain}/HttpRequestTest.java | 2 +- .../test/java/domain}/HttpResponseTest.java | 15 +- .../test/java/session/HttpSessionTest.java | 0 .../src/test/java/utils/ExtensionTest.java | 0 .../src/test/java/utils/IOUtilsTest.java | 0 .../src/test/java/utils/RequestUtilsTest.java | 0 .../src/test/resources/Http_Error.txt | 0 .../src/test/resources/Http_Forward.txt | 0 .../src/test/resources/Http_Redirect.txt | 0 .../src/test/resources/index.html | 148 ++++++++++++++++++ module-api/module-api.iml | 8 - .../src/main/java/webserver/Context.java | 40 ----- module-common/build.gradle | 7 - module-common/module-common.iml | 8 - module-core/build.gradle | 7 - module-core/module-core.iml | 11 -- settings.gradle | 3 +- 92 files changed, 473 insertions(+), 186 deletions(-) rename {module-api => application}/.gitignore (100%) create mode 100644 application/build.gradle rename {module-common => application/module-api}/.gitignore (100%) rename {module-api => application/module-api}/build.gradle (50%) rename {module-api => application/module-api}/src/main/java/controller/AbstractController.java (94%) rename {module-api => application/module-api}/src/main/java/controller/Controller.java (78%) rename {module-api => application/module-api}/src/main/java/controller/FileController.java (82%) rename {module-api => application/module-api}/src/main/java/controller/user/LoginController.java (81%) rename {module-api => application/module-api}/src/main/java/controller/user/UserCreateController.java (74%) rename {module-api => application/module-api}/src/main/java/controller/user/UserListController.java (68%) rename {module-api => application/module-api}/src/main/java/controller/user/UserReadController.java (79%) rename {module-api => application/module-api}/src/main/java/service/user/UserService.java (100%) rename {module-api => application/module-api}/src/test/java/controller/user/LoginControllerTest.java (98%) rename {module-api => application/module-api}/src/test/java/controller/user/UserCreateControllerTest.java (94%) rename {module-api => application/module-api}/src/test/java/controller/user/UserListControllerTest.java (94%) rename {module-api => application/module-api}/src/test/java/controller/user/UserReadControllerTest.java (97%) rename {module-api => application/module-api}/src/test/java/service/user/UserServiceTest.java (100%) rename {module-api => application/module-api}/src/test/java/utils/ExecutorsTest.java (100%) rename {module-api => application/module-api}/src/test/java/utils/HandlebarsTest.java (100%) rename {module-api => application/module-api}/src/test/resources/http/not_allowed.http (100%) rename {module-api => application/module-api}/src/test/resources/http/not_found.http (100%) rename {module-api => application/module-api}/src/test/resources/http/ok.http (100%) rename {module-api => application/module-api}/src/test/resources/http/user.http (100%) rename {module-core => application/module-common}/.gitignore (100%) create mode 100644 application/module-common/build.gradle rename {module-common => application/module-common}/src/main/java/user/User.java (100%) rename {module-common => application/module-common}/src/main/java/user/UserRepository.java (100%) create mode 100644 application/module-core/.gitignore create mode 100644 application/module-core/build.gradle rename {module-core => application/module-core}/src/main/java/utils/FileIoUtils.java (55%) rename {module-core => application/module-core}/src/main/resources/static/css/bootstrap.min.css (100%) rename {module-core => application/module-core}/src/main/resources/static/css/styles.css (100%) rename {module-core => application/module-core}/src/main/resources/static/fonts/glyphicons-halflings-regular.eot (100%) rename {module-core => application/module-core}/src/main/resources/static/fonts/glyphicons-halflings-regular.svg (100%) rename {module-core => application/module-core}/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf (100%) rename {module-core => application/module-core}/src/main/resources/static/fonts/glyphicons-halflings-regular.woff (100%) rename {module-core => application/module-core}/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 (100%) rename {module-core => application/module-core}/src/main/resources/static/images/80-text.png (100%) rename {module-core => application/module-core}/src/main/resources/static/js/api/user.js (100%) rename {module-core => application/module-core}/src/main/resources/static/js/bootstrap.min.js (100%) rename {module-core => application/module-core}/src/main/resources/static/js/jquery-2.2.0.min.js (100%) rename {module-core => application/module-core}/src/main/resources/static/js/scripts.js (100%) rename {module-core => application/module-core}/src/main/resources/static/js/templates.js (100%) rename {module-core => application/module-core}/src/main/resources/static/js/user_list.js (100%) rename {module-core => application/module-core}/src/main/resources/templates/favicon.ico (100%) rename {module-core => application/module-core}/src/main/resources/templates/index.html (100%) rename {module-core => application/module-core}/src/main/resources/templates/qna/form.html (100%) rename {module-core => application/module-core}/src/main/resources/templates/qna/show.html (100%) rename {module-core => application/module-core}/src/main/resources/templates/user/form.html (100%) rename {module-core => application/module-core}/src/main/resources/templates/user/list.html (100%) rename {module-core => application/module-core}/src/main/resources/templates/user/login.html (100%) rename {module-core => application/module-core}/src/main/resources/templates/user/login_failed.html (100%) rename {module-core => application/module-core}/src/main/resources/templates/user/profile.html (100%) rename {module-core => application/module-core}/src/test/java/utils/FileIoUtilsTest.java (65%) create mode 100644 application/src/main/java/Application.java create mode 100644 framework/module-webserver/.gitignore create mode 100644 framework/module-webserver/build.gradle create mode 100644 framework/module-webserver/src/main/java/Context.java rename {module-api/src/main/java/webserver => framework/module-webserver/src/main/java}/RequestHandler.java (78%) rename {module-api/src/main/java/webserver => framework/module-webserver/src/main/java}/WebServer.java (84%) create mode 100644 framework/module-webserver/src/main/java/annotations/Controller.java create mode 100644 framework/module-webserver/src/main/java/annotations/RequestMapping.java rename {module-common/src/main/java/webserver => framework/module-webserver/src/main/java/cookie}/HttpCookie.java (86%) rename {module-common/src/main/java/webserver => framework/module-webserver/src/main/java/domain}/HttpHeader.java (93%) rename {module-common/src/main/java/webserver => framework/module-webserver/src/main/java/domain}/HttpMethod.java (94%) rename {module-common/src/main/java/webserver => framework/module-webserver/src/main/java/domain}/HttpRequest.java (99%) rename {module-common/src/main/java/webserver => framework/module-webserver/src/main/java/domain}/HttpResponse.java (99%) rename {module-common/src/main/java/webserver => framework/module-webserver/src/main/java/domain}/HttpStatus.java (97%) rename {module-common => framework/module-webserver}/src/main/java/session/HttpSession.java (100%) rename {module-common => framework/module-webserver}/src/main/java/session/SessionRepository.java (100%) rename {module-api/src/main/java/service => framework/module-webserver/src/main/java}/session/SessionService.java (86%) rename {module-core => framework/module-webserver}/src/main/java/utils/Extension.java (100%) rename {module-core => framework/module-webserver}/src/main/java/utils/IOUtils.java (100%) rename {module-core => framework/module-webserver}/src/main/java/utils/RequestUtils.java (100%) rename {module-api => framework/module-webserver}/src/main/resources/logback.xml (100%) rename {module-common/src/test/java/webserver => framework/module-webserver/src/test/java/domain}/HttpRequestTest.java (99%) rename {module-common/src/test/java/webserver => framework/module-webserver/src/test/java/domain}/HttpResponseTest.java (80%) rename {module-common => framework/module-webserver}/src/test/java/session/HttpSessionTest.java (100%) rename {module-core => framework/module-webserver}/src/test/java/utils/ExtensionTest.java (100%) rename {module-core => framework/module-webserver}/src/test/java/utils/IOUtilsTest.java (100%) rename {module-core => framework/module-webserver}/src/test/java/utils/RequestUtilsTest.java (100%) rename {module-common => framework/module-webserver}/src/test/resources/Http_Error.txt (100%) rename {module-common => framework/module-webserver}/src/test/resources/Http_Forward.txt (100%) rename {module-common => framework/module-webserver}/src/test/resources/Http_Redirect.txt (100%) create mode 100644 framework/module-webserver/src/test/resources/index.html delete mode 100644 module-api/module-api.iml delete mode 100644 module-api/src/main/java/webserver/Context.java delete mode 100644 module-common/build.gradle delete mode 100644 module-common/module-common.iml delete mode 100644 module-core/build.gradle delete mode 100644 module-core/module-core.iml diff --git a/module-api/.gitignore b/application/.gitignore similarity index 100% rename from module-api/.gitignore rename to application/.gitignore diff --git a/application/build.gradle b/application/build.gradle new file mode 100644 index 000000000..7a812a448 --- /dev/null +++ b/application/build.gradle @@ -0,0 +1,11 @@ +jar { + enabled = true +} + +dependencies { + implementation project(':application:module-api') + implementation project(':framework:module-webserver') + + implementation 'org.springframework:spring-core:5.2.6.RELEASE' + implementation 'com.github.jknack:handlebars:4.2.0' +} diff --git a/module-common/.gitignore b/application/module-api/.gitignore similarity index 100% rename from module-common/.gitignore rename to application/module-api/.gitignore diff --git a/module-api/build.gradle b/application/module-api/build.gradle similarity index 50% rename from module-api/build.gradle rename to application/module-api/build.gradle index 816976dcf..0262f781d 100644 --- a/module-api/build.gradle +++ b/application/module-api/build.gradle @@ -1,6 +1,11 @@ +jar { + enabled = true +} + dependencies { - implementation project(':module-core') - implementation project(':module-common') + implementation project(':application:module-core') + implementation project(':application:module-common') + implementation project(':framework:module-webserver') implementation 'org.springframework:spring-core:5.2.6.RELEASE' implementation 'com.github.jknack:handlebars:4.2.0' diff --git a/module-api/src/main/java/controller/AbstractController.java b/application/module-api/src/main/java/controller/AbstractController.java similarity index 94% rename from module-api/src/main/java/controller/AbstractController.java rename to application/module-api/src/main/java/controller/AbstractController.java index d21e94347..3aee48a92 100644 --- a/module-api/src/main/java/controller/AbstractController.java +++ b/application/module-api/src/main/java/controller/AbstractController.java @@ -3,9 +3,9 @@ import java.io.IOException; import java.net.URISyntaxException; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; public abstract class AbstractController implements Controller { @Override diff --git a/module-api/src/main/java/controller/Controller.java b/application/module-api/src/main/java/controller/Controller.java similarity index 78% rename from module-api/src/main/java/controller/Controller.java rename to application/module-api/src/main/java/controller/Controller.java index b4c8bbc68..26051d81a 100644 --- a/module-api/src/main/java/controller/Controller.java +++ b/application/module-api/src/main/java/controller/Controller.java @@ -3,8 +3,8 @@ import java.io.IOException; import java.net.URISyntaxException; -import webserver.HttpRequest; -import webserver.HttpResponse; +import domain.HttpRequest; +import domain.HttpResponse; public interface Controller { void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException; diff --git a/module-api/src/main/java/controller/FileController.java b/application/module-api/src/main/java/controller/FileController.java similarity index 82% rename from module-api/src/main/java/controller/FileController.java rename to application/module-api/src/main/java/controller/FileController.java index adfe5fb94..5a6bb5418 100644 --- a/module-api/src/main/java/controller/FileController.java +++ b/application/module-api/src/main/java/controller/FileController.java @@ -4,15 +4,20 @@ import java.net.URISyntaxException; import java.util.Objects; +import annotations.Controller; +import annotations.RequestMapping; +import domain.HttpHeader; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; import utils.Extension; import utils.FileIoUtils; import utils.RequestUtils; -import webserver.HttpHeader; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +@Controller public class FileController extends AbstractController { + @RequestMapping(path = "file", method = HttpMethod.GET) @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException { String path = httpRequest.getPath(); diff --git a/module-api/src/main/java/controller/user/LoginController.java b/application/module-api/src/main/java/controller/user/LoginController.java similarity index 81% rename from module-api/src/main/java/controller/user/LoginController.java rename to application/module-api/src/main/java/controller/user/LoginController.java index 6b7e6a540..a5596727f 100644 --- a/module-api/src/main/java/controller/user/LoginController.java +++ b/application/module-api/src/main/java/controller/user/LoginController.java @@ -3,22 +3,31 @@ import java.io.IOException; import java.util.Objects; +import annotations.Controller; +import annotations.RequestMapping; import controller.AbstractController; +import cookie.HttpCookie; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; import service.user.UserService; import session.HttpSession; import user.User; -import webserver.HttpCookie; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +@Controller public class LoginController extends AbstractController { private final UserService userService; + public LoginController() { + userService = UserService.getInstance(); + } + public LoginController(UserService userService) { this.userService = userService; } + @RequestMapping(path = "/user/login", method = HttpMethod.POST) @Override public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { if (!httpRequest.containsAll(User.USER_ID, User.PASSWORD)) { diff --git a/module-api/src/main/java/controller/user/UserCreateController.java b/application/module-api/src/main/java/controller/user/UserCreateController.java similarity index 74% rename from module-api/src/main/java/controller/user/UserCreateController.java rename to application/module-api/src/main/java/controller/user/UserCreateController.java index e7efcdc8e..4c18a8631 100644 --- a/module-api/src/main/java/controller/user/UserCreateController.java +++ b/application/module-api/src/main/java/controller/user/UserCreateController.java @@ -2,25 +2,31 @@ import java.io.IOException; +import annotations.Controller; +import annotations.RequestMapping; import controller.AbstractController; -import service.session.SessionService; +import cookie.HttpCookie; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; import service.user.UserService; import session.HttpSession; import user.User; -import webserver.HttpCookie; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +@Controller public class UserCreateController extends AbstractController { private final UserService userService; - private final SessionService sessionService; - public UserCreateController(UserService userService, SessionService sessionService) { + public UserCreateController() { + userService = UserService.getInstance(); + } + + public UserCreateController(UserService userService) { this.userService = userService; - this.sessionService = sessionService; } + @RequestMapping(path = "/user/create", method = HttpMethod.POST) @Override public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { if (!httpRequest.containsAll(User.USER_ID, User.PASSWORD, User.NAME, User.EMAIL)) { @@ -33,7 +39,6 @@ public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IO userService.addUser(user); HttpSession httpSession = new HttpSession(); httpSession.setAttribute("logined", true); - sessionService.add(httpSession); HttpCookie httpCookie = new HttpCookie(); httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); httpCookie.apply(httpResponse); diff --git a/module-api/src/main/java/controller/user/UserListController.java b/application/module-api/src/main/java/controller/user/UserListController.java similarity index 68% rename from module-api/src/main/java/controller/user/UserListController.java rename to application/module-api/src/main/java/controller/user/UserListController.java index 216292fb0..52bdf9fad 100644 --- a/module-api/src/main/java/controller/user/UserListController.java +++ b/application/module-api/src/main/java/controller/user/UserListController.java @@ -5,26 +5,33 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import annotations.Controller; +import annotations.RequestMapping; import controller.AbstractController; -import service.session.SessionService; +import domain.HttpHeader; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; import service.user.UserService; import user.User; -import webserver.HttpHeader; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +@Controller public class UserListController extends AbstractController { private final UserService userService; - private final SessionService sessionService; private final ObjectMapper objectMapper; - public UserListController(UserService userService, SessionService sessionService, ObjectMapper objectMapper) { + public UserListController() { + userService = UserService.getInstance(); + objectMapper = new ObjectMapper(); + } + + public UserListController(UserService userService, ObjectMapper objectMapper) { this.userService = userService; - this.sessionService = sessionService; this.objectMapper = objectMapper; } + @RequestMapping(path = "/user/list", method = HttpMethod.GET) @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { if (httpRequest.notAuthorized()) { diff --git a/module-api/src/main/java/controller/user/UserReadController.java b/application/module-api/src/main/java/controller/user/UserReadController.java similarity index 79% rename from module-api/src/main/java/controller/user/UserReadController.java rename to application/module-api/src/main/java/controller/user/UserReadController.java index 0e350ae78..807398df5 100644 --- a/module-api/src/main/java/controller/user/UserReadController.java +++ b/application/module-api/src/main/java/controller/user/UserReadController.java @@ -5,23 +5,33 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import annotations.Controller; +import annotations.RequestMapping; import controller.AbstractController; +import domain.HttpHeader; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; import service.user.UserService; import user.User; -import webserver.HttpHeader; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +@Controller public class UserReadController extends AbstractController { private final UserService userService; private final ObjectMapper objectMapper; + public UserReadController() { + userService = UserService.getInstance(); + objectMapper = new ObjectMapper(); + } + public UserReadController(UserService userService, ObjectMapper objectMapper) { this.userService = userService; this.objectMapper = objectMapper; } + @RequestMapping(path = "/user/profile", method = HttpMethod.GET) @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID)); diff --git a/module-api/src/main/java/service/user/UserService.java b/application/module-api/src/main/java/service/user/UserService.java similarity index 100% rename from module-api/src/main/java/service/user/UserService.java rename to application/module-api/src/main/java/service/user/UserService.java diff --git a/module-api/src/test/java/controller/user/LoginControllerTest.java b/application/module-api/src/test/java/controller/user/LoginControllerTest.java similarity index 98% rename from module-api/src/test/java/controller/user/LoginControllerTest.java rename to application/module-api/src/test/java/controller/user/LoginControllerTest.java index efc048855..dad6e921a 100644 --- a/module-api/src/test/java/controller/user/LoginControllerTest.java +++ b/application/module-api/src/test/java/controller/user/LoginControllerTest.java @@ -19,10 +19,10 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import domain.HttpRequest; +import domain.HttpResponse; import service.user.UserService; import user.User; -import webserver.HttpRequest; -import webserver.HttpResponse; @ExtendWith(MockitoExtension.class) class LoginControllerTest { diff --git a/module-api/src/test/java/controller/user/UserCreateControllerTest.java b/application/module-api/src/test/java/controller/user/UserCreateControllerTest.java similarity index 94% rename from module-api/src/test/java/controller/user/UserCreateControllerTest.java rename to application/module-api/src/test/java/controller/user/UserCreateControllerTest.java index 4182985c5..ae2784df2 100644 --- a/module-api/src/test/java/controller/user/UserCreateControllerTest.java +++ b/application/module-api/src/test/java/controller/user/UserCreateControllerTest.java @@ -17,19 +17,15 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import service.session.SessionService; +import domain.HttpRequest; +import domain.HttpResponse; import service.user.UserService; -import webserver.HttpRequest; -import webserver.HttpResponse; @ExtendWith(MockitoExtension.class) class UserCreateControllerTest { @Mock private UserService userService; - @Mock - private SessionService sessionService; - @InjectMocks private UserCreateController userCreateController; diff --git a/module-api/src/test/java/controller/user/UserListControllerTest.java b/application/module-api/src/test/java/controller/user/UserListControllerTest.java similarity index 94% rename from module-api/src/test/java/controller/user/UserListControllerTest.java rename to application/module-api/src/test/java/controller/user/UserListControllerTest.java index 775e4aeba..b4d5ac9ff 100644 --- a/module-api/src/test/java/controller/user/UserListControllerTest.java +++ b/application/module-api/src/test/java/controller/user/UserListControllerTest.java @@ -20,26 +20,22 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import service.session.SessionService; +import domain.HttpRequest; +import domain.HttpResponse; import service.user.UserService; import session.HttpSession; import user.User; -import webserver.HttpRequest; -import webserver.HttpResponse; @ExtendWith(MockitoExtension.class) class UserListControllerTest { @Mock private UserService userService; - @Mock - private SessionService sessionService; - private UserListController userListController; @BeforeEach void setUp() { - userListController = new UserListController(userService, sessionService, new ObjectMapper()); + userListController = new UserListController(userService, new ObjectMapper()); } @Test diff --git a/module-api/src/test/java/controller/user/UserReadControllerTest.java b/application/module-api/src/test/java/controller/user/UserReadControllerTest.java similarity index 97% rename from module-api/src/test/java/controller/user/UserReadControllerTest.java rename to application/module-api/src/test/java/controller/user/UserReadControllerTest.java index 19fca2d94..6be2b314e 100644 --- a/module-api/src/test/java/controller/user/UserReadControllerTest.java +++ b/application/module-api/src/test/java/controller/user/UserReadControllerTest.java @@ -19,10 +19,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import domain.HttpRequest; +import domain.HttpResponse; import service.user.UserService; import user.User; -import webserver.HttpRequest; -import webserver.HttpResponse; @ExtendWith(MockitoExtension.class) class UserReadControllerTest { diff --git a/module-api/src/test/java/service/user/UserServiceTest.java b/application/module-api/src/test/java/service/user/UserServiceTest.java similarity index 100% rename from module-api/src/test/java/service/user/UserServiceTest.java rename to application/module-api/src/test/java/service/user/UserServiceTest.java diff --git a/module-api/src/test/java/utils/ExecutorsTest.java b/application/module-api/src/test/java/utils/ExecutorsTest.java similarity index 100% rename from module-api/src/test/java/utils/ExecutorsTest.java rename to application/module-api/src/test/java/utils/ExecutorsTest.java diff --git a/module-api/src/test/java/utils/HandlebarsTest.java b/application/module-api/src/test/java/utils/HandlebarsTest.java similarity index 100% rename from module-api/src/test/java/utils/HandlebarsTest.java rename to application/module-api/src/test/java/utils/HandlebarsTest.java diff --git a/module-api/src/test/resources/http/not_allowed.http b/application/module-api/src/test/resources/http/not_allowed.http similarity index 100% rename from module-api/src/test/resources/http/not_allowed.http rename to application/module-api/src/test/resources/http/not_allowed.http diff --git a/module-api/src/test/resources/http/not_found.http b/application/module-api/src/test/resources/http/not_found.http similarity index 100% rename from module-api/src/test/resources/http/not_found.http rename to application/module-api/src/test/resources/http/not_found.http diff --git a/module-api/src/test/resources/http/ok.http b/application/module-api/src/test/resources/http/ok.http similarity index 100% rename from module-api/src/test/resources/http/ok.http rename to application/module-api/src/test/resources/http/ok.http diff --git a/module-api/src/test/resources/http/user.http b/application/module-api/src/test/resources/http/user.http similarity index 100% rename from module-api/src/test/resources/http/user.http rename to application/module-api/src/test/resources/http/user.http diff --git a/module-core/.gitignore b/application/module-common/.gitignore similarity index 100% rename from module-core/.gitignore rename to application/module-common/.gitignore diff --git a/application/module-common/build.gradle b/application/module-common/build.gradle new file mode 100644 index 000000000..b669fb54d --- /dev/null +++ b/application/module-common/build.gradle @@ -0,0 +1,7 @@ +jar { + enabled = true +} + +dependencies { + implementation project(':application:module-core') +} diff --git a/module-common/src/main/java/user/User.java b/application/module-common/src/main/java/user/User.java similarity index 100% rename from module-common/src/main/java/user/User.java rename to application/module-common/src/main/java/user/User.java diff --git a/module-common/src/main/java/user/UserRepository.java b/application/module-common/src/main/java/user/UserRepository.java similarity index 100% rename from module-common/src/main/java/user/UserRepository.java rename to application/module-common/src/main/java/user/UserRepository.java diff --git a/application/module-core/.gitignore b/application/module-core/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/application/module-core/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/application/module-core/build.gradle b/application/module-core/build.gradle new file mode 100644 index 000000000..2da860e59 --- /dev/null +++ b/application/module-core/build.gradle @@ -0,0 +1,3 @@ +jar { + enabled = true +} diff --git a/module-core/src/main/java/utils/FileIoUtils.java b/application/module-core/src/main/java/utils/FileIoUtils.java similarity index 55% rename from module-core/src/main/java/utils/FileIoUtils.java rename to application/module-core/src/main/java/utils/FileIoUtils.java index 94f74e287..f3c125fab 100644 --- a/module-core/src/main/java/utils/FileIoUtils.java +++ b/application/module-core/src/main/java/utils/FileIoUtils.java @@ -2,18 +2,14 @@ import java.io.File; import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; public class FileIoUtils { - public static final String TEMPLATE_PATH = "/Users/sangbo/Projects/woowa/jwp-was/module-core/src/main/resources/templates"; - public static final String STATIC_PATH = "/Users/sangbo/Projects/woowa/jwp-was/module-core/src/main/resources/static"; - public static final String TEMPLATE_CLASS_PATH = "./templates"; - public static final String STATIC_CLASS_PATH = "./static"; + public static final String TEMPLATE_PATH = "/Users/sangbo/Projects/woowa/jwp-was/application/module-core/src/main/resources/templates"; + public static final String STATIC_PATH = "/Users/sangbo/Projects/woowa/jwp-was/application/module-core/src/main/resources/static"; + public static final String TEMPLATE_CLASS_PATH = "/templates"; + public static final String STATIC_CLASS_PATH = "/static"; - public static byte[] findStaticFile(String path) throws IOException, URISyntaxException { + public static byte[] findStaticFile(String path) throws IOException { File file = new File(TEMPLATE_PATH + path); if (file.isFile()) { return FileIoUtils.loadFileFromClasspath(TEMPLATE_CLASS_PATH + path); @@ -25,8 +21,7 @@ public static byte[] findStaticFile(String path) throws IOException, URISyntaxEx return null; } - public static byte[] loadFileFromClasspath(String filePath) throws IOException, URISyntaxException { - Path path = Paths.get(FileIoUtils.class.getClassLoader().getResource(filePath).toURI()); - return Files.readAllBytes(path); + public static byte[] loadFileFromClasspath(String filePath) throws IOException { + return FileIoUtils.class.getResourceAsStream(filePath).readAllBytes(); } } diff --git a/module-core/src/main/resources/static/css/bootstrap.min.css b/application/module-core/src/main/resources/static/css/bootstrap.min.css similarity index 100% rename from module-core/src/main/resources/static/css/bootstrap.min.css rename to application/module-core/src/main/resources/static/css/bootstrap.min.css diff --git a/module-core/src/main/resources/static/css/styles.css b/application/module-core/src/main/resources/static/css/styles.css similarity index 100% rename from module-core/src/main/resources/static/css/styles.css rename to application/module-core/src/main/resources/static/css/styles.css diff --git a/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot diff --git a/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg diff --git a/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf diff --git a/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff diff --git a/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 diff --git a/module-core/src/main/resources/static/images/80-text.png b/application/module-core/src/main/resources/static/images/80-text.png similarity index 100% rename from module-core/src/main/resources/static/images/80-text.png rename to application/module-core/src/main/resources/static/images/80-text.png diff --git a/module-core/src/main/resources/static/js/api/user.js b/application/module-core/src/main/resources/static/js/api/user.js similarity index 100% rename from module-core/src/main/resources/static/js/api/user.js rename to application/module-core/src/main/resources/static/js/api/user.js diff --git a/module-core/src/main/resources/static/js/bootstrap.min.js b/application/module-core/src/main/resources/static/js/bootstrap.min.js similarity index 100% rename from module-core/src/main/resources/static/js/bootstrap.min.js rename to application/module-core/src/main/resources/static/js/bootstrap.min.js diff --git a/module-core/src/main/resources/static/js/jquery-2.2.0.min.js b/application/module-core/src/main/resources/static/js/jquery-2.2.0.min.js similarity index 100% rename from module-core/src/main/resources/static/js/jquery-2.2.0.min.js rename to application/module-core/src/main/resources/static/js/jquery-2.2.0.min.js diff --git a/module-core/src/main/resources/static/js/scripts.js b/application/module-core/src/main/resources/static/js/scripts.js similarity index 100% rename from module-core/src/main/resources/static/js/scripts.js rename to application/module-core/src/main/resources/static/js/scripts.js diff --git a/module-core/src/main/resources/static/js/templates.js b/application/module-core/src/main/resources/static/js/templates.js similarity index 100% rename from module-core/src/main/resources/static/js/templates.js rename to application/module-core/src/main/resources/static/js/templates.js diff --git a/module-core/src/main/resources/static/js/user_list.js b/application/module-core/src/main/resources/static/js/user_list.js similarity index 100% rename from module-core/src/main/resources/static/js/user_list.js rename to application/module-core/src/main/resources/static/js/user_list.js diff --git a/module-core/src/main/resources/templates/favicon.ico b/application/module-core/src/main/resources/templates/favicon.ico similarity index 100% rename from module-core/src/main/resources/templates/favicon.ico rename to application/module-core/src/main/resources/templates/favicon.ico diff --git a/module-core/src/main/resources/templates/index.html b/application/module-core/src/main/resources/templates/index.html similarity index 100% rename from module-core/src/main/resources/templates/index.html rename to application/module-core/src/main/resources/templates/index.html diff --git a/module-core/src/main/resources/templates/qna/form.html b/application/module-core/src/main/resources/templates/qna/form.html similarity index 100% rename from module-core/src/main/resources/templates/qna/form.html rename to application/module-core/src/main/resources/templates/qna/form.html diff --git a/module-core/src/main/resources/templates/qna/show.html b/application/module-core/src/main/resources/templates/qna/show.html similarity index 100% rename from module-core/src/main/resources/templates/qna/show.html rename to application/module-core/src/main/resources/templates/qna/show.html diff --git a/module-core/src/main/resources/templates/user/form.html b/application/module-core/src/main/resources/templates/user/form.html similarity index 100% rename from module-core/src/main/resources/templates/user/form.html rename to application/module-core/src/main/resources/templates/user/form.html diff --git a/module-core/src/main/resources/templates/user/list.html b/application/module-core/src/main/resources/templates/user/list.html similarity index 100% rename from module-core/src/main/resources/templates/user/list.html rename to application/module-core/src/main/resources/templates/user/list.html diff --git a/module-core/src/main/resources/templates/user/login.html b/application/module-core/src/main/resources/templates/user/login.html similarity index 100% rename from module-core/src/main/resources/templates/user/login.html rename to application/module-core/src/main/resources/templates/user/login.html diff --git a/module-core/src/main/resources/templates/user/login_failed.html b/application/module-core/src/main/resources/templates/user/login_failed.html similarity index 100% rename from module-core/src/main/resources/templates/user/login_failed.html rename to application/module-core/src/main/resources/templates/user/login_failed.html diff --git a/module-core/src/main/resources/templates/user/profile.html b/application/module-core/src/main/resources/templates/user/profile.html similarity index 100% rename from module-core/src/main/resources/templates/user/profile.html rename to application/module-core/src/main/resources/templates/user/profile.html diff --git a/module-core/src/test/java/utils/FileIoUtilsTest.java b/application/module-core/src/test/java/utils/FileIoUtilsTest.java similarity index 65% rename from module-core/src/test/java/utils/FileIoUtilsTest.java rename to application/module-core/src/test/java/utils/FileIoUtilsTest.java index be4dcbf4e..357cfe7ad 100644 --- a/module-core/src/test/java/utils/FileIoUtilsTest.java +++ b/application/module-core/src/test/java/utils/FileIoUtilsTest.java @@ -3,12 +3,8 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class FileIoUtilsTest { - private static final Logger log = LoggerFactory.getLogger(FileIoUtilsTest.class); - @Test void findStaticFile() throws Exception { byte[] body = FileIoUtils.findStaticFile("/index.html"); @@ -23,7 +19,6 @@ void findNotExistFile() throws Exception { @Test void loadFileFromClasspath() throws Exception { - byte[] body = FileIoUtils.loadFileFromClasspath("./templates/index.html"); - log.debug("file : {}", new String(body)); + byte[] body = FileIoUtils.loadFileFromClasspath("/templates/index.html"); } } diff --git a/application/src/main/java/Application.java b/application/src/main/java/Application.java new file mode 100644 index 000000000..7ead81a4c --- /dev/null +++ b/application/src/main/java/Application.java @@ -0,0 +1,6 @@ +public class Application { + public static void main(String[] args) throws Exception { + WebServer webServer = new WebServer(); + webServer.run(args); + } +} diff --git a/framework/module-webserver/.gitignore b/framework/module-webserver/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/framework/module-webserver/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/framework/module-webserver/build.gradle b/framework/module-webserver/build.gradle new file mode 100644 index 000000000..958a963b7 --- /dev/null +++ b/framework/module-webserver/build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation 'ch.qos.logback:logback-classic:1.2.3' + implementation 'org.reflections:reflections:0.9.10' +} diff --git a/framework/module-webserver/src/main/java/Context.java b/framework/module-webserver/src/main/java/Context.java new file mode 100644 index 000000000..b31a8b46a --- /dev/null +++ b/framework/module-webserver/src/main/java/Context.java @@ -0,0 +1,96 @@ +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.reflections.Reflections; +import org.reflections.scanners.MethodAnnotationsScanner; + +import annotations.Controller; +import annotations.RequestMapping; +import domain.HttpRequest; +import domain.HttpResponse; + +public class Context { + private static final String DEFAULT_CONTROLLER_DIRECTORY = "controller"; + private static final Context instance = new Context(); + + private final Map requestMapper; + private final List beans; + + private Context() { + requestMapper = new HashMap<>(); + beans = instantiate(); + initialize(); + } + + public static Context getInstance() { + return instance; + } + + private List instantiate() { + Reflections reflections = new Reflections(DEFAULT_CONTROLLER_DIRECTORY); + Set> controllerAnnotatedClasses = reflections.getTypesAnnotatedWith(Controller.class); + + return controllerAnnotatedClasses.stream() + .map(this::instantiateBean) + .collect(Collectors.toList()); + } + + private Object instantiateBean(Class aClass) { + try { + return aClass.getConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + } + return null; + } + + private void initialize() { + beans.stream() + .map(getAnnotatedMethods()) + .forEach(it -> it.forEach(addMethodToRequestMapper())); + } + + private Function> getAnnotatedMethods() { + return it -> new Reflections(it.getClass(), new MethodAnnotationsScanner()).getMethodsAnnotatedWith( + RequestMapping.class); + } + + private Consumer addMethodToRequestMapper() { + return method -> { + RequestMapping annotation = method.getAnnotation(RequestMapping.class); + requestMapper.put(annotation.path(), method); + }; + } + + public void invoke(HttpRequest httpRequest, HttpResponse httpResponse) throws + InvocationTargetException, IllegalAccessException { + String path = httpRequest.getPath(); + Method method = getAllocatedMethod(path); + Object bean = getInstance(method); + method.invoke(bean, httpRequest, httpResponse); + } + + private Method getAllocatedMethod(String path) { + Method method = requestMapper.get(path); + if (Objects.isNull(method)) { + return requestMapper.get("file"); + } + return method; + } + + private Object getInstance(Method method) { + return beans.stream() + .filter(t -> Arrays.asList(t.getClass().getMethods()).contains(method)) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } +} diff --git a/module-api/src/main/java/webserver/RequestHandler.java b/framework/module-webserver/src/main/java/RequestHandler.java similarity index 78% rename from module-api/src/main/java/webserver/RequestHandler.java rename to framework/module-webserver/src/main/java/RequestHandler.java index 5e2a57be9..87ac1a299 100644 --- a/module-api/src/main/java/webserver/RequestHandler.java +++ b/framework/module-webserver/src/main/java/RequestHandler.java @@ -1,35 +1,32 @@ -package webserver; +import static org.slf4j.LoggerFactory.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; import java.net.Socket; -import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; -import java.util.Map; import java.util.Objects; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import controller.Controller; -import service.session.SessionService; +import domain.HttpRequest; +import domain.HttpResponse; import session.HttpSession; +import session.SessionService; public class RequestHandler implements Runnable { - private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class); + private static final Logger logger = getLogger(RequestHandler.class); private final Socket connection; private final Context context; - private final Map controllers; private final SessionService sessionService; public RequestHandler(Socket connectionSocket) { this.connection = connectionSocket; this.context = Context.getInstance(); - controllers = context.createControllerBifurcation(); sessionService = SessionService.getInstance(); } @@ -49,10 +46,9 @@ public void run() { } printHeader(httpRequest); printParameter(httpRequest); - Controller controller = controllers.getOrDefault(httpRequest.getPath(), controllers.get("file")); - controller.service(httpRequest, new HttpResponse(out)); + context.invoke(httpRequest, new HttpResponse(out)); sessionService.update(httpRequest.getHttpSession()); - } catch (IOException | URISyntaxException e) { + } catch (IOException | IllegalAccessException | InvocationTargetException e) { logger.error(e.getMessage()); } } diff --git a/module-api/src/main/java/webserver/WebServer.java b/framework/module-webserver/src/main/java/WebServer.java similarity index 84% rename from module-api/src/main/java/webserver/WebServer.java rename to framework/module-webserver/src/main/java/WebServer.java index 8451458f2..64edf49ce 100644 --- a/module-api/src/main/java/webserver/WebServer.java +++ b/framework/module-webserver/src/main/java/WebServer.java @@ -1,4 +1,4 @@ -package webserver; +import static org.slf4j.LoggerFactory.*; import java.net.ServerSocket; import java.net.Socket; @@ -7,14 +7,13 @@ import java.util.concurrent.Executors; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class WebServer { - private static final Logger logger = LoggerFactory.getLogger(WebServer.class); + private static final Logger logger = getLogger(WebServer.class); private static final ExecutorService es = Executors.newFixedThreadPool(100); private static final int DEFAULT_PORT = 8080; - public static void main(String[] args) throws Exception { + public void run(String[] args) throws Exception { int port = 0; if (Objects.isNull(args) || args.length == 0) { port = DEFAULT_PORT; diff --git a/framework/module-webserver/src/main/java/annotations/Controller.java b/framework/module-webserver/src/main/java/annotations/Controller.java new file mode 100644 index 000000000..29ce1a727 --- /dev/null +++ b/framework/module-webserver/src/main/java/annotations/Controller.java @@ -0,0 +1,11 @@ +package annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Controller { +} diff --git a/framework/module-webserver/src/main/java/annotations/RequestMapping.java b/framework/module-webserver/src/main/java/annotations/RequestMapping.java new file mode 100644 index 000000000..f8a256b2a --- /dev/null +++ b/framework/module-webserver/src/main/java/annotations/RequestMapping.java @@ -0,0 +1,16 @@ +package annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import domain.HttpMethod; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequestMapping { + String path() default ""; + + HttpMethod method() default HttpMethod.GET; +} diff --git a/module-common/src/main/java/webserver/HttpCookie.java b/framework/module-webserver/src/main/java/cookie/HttpCookie.java similarity index 86% rename from module-common/src/main/java/webserver/HttpCookie.java rename to framework/module-webserver/src/main/java/cookie/HttpCookie.java index 82ccd62d0..5f33ac634 100644 --- a/module-common/src/main/java/webserver/HttpCookie.java +++ b/framework/module-webserver/src/main/java/cookie/HttpCookie.java @@ -1,8 +1,11 @@ -package webserver; +package cookie; import java.util.ArrayList; import java.util.List; +import domain.HttpHeader; +import domain.HttpResponse; + public class HttpCookie { private final List cookies; diff --git a/module-common/src/main/java/webserver/HttpHeader.java b/framework/module-webserver/src/main/java/domain/HttpHeader.java similarity index 93% rename from module-common/src/main/java/webserver/HttpHeader.java rename to framework/module-webserver/src/main/java/domain/HttpHeader.java index d5c4efed8..d9365ee81 100644 --- a/module-common/src/main/java/webserver/HttpHeader.java +++ b/framework/module-webserver/src/main/java/domain/HttpHeader.java @@ -1,4 +1,4 @@ -package webserver; +package domain; public class HttpHeader { public static final String CONTENT_LENGTH = "Content-Length"; diff --git a/module-common/src/main/java/webserver/HttpMethod.java b/framework/module-webserver/src/main/java/domain/HttpMethod.java similarity index 94% rename from module-common/src/main/java/webserver/HttpMethod.java rename to framework/module-webserver/src/main/java/domain/HttpMethod.java index 80585ef5a..a1f93cabb 100644 --- a/module-common/src/main/java/webserver/HttpMethod.java +++ b/framework/module-webserver/src/main/java/domain/HttpMethod.java @@ -1,4 +1,4 @@ -package webserver; +package domain; public enum HttpMethod { GET, diff --git a/module-common/src/main/java/webserver/HttpRequest.java b/framework/module-webserver/src/main/java/domain/HttpRequest.java similarity index 99% rename from module-common/src/main/java/webserver/HttpRequest.java rename to framework/module-webserver/src/main/java/domain/HttpRequest.java index 1ee24fbbb..709654d31 100644 --- a/module-common/src/main/java/webserver/HttpRequest.java +++ b/framework/module-webserver/src/main/java/domain/HttpRequest.java @@ -1,4 +1,4 @@ -package webserver; +package domain; import java.io.BufferedReader; import java.io.IOException; diff --git a/module-common/src/main/java/webserver/HttpResponse.java b/framework/module-webserver/src/main/java/domain/HttpResponse.java similarity index 99% rename from module-common/src/main/java/webserver/HttpResponse.java rename to framework/module-webserver/src/main/java/domain/HttpResponse.java index 00e9a01e1..50b4c474b 100644 --- a/module-common/src/main/java/webserver/HttpResponse.java +++ b/framework/module-webserver/src/main/java/domain/HttpResponse.java @@ -1,4 +1,4 @@ -package webserver; +package domain; import java.io.DataOutputStream; import java.io.IOException; diff --git a/module-common/src/main/java/webserver/HttpStatus.java b/framework/module-webserver/src/main/java/domain/HttpStatus.java similarity index 97% rename from module-common/src/main/java/webserver/HttpStatus.java rename to framework/module-webserver/src/main/java/domain/HttpStatus.java index aec7c6a9f..dd4178956 100644 --- a/module-common/src/main/java/webserver/HttpStatus.java +++ b/framework/module-webserver/src/main/java/domain/HttpStatus.java @@ -1,4 +1,4 @@ -package webserver; +package domain; public enum HttpStatus { OK("OK", 200), diff --git a/module-common/src/main/java/session/HttpSession.java b/framework/module-webserver/src/main/java/session/HttpSession.java similarity index 100% rename from module-common/src/main/java/session/HttpSession.java rename to framework/module-webserver/src/main/java/session/HttpSession.java diff --git a/module-common/src/main/java/session/SessionRepository.java b/framework/module-webserver/src/main/java/session/SessionRepository.java similarity index 100% rename from module-common/src/main/java/session/SessionRepository.java rename to framework/module-webserver/src/main/java/session/SessionRepository.java diff --git a/module-api/src/main/java/service/session/SessionService.java b/framework/module-webserver/src/main/java/session/SessionService.java similarity index 86% rename from module-api/src/main/java/service/session/SessionService.java rename to framework/module-webserver/src/main/java/session/SessionService.java index bd4fde9e9..9786af522 100644 --- a/module-api/src/main/java/service/session/SessionService.java +++ b/framework/module-webserver/src/main/java/session/SessionService.java @@ -1,7 +1,4 @@ -package service.session; - -import session.HttpSession; -import session.SessionRepository; +package session; public class SessionService { private static SessionService instance = new SessionService(); diff --git a/module-core/src/main/java/utils/Extension.java b/framework/module-webserver/src/main/java/utils/Extension.java similarity index 100% rename from module-core/src/main/java/utils/Extension.java rename to framework/module-webserver/src/main/java/utils/Extension.java diff --git a/module-core/src/main/java/utils/IOUtils.java b/framework/module-webserver/src/main/java/utils/IOUtils.java similarity index 100% rename from module-core/src/main/java/utils/IOUtils.java rename to framework/module-webserver/src/main/java/utils/IOUtils.java diff --git a/module-core/src/main/java/utils/RequestUtils.java b/framework/module-webserver/src/main/java/utils/RequestUtils.java similarity index 100% rename from module-core/src/main/java/utils/RequestUtils.java rename to framework/module-webserver/src/main/java/utils/RequestUtils.java diff --git a/module-api/src/main/resources/logback.xml b/framework/module-webserver/src/main/resources/logback.xml similarity index 100% rename from module-api/src/main/resources/logback.xml rename to framework/module-webserver/src/main/resources/logback.xml diff --git a/module-common/src/test/java/webserver/HttpRequestTest.java b/framework/module-webserver/src/test/java/domain/HttpRequestTest.java similarity index 99% rename from module-common/src/test/java/webserver/HttpRequestTest.java rename to framework/module-webserver/src/test/java/domain/HttpRequestTest.java index e5552f17c..f8416e54d 100644 --- a/module-common/src/test/java/webserver/HttpRequestTest.java +++ b/framework/module-webserver/src/test/java/domain/HttpRequestTest.java @@ -1,4 +1,4 @@ -package webserver; +package domain; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/module-common/src/test/java/webserver/HttpResponseTest.java b/framework/module-webserver/src/test/java/domain/HttpResponseTest.java similarity index 80% rename from module-common/src/test/java/webserver/HttpResponseTest.java rename to framework/module-webserver/src/test/java/domain/HttpResponseTest.java index 1bf1671b1..bff99a3c1 100644 --- a/module-common/src/test/java/webserver/HttpResponseTest.java +++ b/framework/module-webserver/src/test/java/domain/HttpResponseTest.java @@ -1,25 +1,28 @@ -package webserver; +package domain; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import org.junit.jupiter.api.Test; -import utils.FileIoUtils; import utils.RequestUtils; class HttpResponseTest { @Test void responseForward() throws Exception { // Http_Forward.txt 결과는 응답 body에 index.html이 포함되어 있어야 한다. - String path = "/index.html"; + String filePath = "./index.html"; HttpResponse response = new HttpResponse(createOutputStream("Http_Forward.txt")); - byte[] body = FileIoUtils.findStaticFile(path); + Path path = Paths.get(HttpResponseTest.class.getClassLoader().getResource(filePath).toURI()); + byte[] body = Files.readAllBytes(path); response.setHttpStatus(HttpStatus.OK); response.addHeader(HttpHeader.CONTENT_TYPE, - String.format("text/%s;charset=utf-8", RequestUtils.extractExtension(path))); + String.format("text/%s;charset=utf-8", RequestUtils.extractExtension(filePath))); response.addHeader(HttpHeader.CONTENT_LENGTH, String.valueOf(body.length)); response.forward(body); } @@ -40,7 +43,7 @@ public void error() throws Exception { } private OutputStream createOutputStream(String filename) throws FileNotFoundException { - String testDirectory = "/Users/sangbo/Projects/woowa/jwp-was/module-common/src/test/resources/"; + String testDirectory = "/Users/sangbo/Projects/woowa/jwp-was/framework/module-webserver/src/test/resources/"; return new FileOutputStream(new File(testDirectory + filename)); } } diff --git a/module-common/src/test/java/session/HttpSessionTest.java b/framework/module-webserver/src/test/java/session/HttpSessionTest.java similarity index 100% rename from module-common/src/test/java/session/HttpSessionTest.java rename to framework/module-webserver/src/test/java/session/HttpSessionTest.java diff --git a/module-core/src/test/java/utils/ExtensionTest.java b/framework/module-webserver/src/test/java/utils/ExtensionTest.java similarity index 100% rename from module-core/src/test/java/utils/ExtensionTest.java rename to framework/module-webserver/src/test/java/utils/ExtensionTest.java diff --git a/module-core/src/test/java/utils/IOUtilsTest.java b/framework/module-webserver/src/test/java/utils/IOUtilsTest.java similarity index 100% rename from module-core/src/test/java/utils/IOUtilsTest.java rename to framework/module-webserver/src/test/java/utils/IOUtilsTest.java diff --git a/module-core/src/test/java/utils/RequestUtilsTest.java b/framework/module-webserver/src/test/java/utils/RequestUtilsTest.java similarity index 100% rename from module-core/src/test/java/utils/RequestUtilsTest.java rename to framework/module-webserver/src/test/java/utils/RequestUtilsTest.java diff --git a/module-common/src/test/resources/Http_Error.txt b/framework/module-webserver/src/test/resources/Http_Error.txt similarity index 100% rename from module-common/src/test/resources/Http_Error.txt rename to framework/module-webserver/src/test/resources/Http_Error.txt diff --git a/module-common/src/test/resources/Http_Forward.txt b/framework/module-webserver/src/test/resources/Http_Forward.txt similarity index 100% rename from module-common/src/test/resources/Http_Forward.txt rename to framework/module-webserver/src/test/resources/Http_Forward.txt diff --git a/module-common/src/test/resources/Http_Redirect.txt b/framework/module-webserver/src/test/resources/Http_Redirect.txt similarity index 100% rename from module-common/src/test/resources/Http_Redirect.txt rename to framework/module-webserver/src/test/resources/Http_Redirect.txt diff --git a/framework/module-webserver/src/test/resources/index.html b/framework/module-webserver/src/test/resources/index.html new file mode 100644 index 000000000..1675898ad --- /dev/null +++ b/framework/module-webserver/src/test/resources/index.html @@ -0,0 +1,148 @@ + + + + + + SLiPP Java Web Programming + + + + + + + + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/module-api/module-api.iml b/module-api/module-api.iml deleted file mode 100644 index 4a4ce5540..000000000 --- a/module-api/module-api.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/module-api/src/main/java/webserver/Context.java b/module-api/src/main/java/webserver/Context.java deleted file mode 100644 index 829dc79be..000000000 --- a/module-api/src/main/java/webserver/Context.java +++ /dev/null @@ -1,40 +0,0 @@ -package webserver; - -import java.util.HashMap; -import java.util.Map; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import controller.Controller; -import controller.FileController; -import controller.user.LoginController; -import controller.user.UserCreateController; -import controller.user.UserListController; -import controller.user.UserReadController; -import service.session.SessionService; -import service.user.UserService; - -public class Context { - private static final ObjectMapper objectMapper = new ObjectMapper(); - private static final Context instance = new Context(); - - private Context() { - } - - public static Context getInstance() { - return instance; - } - - public Map createControllerBifurcation() { - Map controllers = new HashMap<>(); - UserService userService = UserService.getInstance(); - SessionService sessionService = SessionService.getInstance(); - - controllers.put("file", new FileController()); - controllers.put("/user/create", new UserCreateController(userService, sessionService)); - controllers.put("/user/profile", new UserReadController(userService, objectMapper)); - controllers.put("/user/login", new LoginController(userService)); - controllers.put("/user/list", new UserListController(userService, sessionService, objectMapper)); - return controllers; - } -} diff --git a/module-common/build.gradle b/module-common/build.gradle deleted file mode 100644 index 491f64f5c..000000000 --- a/module-common/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -jar { - enabled = true -} - -dependencies { - implementation project(':module-core') -} diff --git a/module-common/module-common.iml b/module-common/module-common.iml deleted file mode 100644 index 4a4ce5540..000000000 --- a/module-common/module-common.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/module-core/build.gradle b/module-core/build.gradle deleted file mode 100644 index 3c31111ab..000000000 --- a/module-core/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -jar { - enabled = true -} - -dependencies { - implementation 'org.slf4j:slf4j-log4j12:1.7.29' -} diff --git a/module-core/module-core.iml b/module-core/module-core.iml deleted file mode 100644 index 98212fd64..000000000 --- a/module-core/module-core.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 054065431..764d40fd8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,3 @@ rootProject.name = 'jwp-was' -include 'module-core', 'module-api', 'module-common' +include 'application', 'application:module-api', 'application:module-common', 'application:module-core' +include 'framework:module-webserver'