From cc0f425a1cfe3de2908e55638639dce8a24789cb Mon Sep 17 00:00:00 2001 From: jhchoi57 <46276276+jhchoi57@users.noreply.github.com> Date: Thu, 26 Jan 2023 10:57:11 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=B5=9C=EC=A3=BC=ED=98=95]=2016=EC=9D=BC?= =?UTF-8?q?=EC=B0=A8=20PR=20(#175)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 기존 파일 삭제 * START SPRING PROJECT * FEAT : HtmlController 초기 세팅 * FEAT : SignUpService class add * FEAT : db, user model 추가 및 구현 * FEAT : Service class에 애노테이션 추가 * FEAT : 회원가입 기능 구현 * FEAT : login 기능 구현 * REFACTOR : rename db > repository * REFACTOR : rename memoryDB > memoryRepository * FEAT : 로그인을 위한 LoginForm 클래스 생성 * DOCS : README.md 추가 * DOCS : 리드미 학습내용 추가 * FIX : login 성공 시 첫 페이지로 이동 * FEAT : login 성공 시 회원가입, 로그인 버튼 삭제 thymeleaf 이용 * FEAT : html 전부 thymeleaf에 맞게 수정 * FEAT : 로그인 시 로그아웃과 개인정보 수정 버튼 생기게 수정 * FEAT : user List html 구현 * FEAT : 회원가입 중복체크 구현 * FEAT : mysql 연동 준비 --- .gitignore | 235 +++------------- README.md | 263 +++--------------- build.gradle | 38 ++- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 263 +++++++++++------- gradlew.bat | 14 +- settings.gradle | 3 +- .../bejavawebserver/WebserverApplication.java | 13 + .../controller/HomeController.java | 13 + .../controller/HtmlController.java | 54 ++++ .../controller/UserController.java | 32 +++ .../java/bejavawebserver/model/LoginForm.java | 12 + .../{ => bejavawebserver}/model/User.java | 2 +- .../repository/memoryRepository.java} | 14 +- .../bejavawebserver/service/HtmlService.java | 29 ++ .../bejavawebserver/service/ListService.java | 20 ++ .../bejavawebserver/service/LoginService.java | 22 ++ .../service/SignUpService.java | 13 + src/main/java/controller/Controller.java | 8 - src/main/java/controller/HtmlController.java | 40 --- .../java/controller/StaticFileController.java | 19 -- src/main/java/controller/UserController.java | 46 --- src/main/java/db/Session.java | 30 -- src/main/java/http/HttpHeader.java | 49 ---- src/main/java/http/HttpStatus.java | 27 -- src/main/java/http/HttpUri.java | 21 -- .../DuplicateSignUpUserException.java | 7 - .../exception/NullHttpRequestException.java | 7 - src/main/java/http/request/HttpRequest.java | 68 ----- .../java/http/request/HttpRequestLine.java | 27 -- src/main/java/http/response/HttpResponse.java | 95 ------- .../java/http/response/HttpStatusLine.java | 18 -- src/main/java/service/HtmlService.java | 34 --- src/main/java/service/ListService.java | 60 ---- src/main/java/service/LogInService.java | 67 ----- src/main/java/service/SignUpService.java | 48 ---- src/main/java/service/StaticFileService.java | 19 -- src/main/java/util/HttpRequestUtils.java | 75 ----- src/main/java/util/HttpResponseUtils.java | 39 --- .../java/webserver/ControllerHandler.java | 39 --- src/main/java/webserver/RequestHandler.java | 46 --- src/main/java/webserver/WebServer.java | 33 --- src/main/resources/application.properties | 4 + src/main/resources/templates/index.html | 10 +- src/main/resources/templates/qna/form.html | 10 +- src/main/resources/templates/qna/show.html | 10 +- src/main/resources/templates/user/form.html | 10 +- src/main/resources/templates/user/list.html | 18 +- src/main/resources/templates/user/login.html | 10 +- .../templates/user/login_failed.html | 10 +- .../resources/templates/user/profile.html | 10 +- src/test/java/HtmlServiceTest.java | 30 -- src/test/java/HttpRequestUtilsTest.java | 37 --- src/test/java/HttpResponseUtilsTest.java | 48 ---- src/test/java/ListServiceTest.java | 32 --- src/test/java/LogInServiceTest.java | 41 --- src/test/java/SignUpServiceTest.java | 48 ---- src/test/java/StaticFileServiceTest.java | 21 -- .../WebserverApplicationTests.java | 13 + 60 files changed, 543 insertions(+), 1783 deletions(-) create mode 100644 src/main/java/bejavawebserver/WebserverApplication.java create mode 100644 src/main/java/bejavawebserver/controller/HomeController.java create mode 100644 src/main/java/bejavawebserver/controller/HtmlController.java create mode 100644 src/main/java/bejavawebserver/controller/UserController.java create mode 100644 src/main/java/bejavawebserver/model/LoginForm.java rename src/main/java/{ => bejavawebserver}/model/User.java (96%) rename src/main/java/{db/Database.java => bejavawebserver/repository/memoryRepository.java} (67%) create mode 100644 src/main/java/bejavawebserver/service/HtmlService.java create mode 100644 src/main/java/bejavawebserver/service/ListService.java create mode 100644 src/main/java/bejavawebserver/service/LoginService.java create mode 100644 src/main/java/bejavawebserver/service/SignUpService.java delete mode 100644 src/main/java/controller/Controller.java delete mode 100644 src/main/java/controller/HtmlController.java delete mode 100644 src/main/java/controller/StaticFileController.java delete mode 100644 src/main/java/controller/UserController.java delete mode 100644 src/main/java/db/Session.java delete mode 100644 src/main/java/http/HttpHeader.java delete mode 100644 src/main/java/http/HttpStatus.java delete mode 100644 src/main/java/http/HttpUri.java delete mode 100644 src/main/java/http/exception/DuplicateSignUpUserException.java delete mode 100644 src/main/java/http/exception/NullHttpRequestException.java delete mode 100644 src/main/java/http/request/HttpRequest.java delete mode 100644 src/main/java/http/request/HttpRequestLine.java delete mode 100644 src/main/java/http/response/HttpResponse.java delete mode 100644 src/main/java/http/response/HttpStatusLine.java delete mode 100644 src/main/java/service/HtmlService.java delete mode 100644 src/main/java/service/ListService.java delete mode 100644 src/main/java/service/LogInService.java delete mode 100644 src/main/java/service/SignUpService.java delete mode 100644 src/main/java/service/StaticFileService.java delete mode 100644 src/main/java/util/HttpRequestUtils.java delete mode 100644 src/main/java/util/HttpResponseUtils.java delete mode 100644 src/main/java/webserver/ControllerHandler.java delete mode 100644 src/main/java/webserver/RequestHandler.java delete mode 100644 src/main/java/webserver/WebServer.java create mode 100644 src/main/resources/application.properties delete mode 100644 src/test/java/HtmlServiceTest.java delete mode 100644 src/test/java/HttpRequestUtilsTest.java delete mode 100644 src/test/java/HttpResponseUtilsTest.java delete mode 100644 src/test/java/ListServiceTest.java delete mode 100644 src/test/java/LogInServiceTest.java delete mode 100644 src/test/java/SignUpServiceTest.java delete mode 100644 src/test/java/StaticFileServiceTest.java create mode 100644 src/test/java/bejavawebserver/WebserverApplicationTests.java diff --git a/.gitignore b/.gitignore index b7fa2d85..c2065bc2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,204 +1,37 @@ -# Created by https://www.toptal.com/developers/gitignore/api/macos,windows,intellij+all,gradle,java -# Edit at https://www.toptal.com/developers/gitignore?templates=macos,windows,intellij+all,gradle,java - -### Intellij+all ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format -*.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### Intellij+all Patch ### -# Ignore everything but code style settings and run configurations -# that are supposed to be shared within teams. - -.idea/* - -!.idea/codeStyles -!.idea/runConfigurations - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -replay_pid* - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### macOS Patch ### -# iCloud generated files -*.icloud - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -Thumbs.db:encryptable -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -### Gradle ### +HELP.md .gradle -**/build/ -!src/**/build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -# Avoid ignore Gradle wrappper properties -!gradle-wrapper.properties - -# Cache of project -.gradletasknamecache +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ -# Eclipse Gradle plugin generated files -# Eclipse Core -.project -# JDT-specific (Eclipse Java Development Tools) +### STS ### +.apt_generated .classpath - -### Gradle Patch ### -# Java heap dump -*.hprof - -# End of https://www.toptal.com/developers/gitignore/api/macos,windows,intellij+all,gradle,java +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/README.md b/README.md index 74ec11d4..f04c5898 100644 --- a/README.md +++ b/README.md @@ -2,241 +2,46 @@ Java Web Application Server 2022 -## 프로젝트 정보 +## 프로젝트 정보 -이 프로젝트는 우아한 테크코스 박재성님의 허가를 받아 https://github.com/woowacourse/jwp-was +이 프로젝트는 우아한 테크코스 박재성님의 허가를 받아 https://github.com/woowacourse/jwp-was 를 참고하여 작성되었습니다. -## 프로젝트 구조 - ├── controller - │ ├── Controller.java - │ ├── HtmlController.java - │ ├── StaticFileController.java - │ └── UserController.java - ├── db - │ ├── Database.java - │ └── Session.java - ├── http - │ ├── HttpHeader.java - │ ├── HttpStatus.java - │ ├── HttpUri.java - │ ├── exception - │ │ └── NullHttpRequestException.java - │ ├── request - │ │ ├── HttpRequest.java - │ │ └── HttpRequestLine.java - │ └── response - │ ├── HttpResponse.java - │ └── HttpStatusLine.java - ├── model - │ └── User.java - ├── service - │ ├── HtmlService.java - │ ├── ListService.java - │ ├── LogInService.java - │ ├── SignUpService.java - │ └── StaticFileService.java - ├── util - │ ├── HttpRequestUtils.java - │ └── HttpResponseUtils.java - └── webserver - ├── ControllerHandler.java - ├── RequestHandler.java - └── WebServer.java - -+ RequestHandler - + HttpRequest 클래스에 입력을 받고 받은 URI로 알맞는 컨트롤러를 골라준다. 고른 컨트롤러로 응답을 만들고 응답을 출력해준다. -+ ControllerHandler - + Post 요청인 경우를 먼저 확인 - 회원 가입과 로그인을 처리하는 UserController를 리턴 - + Html 파일 요청인 경우인지 확인 - Html파일을 처리하는 HtmlController를 리턴 - + 나머지인 경우 (정적 파일) - 정적 파일을 처리하는 StaticFileController를 리턴 -+ UserController - + HttpRequest 객체로부터 uri와 httpVersion을 받아온다. - + HttpRequest body의 query string을 파싱해서 Map 객체인 params에 넣어준다. - + 회원 가입 요청인 경우와 로그인 요청인 경우를 나누어 준다. - + 각각 params와 httpVersion을 나누어 주며 회원가입일 경우 SignUpService, 로그인일 경우 LogInService를 통해 응답을 생성해 준다. - + 생성된 응답 HttpResponse 객체를 리턴한다. -+ HtmlController - + HttpRequest 객체로부터 로그인 유저 정보, ContentType, 파일 경로, uri를 받는다. - + 유저 리스트 출력 html일 경우 ListService를 통해 응답 생성 - + index.html 로그인 상태일 경우 HtmlService를 통해 응답 생성 - + index.html 로그인 상태가 아닐 경우 정적 파일 요청이므로 StaticFileService를 통해 응답을 생성한다. - + 생성된 응답 HttpResponse 객체를 리턴한다. -+ StaticFileController - + 정적 파일들은 모두 /static 폴더 내에 있으므로 기본 파일 경로를 설정해준다. - + 설정해준 파일 경로에 HttpResquest객체로부터 받은 uri를 더해서 정적 파일 경로를 만들어준다. - + 만들어진 파일 경로로 StaticFileService를 통해 응답을 생성한다. - + 생성된 응답 HttpResponse 객체를 리턴한다. - - ## 프로젝트 학습 내용 -### 2주차 ++ lombok @Data + + 종합 선물 세트 ! + + @Getter/@Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 다 들어있음 + + @EqualsAndHashCode + + equals() 메소드와 hashCode() 메소드 자동 생성 + + hashCode() : 런타임 중 객체의 유일한 integer 값을 반환하는 함수 + + @RequiredArgsConstructor + + 초기화 되지 않은 final 필드나 @NonNull 어노테이션이 붙은 필드에 대해 생성자를 만들어 준다. + + @AllArgsConstructor, @NoArgsConstructor ++ Session method + + session.setAttribute(이름, 값) + + session.getAttribute(이름) + + 리턴 타입이 Object이므로 형 변환이 필요 ++ Thymeleaf +```HTML +
$+weM(>wdBg+cV$}6%(ccP;`!~CzW{0O2aLY
z?rQtBB6`ZztPP@_&`kzDzxc==?a{PUPUbbX31Vy?_(;c+>3q*!df!K(LQYZN ");
- index++;
- }
- return stringBuilder;
- }
-
-}
diff --git a/src/main/java/service/LogInService.java b/src/main/java/service/LogInService.java
deleted file mode 100644
index 9d065e71..00000000
--- a/src/main/java/service/LogInService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package service;
-
-import db.Database;
-import db.Session;
-import http.HttpStatus;
-import http.response.HttpResponse;
-import http.response.HttpStatusLine;
-import model.User;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Map;
-
-public class LogInService {
- private static final Logger logger = LoggerFactory.getLogger(LogInService.class);
-
- public static HttpResponse service(Map").append(index).append(" ")
- .append("").append(user.getUserId()).append(" ")
- .append("").append(user.getName()).append(" ")
- .append("").append(user.getEmail()).append(" ")
- .append("수정
+
diff --git a/src/main/resources/templates/user/login.html b/src/main/resources/templates/user/login.html
index f843a966..98b95047 100644
--- a/src/main/resources/templates/user/login.html
+++ b/src/main/resources/templates/user/login.html
@@ -1,5 +1,6 @@
+
@@ -68,10 +69,11 @@
diff --git a/src/main/resources/templates/user/login_failed.html b/src/main/resources/templates/user/login_failed.html
index cd57fc9e..488abb41 100644
--- a/src/main/resources/templates/user/login_failed.html
+++ b/src/main/resources/templates/user/login_failed.html
@@ -1,5 +1,6 @@
+
@@ -68,10 +69,11 @@
diff --git a/src/main/resources/templates/user/profile.html b/src/main/resources/templates/user/profile.html
index 7f5835df..ef024bd6 100644
--- a/src/main/resources/templates/user/profile.html
+++ b/src/main/resources/templates/user/profile.html
@@ -1,5 +1,6 @@
+
@@ -68,10 +69,11 @@
diff --git a/src/test/java/HtmlServiceTest.java b/src/test/java/HtmlServiceTest.java
deleted file mode 100644
index e0e4edbd..00000000
--- a/src/test/java/HtmlServiceTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-import model.User;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import service.HtmlService;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class HtmlServiceTest {
- @Test
- @DisplayName("동적 html 변환 테스트")
- void 동적_HTMl_변환_테스트() {
- // given
- String indexHtmlResponseString = "
+
+
+
+ 수정
+