From 1621acbc30473d1c01ce421c31679dff01da1df5 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 23 Jan 2023 11:14:25 +0900 Subject: [PATCH 01/43] =?UTF-8?q?Create=201=EC=A3=BC=EC=B0=A8=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250 \352\263\274\354\240\234.md" | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 "1\354\243\274\354\260\250 \352\263\274\354\240\234.md" diff --git "a/1\354\243\274\354\260\250 \352\263\274\354\240\234.md" "b/1\354\243\274\354\260\250 \352\263\274\354\240\234.md" new file mode 100644 index 0000000..007eb67 --- /dev/null +++ "b/1\354\243\274\354\260\250 \352\263\274\354\240\234.md" @@ -0,0 +1,28 @@ +## 블로그에 정리 +[스프링의 3가지 특성](https://khs20010327.tistory.com/112) + +[웹을 개발하는 3가지 방법](https://khs20010327.tistory.com/129) + +[MVC & 템플릿 엔진](https://khs20010327.tistory.com/130) + +[기본적인 회원가입 예제](https://khs20010327.tistory.com/131) + +[제어 역전 & 의존성 주입](https://khs20010327.tistory.com/132) + + + +## 이번 주는 어떻게 학습했나요? 아래 질문에 짧게 답변주세요! +강의 복습 + 관련 글 정리 + +### 이번 주에 학습에 투자한 시간 +약 8시간 + +### 학습 하면서 좋았던 점과 아쉬웠던 점 +이전에 들었던 강의를 복습하며 다시 들으니 좀 더 체계적으로 정리할 수 있어서 좋았습니다 +갑자기 일이 생겨 제출이 늦어졌습니다 죄송합니다. + + + + + +. From ef11139fc3076519250bd437926064d6059527b1 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:27:29 +0900 Subject: [PATCH 02/43] Delete .github directory --- .github/pull_request_template.md | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 6ee48cb..0000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,28 +0,0 @@ -## 이번 주에 어떤 작업을 했는지 설명해주세요. - - -
- -## 특히 어떤 부분을 리뷰받고 싶나요? - - -
- -## 이번 주는 어떻게 학습했나요? 아래 질문에 짧게 답변주세요! - -### 이번 주에 학습에 투자한 시간 - - - - -### 학습 하면서 좋았던 점과 아쉬웠던 점 - - - - - - -### 어려움을 겪는 부분 - - - - -### 스터디 개선되었으면 하는 점 - - - From cbd19f5e019f2cb4e3f851d01e2d619691911d0d Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:27:46 +0900 Subject: [PATCH 03/43] Delete gradle/wrapper directory --- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 5 ----- 2 files changed, 5 deletions(-) delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832f090a2944b7473328c07c9755baa3196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60756 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 Date: Mon, 30 Jan 2023 00:28:13 +0900 Subject: [PATCH 04/43] Delete src directory --- .../com/dku/springstudy/SpringStudyApplication.java | 13 ------------- src/main/resources/application.properties | 1 - .../springstudy/SpringStudyApplicationTests.java | 13 ------------- 3 files changed, 27 deletions(-) delete mode 100644 src/main/java/com/dku/springstudy/SpringStudyApplication.java delete mode 100644 src/main/resources/application.properties delete mode 100644 src/test/java/com/dku/springstudy/SpringStudyApplicationTests.java diff --git a/src/main/java/com/dku/springstudy/SpringStudyApplication.java b/src/main/java/com/dku/springstudy/SpringStudyApplication.java deleted file mode 100644 index ef164c9..0000000 --- a/src/main/java/com/dku/springstudy/SpringStudyApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dku.springstudy; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SpringStudyApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringStudyApplication.class, args); - } - -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/test/java/com/dku/springstudy/SpringStudyApplicationTests.java b/src/test/java/com/dku/springstudy/SpringStudyApplicationTests.java deleted file mode 100644 index 79d9975..0000000 --- a/src/test/java/com/dku/springstudy/SpringStudyApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dku.springstudy; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class SpringStudyApplicationTests { - - @Test - void contextLoads() { - } - -} From 330dfbabbe0e1ec9f9122cce2007777e70b1427c Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:28:32 +0900 Subject: [PATCH 05/43] Delete .gitignore --- .gitignore | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c2065bc..0000000 --- a/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.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/ From 8381d49d4b98aa7531ab10a42da950236515ebcd Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:28:39 +0900 Subject: [PATCH 06/43] =?UTF-8?q?Delete=201=EC=A3=BC=EC=B0=A8=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\354\260\250 \352\263\274\354\240\234.md" | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 "1\354\243\274\354\260\250 \352\263\274\354\240\234.md" diff --git "a/1\354\243\274\354\260\250 \352\263\274\354\240\234.md" "b/1\354\243\274\354\260\250 \352\263\274\354\240\234.md" deleted file mode 100644 index 007eb67..0000000 --- "a/1\354\243\274\354\260\250 \352\263\274\354\240\234.md" +++ /dev/null @@ -1,28 +0,0 @@ -## 블로그에 정리 -[스프링의 3가지 특성](https://khs20010327.tistory.com/112) - -[웹을 개발하는 3가지 방법](https://khs20010327.tistory.com/129) - -[MVC & 템플릿 엔진](https://khs20010327.tistory.com/130) - -[기본적인 회원가입 예제](https://khs20010327.tistory.com/131) - -[제어 역전 & 의존성 주입](https://khs20010327.tistory.com/132) - - - -## 이번 주는 어떻게 학습했나요? 아래 질문에 짧게 답변주세요! -강의 복습 + 관련 글 정리 - -### 이번 주에 학습에 투자한 시간 -약 8시간 - -### 학습 하면서 좋았던 점과 아쉬웠던 점 -이전에 들었던 강의를 복습하며 다시 들으니 좀 더 체계적으로 정리할 수 있어서 좋았습니다 -갑자기 일이 생겨 제출이 늦어졌습니다 죄송합니다. - - - - - -. From 7b8691672c64ed8ce2bbc48439b40d1e0f51e737 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:28:55 +0900 Subject: [PATCH 07/43] Delete build.gradle --- build.gradle | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 build.gradle diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 15b77ef..0000000 --- a/build.gradle +++ /dev/null @@ -1,34 +0,0 @@ -plugins { - id 'java' - id 'org.springframework.boot' version '3.0.1' - id 'io.spring.dependency-management' version '1.1.0' -} - -group = 'com.dku' -version = '0.0.1-SNAPSHOT' -sourceCompatibility = '17' - -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - -repositories { - mavenCentral() -} - -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springframework.boot:spring-boot-starter-web' - compileOnly 'org.projectlombok:lombok' - runtimeOnly 'com.mysql:mysql-connector-j' - annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.security:spring-security-test' -} - -tasks.named('test') { - useJUnitPlatform() -} From 116e3d5a97ef59732f0fb177d7d68f3f65bd97b0 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:29:00 +0900 Subject: [PATCH 08/43] Delete gradlew --- gradlew | 240 -------------------------------------------------------- 1 file changed, 240 deletions(-) delete mode 100755 gradlew diff --git a/gradlew b/gradlew deleted file mode 100755 index a69d9cb..0000000 --- a/gradlew +++ /dev/null @@ -1,240 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" From a1d7745c3f0938c4d743cd63a7d8db284ea78df8 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:29:05 +0900 Subject: [PATCH 09/43] Delete gradlew.bat --- gradlew.bat | 91 ----------------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 gradlew.bat diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 53a6b23..0000000 --- a/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega From eab0da21d947202911260694e2668d8a72dcc20c Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:29:11 +0900 Subject: [PATCH 10/43] Delete settings.gradle --- settings.gradle | 1 - 1 file changed, 1 deletion(-) delete mode 100644 settings.gradle diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index 73e37fd..0000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'springstudy' From d69ee813b24a710986b106fff82b726b55d69242 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:29:34 +0900 Subject: [PATCH 11/43] Create README.md --- springboot/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 springboot/README.md diff --git a/springboot/README.md b/springboot/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/springboot/README.md @@ -0,0 +1 @@ + From 209f891d682da1cdefe743ad0d7e921fde39f0cc Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:29:58 +0900 Subject: [PATCH 12/43] Add files via upload --- springboot/hello-spring.zip | Bin 0 -> 65194 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 springboot/hello-spring.zip diff --git a/springboot/hello-spring.zip b/springboot/hello-spring.zip new file mode 100644 index 0000000000000000000000000000000000000000..60a18ee4349c3b37b436e3c8aaaaa7701a4ec364 GIT binary patch literal 65194 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 =6rMK*Ur7y&L6oVi}bcj=YT5 z5xE7|+ksPFp&t`LS08y|BRvc=G4@T$%(e-ua%CG-x0|U)-ZbOs9h1%qrOS2mQZBck z+dOcqc3Dj1Hol_rTRG`N3byKpYXO=1KX0W1hNsuTa-`T*Y|FvJ6+p^u>bTK39Clf} zUZ+U7PJAWs_%6*{R3tEtxx14Vi;7ex5Fv^)SC|rXlooUHzb-0>7}rpDfL8Yi)9u7e zKi1eWqzy^kmW^Q9eZWBQniV^H&bplCw9&TT*t~1tD&tc}3H`u#E@iNUgCT`$z!E0k zSjnD{D0%r6(YDhpF~|=xkbWyNm-IlHHTOVSjJp@vuLK2?Zjq`A`i4^T3!xM&k@Xj9 z_>NI=&!|E#Ca?q!90v~@I7y8eII$2#=Z|$2x~B75P#tZwaU;b?I`B8>^TBz7&zlem zo`aNTZ;71F5k0)OtIdUy> zh0_GhGsV7h|D+CM1yHjRnB#~+{vwKQMM=RwADF?)EvIK-(#kEEgRPHf`jkZGg0^x{k zfhH#WzxH#MW-qa#J{3I_Jk;FO+}1YM6dLe+UJ(Peo>cL<0ZrE58f*g_P3Q%d?;-FE z{7V3;?@E^s7PvnZM+(2*;rKU-PJZBdy(^Cx;gJ9?d~t`Cd~YY1)^ImMQ8i-T$s{H) zr`ASGOnN=Pj#UQO*51*?^5gZ2f0G%^VOC=mnTvmzp}Hl348*RNDo(ii4(FN0lAE}t z9-<7OHf1NJ+SCSWk<(8i2*JejaE5tmc`tmZQY#vsUr?{<3Hj!6cXVR#!W>rtI z;{7!1j@RarQ<`5a6`e5l7Ls;btxChDS}E0?a3*`S%R0?~@fM?AlTI_JUZZDGbLpmU zIfZ4*uA9pBtxd-s$gP^vWy`H-uYH;EEqenQpj92fuxi$nU;&>&#yyj~_5_=*HOFe0 zQXZgHai`m8Qd6&7((>oh@w&j(yEZGMznG>TU{yrPk6^uS)?R-<<8A9yPazLdB8bXt zGCMNlwI2sRQTHGdUXoNHMvrb~h`GOn84r%KludC9o|*}EYT-xbAOR>6yGCWnky18x zt^AtDkmVF;=0o1YYQoq6GjU>BPlY0vm0Ne2a8YP%7h>Et`v4JA5~0MuSbw$FtKHKs zrgO7{W-(tFXR|_&Z8M*T89Ro7B}k_>BcGzFlJn{8K~Bd8gEBEjJUk+_ERjCiyISO!h=23J*zIh2WFXs+vy_Y8I8utny)AQUaf>)pCs|x=;iqym zf&e3dUw@9<@=EtxK`ddh>RK zdvpqvN;uLHgi;>^OES}nECj48tic{yd+yT)#~!vP3TrPpZ^|H#U%tJfI2Z;49vNu? zESH=`D4d1a0v#4one}$bv?dx>JC#!a-}b@_Vp*ZIz9t6PjsoduIMQ73V$-sAEtbq> zJYQ|vZETkP1}d2a+-kZGW-P70YiAC>c$93&k%QwUJ4sabOW){CEGv;~E?Zr9={_`C zOam^2a3N z^4xbcTrnk<4aT-5-g_S#j_LSAdKru^CVa#^1`Wub=?+9$zqp_K&J|3juP#Lxbzdt6 zu$pE1FvJp-Q>8r8QP)!^hc_Q8ghSV+zUppw9lX#R1PMk@sgkdCYoDZzTdrilQ>Kzt z1*xMw>*>3lo5cdYA`>niq^!Th)ng9tIIos#0UP0>sFj4uq!9JUK$zo~b0fEOuld7< zBy92oLaJKX8Fn{X2X;3Q2X41k{9x!#v@(cp9(tUoGme}tyfxbD(5F*Dkr(wAK6$8> zsZ?&eE5x-jyhC>`aU;>)i2MZOdL#(;X8zsgg*~nF)#P_akf+^ax``^KxRS>ksOP zU8cTARUAFx&AQrM*P~&&v+�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 Date: Mon, 30 Jan 2023 00:31:49 +0900 Subject: [PATCH 13/43] Update README.md --- springboot/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/springboot/README.md b/springboot/README.md index 8b13789..15d1e63 100644 --- a/springboot/README.md +++ b/springboot/README.md @@ -1 +1,4 @@ +![image](https://user-images.githubusercontent.com/101636590/215336786-ab19fe26-630f-4609-88ef-305582c7dd50.png) + +링크 https://start.spring.io/ From e87ab5b6dc1e755fc2bfb6c3f425e02ae73717be Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:40:44 +0900 Subject: [PATCH 14/43] Update README.md --- springboot/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/springboot/README.md b/springboot/README.md index 15d1e63..02c7e43 100644 --- a/springboot/README.md +++ b/springboot/README.md @@ -2,3 +2,8 @@ 링크 https://start.spring.io/ + + +![image](https://user-images.githubusercontent.com/101636590/215337523-9a5dd004-c383-4bc1-ab5c-56aad2e45abc.png) +빠른 실습을 위해 gradle이 아닌 intellij로 실행하도록 설정 +file -> setting -> gradle(검색) -> From 1af705a43ef3adf2d96f9953bb4fd3e95fd9b60a Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:40:54 +0900 Subject: [PATCH 15/43] Update README.md --- springboot/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/springboot/README.md b/springboot/README.md index 02c7e43..627b887 100644 --- a/springboot/README.md +++ b/springboot/README.md @@ -5,5 +5,6 @@ ![image](https://user-images.githubusercontent.com/101636590/215337523-9a5dd004-c383-4bc1-ab5c-56aad2e45abc.png) + 빠른 실습을 위해 gradle이 아닌 intellij로 실행하도록 설정 file -> setting -> gradle(검색) -> From 02c42f8528abca9e83413f87a27922066e4ac57f Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:44:09 +0900 Subject: [PATCH 16/43] Create README.md --- mvc & api/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 mvc & api/README.md diff --git a/mvc & api/README.md b/mvc & api/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mvc & api/README.md @@ -0,0 +1 @@ + From f81187ff679522648c962ba8d6e2006666a39369 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:45:56 +0900 Subject: [PATCH 17/43] Add files via upload --- .../hellospring/HelloSpringApplication.java | 13 +++++ .../controller/HelloController.java | 49 +++++++++++++++++++ mvc & api/resources/application.properties | 1 + mvc & api/resources/templates/hello.html | 10 ++++ 4 files changed, 73 insertions(+) create mode 100644 mvc & api/java/hello/hellospring/HelloSpringApplication.java create mode 100644 mvc & api/java/hello/hellospring/controller/HelloController.java create mode 100644 mvc & api/resources/application.properties create mode 100644 mvc & api/resources/templates/hello.html diff --git a/mvc & api/java/hello/hellospring/HelloSpringApplication.java b/mvc & api/java/hello/hellospring/HelloSpringApplication.java new file mode 100644 index 0000000..f0f0fd4 --- /dev/null +++ b/mvc & api/java/hello/hellospring/HelloSpringApplication.java @@ -0,0 +1,13 @@ +package hello.hellospring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HelloSpringApplication { + + public static void main(String[] args) { + SpringApplication.run(HelloSpringApplication.class, args); + } + +} diff --git a/mvc & api/java/hello/hellospring/controller/HelloController.java b/mvc & api/java/hello/hellospring/controller/HelloController.java new file mode 100644 index 0000000..35d01f6 --- /dev/null +++ b/mvc & api/java/hello/hellospring/controller/HelloController.java @@ -0,0 +1,49 @@ +package hello.hellospring.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class HelloController { + + @GetMapping("hello") + public String hello(Model model) { + model.addAttribute("data", "hello!!"); + return "hello"; + } + + @GetMapping("hello-mvc") + public String helloMvc(@RequestParam("name") String str, Model model) { + //@RequestParam(value = "name", required = false + model.addAttribute("data", str); + return "hello"; + } + + @GetMapping("hello-api-str") + @ResponseBody + public String helloString(@RequestParam("name") String str) { + return str; + } + + @GetMapping("hello-api-json") + @ResponseBody + public Hello helloApi(@RequestParam("name") String str) { + Hello hello = new Hello(); + hello.setName(str); + return hello; + } + static class Hello { + private String name; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + //단축키 alt + insert + } +} diff --git a/mvc & api/resources/application.properties b/mvc & api/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mvc & api/resources/application.properties @@ -0,0 +1 @@ + diff --git a/mvc & api/resources/templates/hello.html b/mvc & api/resources/templates/hello.html new file mode 100644 index 0000000..06edf9b --- /dev/null +++ b/mvc & api/resources/templates/hello.html @@ -0,0 +1,10 @@ + + + + Hello + + + +

안녕하세요. 손님

+ + \ No newline at end of file From 8789122769abd211a3a46a92ccc42fe9acf65972 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:49:03 +0900 Subject: [PATCH 18/43] Update README.md --- mvc & api/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mvc & api/README.md b/mvc & api/README.md index 8b13789..e3314c4 100644 --- a/mvc & api/README.md +++ b/mvc & api/README.md @@ -1 +1,7 @@ +![image](https://user-images.githubusercontent.com/101636590/215345497-4e454d14-43cd-481b-b555-ee9b40f777d7.png) +정리글 https://khs20010327.tistory.com/129 + + +![image](https://user-images.githubusercontent.com/101636590/215345582-ddb2666a-7793-418a-b817-78f56995b73c.png) +![image](https://user-images.githubusercontent.com/101636590/215345589-d7460497-f793-40e6-b828-8436c7f43315.png) From 6dcd26fcf778af2de00a74cce686ce9b8efc2640 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:49:38 +0900 Subject: [PATCH 19/43] Update README.md --- mvc & api/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mvc & api/README.md b/mvc & api/README.md index e3314c4..cc36cbf 100644 --- a/mvc & api/README.md +++ b/mvc & api/README.md @@ -1,7 +1,3 @@ ![image](https://user-images.githubusercontent.com/101636590/215345497-4e454d14-43cd-481b-b555-ee9b40f777d7.png) 정리글 https://khs20010327.tistory.com/129 - - -![image](https://user-images.githubusercontent.com/101636590/215345582-ddb2666a-7793-418a-b817-78f56995b73c.png) -![image](https://user-images.githubusercontent.com/101636590/215345589-d7460497-f793-40e6-b828-8436c7f43315.png) From d0a04eff18637ef2bbd5f3db5f7df5828e0bc74b Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:51:19 +0900 Subject: [PATCH 20/43] Create hello.html --- mvc & api/hello.html | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mvc & api/hello.html diff --git a/mvc & api/hello.html b/mvc & api/hello.html new file mode 100644 index 0000000..257f7ad --- /dev/null +++ b/mvc & api/hello.html @@ -0,0 +1,10 @@ + + + + Hello + + + +

안녕하세요. 손님

+ + From a60a3603b0d6461baf876828d8b3cc2b16fc22a3 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:52:03 +0900 Subject: [PATCH 21/43] Create HelloController.java --- mvc & api/HelloController.java | 49 ++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 mvc & api/HelloController.java diff --git a/mvc & api/HelloController.java b/mvc & api/HelloController.java new file mode 100644 index 0000000..debd0bc --- /dev/null +++ b/mvc & api/HelloController.java @@ -0,0 +1,49 @@ +package hello.hellospring.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class HelloController { + + @GetMapping("hello") + public String hello(Model model) { + model.addAttribute("data", "hello!!"); + return "hello"; + } + + @GetMapping("hello-mvc") + public String helloMvc(@RequestParam("name") String str, Model model) { + //@RequestParam(value = "name", required = false + model.addAttribute("data", str); + return "hello"; + } + + @GetMapping("hello-api-str") + @ResponseBody + public String helloString(@RequestParam("name") String str) { + return str; + } + + @GetMapping("hello-api-json") + @ResponseBody + public Hello helloApi(@RequestParam("name") String str) { + Hello hello = new Hello(); + hello.setName(str); + return hello; + } + static class Hello { + private String name; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + //단축키 alt + insert + } +} From 334fd24d91d0e8bee7eefcbdcdc8939e0d4a6777 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:52:09 +0900 Subject: [PATCH 22/43] Delete mvc & api/resources directory --- mvc & api/resources/application.properties | 1 - mvc & api/resources/templates/hello.html | 10 ---------- 2 files changed, 11 deletions(-) delete mode 100644 mvc & api/resources/application.properties delete mode 100644 mvc & api/resources/templates/hello.html diff --git a/mvc & api/resources/application.properties b/mvc & api/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/mvc & api/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/mvc & api/resources/templates/hello.html b/mvc & api/resources/templates/hello.html deleted file mode 100644 index 06edf9b..0000000 --- a/mvc & api/resources/templates/hello.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - Hello - - - -

안녕하세요. 손님

- - \ No newline at end of file From 025116e062a8c3e20ef16ff6980210b382349a2a Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 02:52:15 +0900 Subject: [PATCH 23/43] Delete mvc & api/java/hello/hellospring directory --- .../hellospring/HelloSpringApplication.java | 13 ----- .../controller/HelloController.java | 49 ------------------- 2 files changed, 62 deletions(-) delete mode 100644 mvc & api/java/hello/hellospring/HelloSpringApplication.java delete mode 100644 mvc & api/java/hello/hellospring/controller/HelloController.java diff --git a/mvc & api/java/hello/hellospring/HelloSpringApplication.java b/mvc & api/java/hello/hellospring/HelloSpringApplication.java deleted file mode 100644 index f0f0fd4..0000000 --- a/mvc & api/java/hello/hellospring/HelloSpringApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package hello.hellospring; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class HelloSpringApplication { - - public static void main(String[] args) { - SpringApplication.run(HelloSpringApplication.class, args); - } - -} diff --git a/mvc & api/java/hello/hellospring/controller/HelloController.java b/mvc & api/java/hello/hellospring/controller/HelloController.java deleted file mode 100644 index 35d01f6..0000000 --- a/mvc & api/java/hello/hellospring/controller/HelloController.java +++ /dev/null @@ -1,49 +0,0 @@ -package hello.hellospring.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -public class HelloController { - - @GetMapping("hello") - public String hello(Model model) { - model.addAttribute("data", "hello!!"); - return "hello"; - } - - @GetMapping("hello-mvc") - public String helloMvc(@RequestParam("name") String str, Model model) { - //@RequestParam(value = "name", required = false - model.addAttribute("data", str); - return "hello"; - } - - @GetMapping("hello-api-str") - @ResponseBody - public String helloString(@RequestParam("name") String str) { - return str; - } - - @GetMapping("hello-api-json") - @ResponseBody - public Hello helloApi(@RequestParam("name") String str) { - Hello hello = new Hello(); - hello.setName(str); - return hello; - } - static class Hello { - private String name; - - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - //단축키 alt + insert - } -} From ed736b7d8c4ca54da64a114668a3177627683f8b Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:09:09 +0900 Subject: [PATCH 24/43] Create README.md --- memory/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 memory/README.md diff --git a/memory/README.md b/memory/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/memory/README.md @@ -0,0 +1 @@ + From e1b49d5e97f97370706210ce341b4393ef6d93c7 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:10:07 +0900 Subject: [PATCH 25/43] Update README.md --- memory/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/memory/README.md b/memory/README.md index 8b13789..938a793 100644 --- a/memory/README.md +++ b/memory/README.md @@ -1 +1,3 @@ +![image](https://user-images.githubusercontent.com/101636590/215353139-3a29a907-0178-4abe-bce2-86fb3af8c065.png) +정리 https://khs20010327.tistory.com/131 From 43710dcdb7989da30cf06f37e221bc5d44d68772 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:12:12 +0900 Subject: [PATCH 26/43] Add files via upload --- .../hellospring/HelloSpringApplication.java | 13 +++++ memory/hellospring/SpringConfig.java | 18 +++++++ .../controller/MemberController.java | 53 +++++++++++++++++++ memory/hellospring/domain/Member.java | 19 +++++++ .../repository/MemberRepository.java | 13 +++++ .../repository/MemoryRepository.java | 39 ++++++++++++++ memory/hellospring/service/MemberService.java | 36 +++++++++++++ 7 files changed, 191 insertions(+) create mode 100644 memory/hellospring/HelloSpringApplication.java create mode 100644 memory/hellospring/SpringConfig.java create mode 100644 memory/hellospring/controller/MemberController.java create mode 100644 memory/hellospring/domain/Member.java create mode 100644 memory/hellospring/repository/MemberRepository.java create mode 100644 memory/hellospring/repository/MemoryRepository.java create mode 100644 memory/hellospring/service/MemberService.java diff --git a/memory/hellospring/HelloSpringApplication.java b/memory/hellospring/HelloSpringApplication.java new file mode 100644 index 0000000..f0f0fd4 --- /dev/null +++ b/memory/hellospring/HelloSpringApplication.java @@ -0,0 +1,13 @@ +package hello.hellospring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HelloSpringApplication { + + public static void main(String[] args) { + SpringApplication.run(HelloSpringApplication.class, args); + } + +} diff --git a/memory/hellospring/SpringConfig.java b/memory/hellospring/SpringConfig.java new file mode 100644 index 0000000..85a1f76 --- /dev/null +++ b/memory/hellospring/SpringConfig.java @@ -0,0 +1,18 @@ +package hello.hellospring; +import hello.hellospring.repository.MemberRepository; +import hello.hellospring.repository.MemoryRepository; +import hello.hellospring.service.MemberService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +@Configuration +public class SpringConfig { + + @Bean + public MemberService memberService() { + return new MemberService(memberRepository()); + } + @Bean + public MemberRepository memberRepository() { + return new MemoryRepository(); + } +} \ No newline at end of file diff --git a/memory/hellospring/controller/MemberController.java b/memory/hellospring/controller/MemberController.java new file mode 100644 index 0000000..60709f6 --- /dev/null +++ b/memory/hellospring/controller/MemberController.java @@ -0,0 +1,53 @@ +package hello.hellospring.controller; +import hello.hellospring.domain.Member; +import hello.hellospring.service.MemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.List; + +@Controller +public class MemberController { + + @GetMapping("/") + public String home() { + return "home"; + } + + + private final MemberService memberService; + @Autowired + public MemberController(MemberService memberService) { + this.memberService = memberService; + } + + @GetMapping(value = "/members/new") + public String createForm() { + return "newMember"; + } + public class MemberForm { + private String name; + public String getName() { return name; } + public void setName(String name) { this.name = name; } + } + + @PostMapping(value = "/members/new") + public String create(MemberForm form) { + Member member = new Member(); + member.setName(form.getName()); + memberService.join(member); + return "redirect:/"; + } + + @GetMapping(value = "/members") + public String list(Model model) { + List members = memberService.findMembers(); + model.addAttribute("members", members); + return "memberList"; + } +} + + diff --git a/memory/hellospring/domain/Member.java b/memory/hellospring/domain/Member.java new file mode 100644 index 0000000..e4eec13 --- /dev/null +++ b/memory/hellospring/domain/Member.java @@ -0,0 +1,19 @@ +package hello.hellospring.domain; + +public class Member { + private Long id; + private String name; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} + diff --git a/memory/hellospring/repository/MemberRepository.java b/memory/hellospring/repository/MemberRepository.java new file mode 100644 index 0000000..5a6a6f3 --- /dev/null +++ b/memory/hellospring/repository/MemberRepository.java @@ -0,0 +1,13 @@ +package hello.hellospring.repository; + +import hello.hellospring.domain.Member; +import java.util.List; +import java.util.Optional; + +public interface MemberRepository { + Member save(Member member); + Optional findById(Long id); + Optional findByName(String name); + //optional = Null일 수 있는 변수를 감싸는 Wrapper 클래스 + List findAll(); +} \ No newline at end of file diff --git a/memory/hellospring/repository/MemoryRepository.java b/memory/hellospring/repository/MemoryRepository.java new file mode 100644 index 0000000..e27594f --- /dev/null +++ b/memory/hellospring/repository/MemoryRepository.java @@ -0,0 +1,39 @@ +package hello.hellospring.repository; +import hello.hellospring.domain.Member; +import java.util.*; + +//@Repository +public class MemoryRepository implements MemberRepository { + private static Map store = new HashMap<>(); + //동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려 + private static long sequence = 0L; + + @Override + public Member save(Member member) { + member.setId(++sequence); //auto increment + store.put(member.getId(), member); + return member; + } + @Override + public Optional findById(Long id) { + return Optional.ofNullable(store.get(id)); + //optional = Null일 수 있는 변수를 감싸는 Wrapper 클래스 + //Null이면 Optinal.empty()가 리턴됨 + } + @Override + public List findAll() { + return new ArrayList<>(store.values()); + //map을 list로 반환 + } + @Override + public Optional findByName(String name) { + return store.values().stream() //store의 value로 반복문을 돌림 + .filter(member -> member.getName().equals(name)) + //map에 저장된 member의 이름중 인자로 받은 name과 동일한 값이 있는지 체크 + .findAny(); + //하나라도 찾으면 종료 + } + public void clearStore() { + store.clear(); + } +} \ No newline at end of file diff --git a/memory/hellospring/service/MemberService.java b/memory/hellospring/service/MemberService.java new file mode 100644 index 0000000..bb80888 --- /dev/null +++ b/memory/hellospring/service/MemberService.java @@ -0,0 +1,36 @@ +package hello.hellospring.service; + +import hello.hellospring.domain.Member; +import hello.hellospring.repository.MemberRepository; +import hello.hellospring.repository.MemoryRepository; + +import java.util.List; +import java.util.Optional; + +//@service +public class MemberService { + //private final MemberRepository memberRepository = new MemoryRepository(); + private final MemberRepository memberRepository; + //@Autowired + public MemberService(MemberRepository memberRepository) { //의존관계 추가 + this.memberRepository = memberRepository; + } + public Long join(Member member) { // 회원가입 + validateDuplicateMember(member); //중복 회원 체크 + memberRepository.save(member); + return member.getId(); + } + private void validateDuplicateMember(Member member) { + memberRepository.findByName(member.getName()) + .ifPresent(m -> { //optinal 값이 null이 아니면 + throw new IllegalStateException("이미 존재하는 회원입니다."); + }); + } + + public List findMembers() { //전체 회원 조회 + return memberRepository.findAll(); + } + public Optional findOne(Long memberId) { + return memberRepository.findById(memberId); + } +} \ No newline at end of file From 7b7e82343ae65a740cbb4831d37fbbeec65125ae Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:12:58 +0900 Subject: [PATCH 27/43] Add files via upload --- memory/templates/home.html | 15 +++++ memory/templates/memberList.html | 23 ++++++++ memory/templates/newMember.html | 15 +++++ memory/test/HelloSpringApplicationTests.java | 13 +++++ .../test/repository/MemoryRepositoryTest.java | 58 +++++++++++++++++++ memory/test/service/MemberServiceTest.java | 51 ++++++++++++++++ 6 files changed, 175 insertions(+) create mode 100644 memory/templates/home.html create mode 100644 memory/templates/memberList.html create mode 100644 memory/templates/newMember.html create mode 100644 memory/test/HelloSpringApplicationTests.java create mode 100644 memory/test/repository/MemoryRepositoryTest.java create mode 100644 memory/test/service/MemberServiceTest.java diff --git a/memory/templates/home.html b/memory/templates/home.html new file mode 100644 index 0000000..f425b7a --- /dev/null +++ b/memory/templates/home.html @@ -0,0 +1,15 @@ + + + +
+ + \ No newline at end of file diff --git a/memory/templates/memberList.html b/memory/templates/memberList.html new file mode 100644 index 0000000..ca39975 --- /dev/null +++ b/memory/templates/memberList.html @@ -0,0 +1,23 @@ + + + +
+
+ + + + + + + + + + + + + +
#이름
+
+
+ + \ No newline at end of file diff --git a/memory/templates/newMember.html b/memory/templates/newMember.html new file mode 100644 index 0000000..5d91074 --- /dev/null +++ b/memory/templates/newMember.html @@ -0,0 +1,15 @@ + + + +
+
+
+ + +
+ +
+
+ + \ No newline at end of file diff --git a/memory/test/HelloSpringApplicationTests.java b/memory/test/HelloSpringApplicationTests.java new file mode 100644 index 0000000..87d37cf --- /dev/null +++ b/memory/test/HelloSpringApplicationTests.java @@ -0,0 +1,13 @@ +package hello.hellospring; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class HelloSpringApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/memory/test/repository/MemoryRepositoryTest.java b/memory/test/repository/MemoryRepositoryTest.java new file mode 100644 index 0000000..28b915f --- /dev/null +++ b/memory/test/repository/MemoryRepositoryTest.java @@ -0,0 +1,58 @@ +package hello.hellospring.repository; +import hello.hellospring.domain.Member; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import java.util.List; +import java.util.Optional; +import static org.assertj.core.api.Assertions.*; +//Assertions를 전역변수로 + +class MemoryRepositoryTest { + MemoryRepository repository = new MemoryRepository(); + @AfterEach + //각 테스트가 끝날떄마다 수행됨 + public void afterEach() { + repository.clearStore(); + } + + @Test + public void save() { +//given + Member member = new Member(); + member.setName("spring"); +//when + repository.save(member); +//then + Member result = repository.findById(member.getId()).get(); + assertThat(result).isEqualTo(member); + //Assertions.assertThat() + } + @Test + public void findByName() { +//given + Member member1 = new Member(); + member1.setName("spring1"); + repository.save(member1); + Member member2 = new Member(); + member2.setName("spring2"); + repository.save(member2); +//when + Member result = repository.findByName("spring1").get(); +//then + assertThat(result).isEqualTo(member1); + } + @Test + public void findAll() { +//given + Member member1 = new Member(); + member1.setName("spring1"); + repository.save(member1); + Member member2 = new Member(); + member2.setName("spring2"); + repository.save(member2); +//when + List result = repository.findAll(); +//then + assertThat(result.size()).isEqualTo(2); + } +} \ No newline at end of file diff --git a/memory/test/service/MemberServiceTest.java b/memory/test/service/MemberServiceTest.java new file mode 100644 index 0000000..6de7593 --- /dev/null +++ b/memory/test/service/MemberServiceTest.java @@ -0,0 +1,51 @@ +package hello.hellospring.service; +import hello.hellospring.domain.Member; +import hello.hellospring.repository.MemoryRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +class MemberServiceTest { // ctrl + shift + T + MemberService memberService; + MemoryRepository memberRepository; + + @BeforeEach + public void beforeEach() { + memberRepository = new MemoryRepository(); + memberService = new MemberService(memberRepository); + } + @AfterEach + public void afterEach() { + memberRepository.clearStore(); + } + @Test + public void 회원가입() throws Exception { +//Given + Member member = new Member(); + member.setName("hello"); + //멤버 생성 +//When + Long saveId = memberService.join(member); + //멤버 삽입 +//Then + Member findMember = memberRepository.findById(saveId).get(); + assertEquals(member.getName(), findMember.getName()); + //생성한 멤버 name과 데이터베이스에 삽입 후 findById로 찾은 name이 같은지 체크 + } + @Test + public void 중복_회원_예외() throws Exception { +//Given + Member member1 = new Member(); + member1.setName("spring"); + Member member2 = new Member(); + member2.setName("spring"); + //When + memberService.join(member1); + IllegalStateException e = assertThrows(IllegalStateException.class, + () -> memberService.join(member2));//예외가 발생해야 한다. + assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); + //try catch 간략화 + } +} \ No newline at end of file From 70a7425e97ae74af10f1d345da2623f581aa565e Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:14:51 +0900 Subject: [PATCH 28/43] Delete memory/hellospring directory --- .../hellospring/HelloSpringApplication.java | 13 ----- memory/hellospring/SpringConfig.java | 18 ------- .../controller/MemberController.java | 53 ------------------- memory/hellospring/domain/Member.java | 19 ------- .../repository/MemberRepository.java | 13 ----- .../repository/MemoryRepository.java | 39 -------------- memory/hellospring/service/MemberService.java | 36 ------------- 7 files changed, 191 deletions(-) delete mode 100644 memory/hellospring/HelloSpringApplication.java delete mode 100644 memory/hellospring/SpringConfig.java delete mode 100644 memory/hellospring/controller/MemberController.java delete mode 100644 memory/hellospring/domain/Member.java delete mode 100644 memory/hellospring/repository/MemberRepository.java delete mode 100644 memory/hellospring/repository/MemoryRepository.java delete mode 100644 memory/hellospring/service/MemberService.java diff --git a/memory/hellospring/HelloSpringApplication.java b/memory/hellospring/HelloSpringApplication.java deleted file mode 100644 index f0f0fd4..0000000 --- a/memory/hellospring/HelloSpringApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package hello.hellospring; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class HelloSpringApplication { - - public static void main(String[] args) { - SpringApplication.run(HelloSpringApplication.class, args); - } - -} diff --git a/memory/hellospring/SpringConfig.java b/memory/hellospring/SpringConfig.java deleted file mode 100644 index 85a1f76..0000000 --- a/memory/hellospring/SpringConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package hello.hellospring; -import hello.hellospring.repository.MemberRepository; -import hello.hellospring.repository.MemoryRepository; -import hello.hellospring.service.MemberService; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -@Configuration -public class SpringConfig { - - @Bean - public MemberService memberService() { - return new MemberService(memberRepository()); - } - @Bean - public MemberRepository memberRepository() { - return new MemoryRepository(); - } -} \ No newline at end of file diff --git a/memory/hellospring/controller/MemberController.java b/memory/hellospring/controller/MemberController.java deleted file mode 100644 index 60709f6..0000000 --- a/memory/hellospring/controller/MemberController.java +++ /dev/null @@ -1,53 +0,0 @@ -package hello.hellospring.controller; -import hello.hellospring.domain.Member; -import hello.hellospring.service.MemberService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; - -import java.util.List; - -@Controller -public class MemberController { - - @GetMapping("/") - public String home() { - return "home"; - } - - - private final MemberService memberService; - @Autowired - public MemberController(MemberService memberService) { - this.memberService = memberService; - } - - @GetMapping(value = "/members/new") - public String createForm() { - return "newMember"; - } - public class MemberForm { - private String name; - public String getName() { return name; } - public void setName(String name) { this.name = name; } - } - - @PostMapping(value = "/members/new") - public String create(MemberForm form) { - Member member = new Member(); - member.setName(form.getName()); - memberService.join(member); - return "redirect:/"; - } - - @GetMapping(value = "/members") - public String list(Model model) { - List members = memberService.findMembers(); - model.addAttribute("members", members); - return "memberList"; - } -} - - diff --git a/memory/hellospring/domain/Member.java b/memory/hellospring/domain/Member.java deleted file mode 100644 index e4eec13..0000000 --- a/memory/hellospring/domain/Member.java +++ /dev/null @@ -1,19 +0,0 @@ -package hello.hellospring.domain; - -public class Member { - private Long id; - private String name; - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } -} - diff --git a/memory/hellospring/repository/MemberRepository.java b/memory/hellospring/repository/MemberRepository.java deleted file mode 100644 index 5a6a6f3..0000000 --- a/memory/hellospring/repository/MemberRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package hello.hellospring.repository; - -import hello.hellospring.domain.Member; -import java.util.List; -import java.util.Optional; - -public interface MemberRepository { - Member save(Member member); - Optional findById(Long id); - Optional findByName(String name); - //optional = Null일 수 있는 변수를 감싸는 Wrapper 클래스 - List findAll(); -} \ No newline at end of file diff --git a/memory/hellospring/repository/MemoryRepository.java b/memory/hellospring/repository/MemoryRepository.java deleted file mode 100644 index e27594f..0000000 --- a/memory/hellospring/repository/MemoryRepository.java +++ /dev/null @@ -1,39 +0,0 @@ -package hello.hellospring.repository; -import hello.hellospring.domain.Member; -import java.util.*; - -//@Repository -public class MemoryRepository implements MemberRepository { - private static Map store = new HashMap<>(); - //동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려 - private static long sequence = 0L; - - @Override - public Member save(Member member) { - member.setId(++sequence); //auto increment - store.put(member.getId(), member); - return member; - } - @Override - public Optional findById(Long id) { - return Optional.ofNullable(store.get(id)); - //optional = Null일 수 있는 변수를 감싸는 Wrapper 클래스 - //Null이면 Optinal.empty()가 리턴됨 - } - @Override - public List findAll() { - return new ArrayList<>(store.values()); - //map을 list로 반환 - } - @Override - public Optional findByName(String name) { - return store.values().stream() //store의 value로 반복문을 돌림 - .filter(member -> member.getName().equals(name)) - //map에 저장된 member의 이름중 인자로 받은 name과 동일한 값이 있는지 체크 - .findAny(); - //하나라도 찾으면 종료 - } - public void clearStore() { - store.clear(); - } -} \ No newline at end of file diff --git a/memory/hellospring/service/MemberService.java b/memory/hellospring/service/MemberService.java deleted file mode 100644 index bb80888..0000000 --- a/memory/hellospring/service/MemberService.java +++ /dev/null @@ -1,36 +0,0 @@ -package hello.hellospring.service; - -import hello.hellospring.domain.Member; -import hello.hellospring.repository.MemberRepository; -import hello.hellospring.repository.MemoryRepository; - -import java.util.List; -import java.util.Optional; - -//@service -public class MemberService { - //private final MemberRepository memberRepository = new MemoryRepository(); - private final MemberRepository memberRepository; - //@Autowired - public MemberService(MemberRepository memberRepository) { //의존관계 추가 - this.memberRepository = memberRepository; - } - public Long join(Member member) { // 회원가입 - validateDuplicateMember(member); //중복 회원 체크 - memberRepository.save(member); - return member.getId(); - } - private void validateDuplicateMember(Member member) { - memberRepository.findByName(member.getName()) - .ifPresent(m -> { //optinal 값이 null이 아니면 - throw new IllegalStateException("이미 존재하는 회원입니다."); - }); - } - - public List findMembers() { //전체 회원 조회 - return memberRepository.findAll(); - } - public Optional findOne(Long memberId) { - return memberRepository.findById(memberId); - } -} \ No newline at end of file From 8052680bb440cbc31100460c6056f99e19b151a8 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:15:23 +0900 Subject: [PATCH 29/43] Add files via upload --- memory/test/MemberServiceTest.java | 51 +++++++++++++++++++++++ memory/test/MemoryRepositoryTest.java | 58 +++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 memory/test/MemberServiceTest.java create mode 100644 memory/test/MemoryRepositoryTest.java diff --git a/memory/test/MemberServiceTest.java b/memory/test/MemberServiceTest.java new file mode 100644 index 0000000..6de7593 --- /dev/null +++ b/memory/test/MemberServiceTest.java @@ -0,0 +1,51 @@ +package hello.hellospring.service; +import hello.hellospring.domain.Member; +import hello.hellospring.repository.MemoryRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +class MemberServiceTest { // ctrl + shift + T + MemberService memberService; + MemoryRepository memberRepository; + + @BeforeEach + public void beforeEach() { + memberRepository = new MemoryRepository(); + memberService = new MemberService(memberRepository); + } + @AfterEach + public void afterEach() { + memberRepository.clearStore(); + } + @Test + public void 회원가입() throws Exception { +//Given + Member member = new Member(); + member.setName("hello"); + //멤버 생성 +//When + Long saveId = memberService.join(member); + //멤버 삽입 +//Then + Member findMember = memberRepository.findById(saveId).get(); + assertEquals(member.getName(), findMember.getName()); + //생성한 멤버 name과 데이터베이스에 삽입 후 findById로 찾은 name이 같은지 체크 + } + @Test + public void 중복_회원_예외() throws Exception { +//Given + Member member1 = new Member(); + member1.setName("spring"); + Member member2 = new Member(); + member2.setName("spring"); + //When + memberService.join(member1); + IllegalStateException e = assertThrows(IllegalStateException.class, + () -> memberService.join(member2));//예외가 발생해야 한다. + assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); + //try catch 간략화 + } +} \ No newline at end of file diff --git a/memory/test/MemoryRepositoryTest.java b/memory/test/MemoryRepositoryTest.java new file mode 100644 index 0000000..28b915f --- /dev/null +++ b/memory/test/MemoryRepositoryTest.java @@ -0,0 +1,58 @@ +package hello.hellospring.repository; +import hello.hellospring.domain.Member; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import java.util.List; +import java.util.Optional; +import static org.assertj.core.api.Assertions.*; +//Assertions를 전역변수로 + +class MemoryRepositoryTest { + MemoryRepository repository = new MemoryRepository(); + @AfterEach + //각 테스트가 끝날떄마다 수행됨 + public void afterEach() { + repository.clearStore(); + } + + @Test + public void save() { +//given + Member member = new Member(); + member.setName("spring"); +//when + repository.save(member); +//then + Member result = repository.findById(member.getId()).get(); + assertThat(result).isEqualTo(member); + //Assertions.assertThat() + } + @Test + public void findByName() { +//given + Member member1 = new Member(); + member1.setName("spring1"); + repository.save(member1); + Member member2 = new Member(); + member2.setName("spring2"); + repository.save(member2); +//when + Member result = repository.findByName("spring1").get(); +//then + assertThat(result).isEqualTo(member1); + } + @Test + public void findAll() { +//given + Member member1 = new Member(); + member1.setName("spring1"); + repository.save(member1); + Member member2 = new Member(); + member2.setName("spring2"); + repository.save(member2); +//when + List result = repository.findAll(); +//then + assertThat(result.size()).isEqualTo(2); + } +} \ No newline at end of file From 9ce407789bb14ff9fba89825aedf3889c9a82964 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:15:32 +0900 Subject: [PATCH 30/43] Delete HelloSpringApplicationTests.java --- memory/test/HelloSpringApplicationTests.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 memory/test/HelloSpringApplicationTests.java diff --git a/memory/test/HelloSpringApplicationTests.java b/memory/test/HelloSpringApplicationTests.java deleted file mode 100644 index 87d37cf..0000000 --- a/memory/test/HelloSpringApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package hello.hellospring; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class HelloSpringApplicationTests { - - @Test - void contextLoads() { - } - -} From 96c899b1f6c6a9c2055cfee2c8e91f7cad40f48b Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:15:39 +0900 Subject: [PATCH 31/43] Delete memory/test/service directory --- memory/test/service/MemberServiceTest.java | 51 ---------------------- 1 file changed, 51 deletions(-) delete mode 100644 memory/test/service/MemberServiceTest.java diff --git a/memory/test/service/MemberServiceTest.java b/memory/test/service/MemberServiceTest.java deleted file mode 100644 index 6de7593..0000000 --- a/memory/test/service/MemberServiceTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package hello.hellospring.service; -import hello.hellospring.domain.Member; -import hello.hellospring.repository.MemoryRepository; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; - -class MemberServiceTest { // ctrl + shift + T - MemberService memberService; - MemoryRepository memberRepository; - - @BeforeEach - public void beforeEach() { - memberRepository = new MemoryRepository(); - memberService = new MemberService(memberRepository); - } - @AfterEach - public void afterEach() { - memberRepository.clearStore(); - } - @Test - public void 회원가입() throws Exception { -//Given - Member member = new Member(); - member.setName("hello"); - //멤버 생성 -//When - Long saveId = memberService.join(member); - //멤버 삽입 -//Then - Member findMember = memberRepository.findById(saveId).get(); - assertEquals(member.getName(), findMember.getName()); - //생성한 멤버 name과 데이터베이스에 삽입 후 findById로 찾은 name이 같은지 체크 - } - @Test - public void 중복_회원_예외() throws Exception { -//Given - Member member1 = new Member(); - member1.setName("spring"); - Member member2 = new Member(); - member2.setName("spring"); - //When - memberService.join(member1); - IllegalStateException e = assertThrows(IllegalStateException.class, - () -> memberService.join(member2));//예외가 발생해야 한다. - assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); - //try catch 간략화 - } -} \ No newline at end of file From f168fcc7d75720a9a63202e6668297c21a392f12 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:15:45 +0900 Subject: [PATCH 32/43] Delete memory/test/repository directory --- .../test/repository/MemoryRepositoryTest.java | 58 ------------------- 1 file changed, 58 deletions(-) delete mode 100644 memory/test/repository/MemoryRepositoryTest.java diff --git a/memory/test/repository/MemoryRepositoryTest.java b/memory/test/repository/MemoryRepositoryTest.java deleted file mode 100644 index 28b915f..0000000 --- a/memory/test/repository/MemoryRepositoryTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package hello.hellospring.repository; -import hello.hellospring.domain.Member; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import java.util.List; -import java.util.Optional; -import static org.assertj.core.api.Assertions.*; -//Assertions를 전역변수로 - -class MemoryRepositoryTest { - MemoryRepository repository = new MemoryRepository(); - @AfterEach - //각 테스트가 끝날떄마다 수행됨 - public void afterEach() { - repository.clearStore(); - } - - @Test - public void save() { -//given - Member member = new Member(); - member.setName("spring"); -//when - repository.save(member); -//then - Member result = repository.findById(member.getId()).get(); - assertThat(result).isEqualTo(member); - //Assertions.assertThat() - } - @Test - public void findByName() { -//given - Member member1 = new Member(); - member1.setName("spring1"); - repository.save(member1); - Member member2 = new Member(); - member2.setName("spring2"); - repository.save(member2); -//when - Member result = repository.findByName("spring1").get(); -//then - assertThat(result).isEqualTo(member1); - } - @Test - public void findAll() { -//given - Member member1 = new Member(); - member1.setName("spring1"); - repository.save(member1); - Member member2 = new Member(); - member2.setName("spring2"); - repository.save(member2); -//when - List result = repository.findAll(); -//then - assertThat(result.size()).isEqualTo(2); - } -} \ No newline at end of file From 867f5b1c10f3305f7beb2009998420d751980d80 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:16:16 +0900 Subject: [PATCH 33/43] Create a --- memory/main/a | 1 + 1 file changed, 1 insertion(+) create mode 100644 memory/main/a diff --git a/memory/main/a b/memory/main/a new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/memory/main/a @@ -0,0 +1 @@ + From f5658099269b182dd66b0e05afd567141af72159 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:16:47 +0900 Subject: [PATCH 34/43] Add files via upload --- memory/main/Member.java | 19 +++++++++++ memory/main/MemberController.java | 53 +++++++++++++++++++++++++++++++ memory/main/MemberRepository.java | 13 ++++++++ memory/main/MemberService.java | 36 +++++++++++++++++++++ memory/main/MemoryRepository.java | 39 +++++++++++++++++++++++ memory/main/SpringConfig.java | 18 +++++++++++ 6 files changed, 178 insertions(+) create mode 100644 memory/main/Member.java create mode 100644 memory/main/MemberController.java create mode 100644 memory/main/MemberRepository.java create mode 100644 memory/main/MemberService.java create mode 100644 memory/main/MemoryRepository.java create mode 100644 memory/main/SpringConfig.java diff --git a/memory/main/Member.java b/memory/main/Member.java new file mode 100644 index 0000000..e4eec13 --- /dev/null +++ b/memory/main/Member.java @@ -0,0 +1,19 @@ +package hello.hellospring.domain; + +public class Member { + private Long id; + private String name; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} + diff --git a/memory/main/MemberController.java b/memory/main/MemberController.java new file mode 100644 index 0000000..60709f6 --- /dev/null +++ b/memory/main/MemberController.java @@ -0,0 +1,53 @@ +package hello.hellospring.controller; +import hello.hellospring.domain.Member; +import hello.hellospring.service.MemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.List; + +@Controller +public class MemberController { + + @GetMapping("/") + public String home() { + return "home"; + } + + + private final MemberService memberService; + @Autowired + public MemberController(MemberService memberService) { + this.memberService = memberService; + } + + @GetMapping(value = "/members/new") + public String createForm() { + return "newMember"; + } + public class MemberForm { + private String name; + public String getName() { return name; } + public void setName(String name) { this.name = name; } + } + + @PostMapping(value = "/members/new") + public String create(MemberForm form) { + Member member = new Member(); + member.setName(form.getName()); + memberService.join(member); + return "redirect:/"; + } + + @GetMapping(value = "/members") + public String list(Model model) { + List members = memberService.findMembers(); + model.addAttribute("members", members); + return "memberList"; + } +} + + diff --git a/memory/main/MemberRepository.java b/memory/main/MemberRepository.java new file mode 100644 index 0000000..5a6a6f3 --- /dev/null +++ b/memory/main/MemberRepository.java @@ -0,0 +1,13 @@ +package hello.hellospring.repository; + +import hello.hellospring.domain.Member; +import java.util.List; +import java.util.Optional; + +public interface MemberRepository { + Member save(Member member); + Optional findById(Long id); + Optional findByName(String name); + //optional = Null일 수 있는 변수를 감싸는 Wrapper 클래스 + List findAll(); +} \ No newline at end of file diff --git a/memory/main/MemberService.java b/memory/main/MemberService.java new file mode 100644 index 0000000..bb80888 --- /dev/null +++ b/memory/main/MemberService.java @@ -0,0 +1,36 @@ +package hello.hellospring.service; + +import hello.hellospring.domain.Member; +import hello.hellospring.repository.MemberRepository; +import hello.hellospring.repository.MemoryRepository; + +import java.util.List; +import java.util.Optional; + +//@service +public class MemberService { + //private final MemberRepository memberRepository = new MemoryRepository(); + private final MemberRepository memberRepository; + //@Autowired + public MemberService(MemberRepository memberRepository) { //의존관계 추가 + this.memberRepository = memberRepository; + } + public Long join(Member member) { // 회원가입 + validateDuplicateMember(member); //중복 회원 체크 + memberRepository.save(member); + return member.getId(); + } + private void validateDuplicateMember(Member member) { + memberRepository.findByName(member.getName()) + .ifPresent(m -> { //optinal 값이 null이 아니면 + throw new IllegalStateException("이미 존재하는 회원입니다."); + }); + } + + public List findMembers() { //전체 회원 조회 + return memberRepository.findAll(); + } + public Optional findOne(Long memberId) { + return memberRepository.findById(memberId); + } +} \ No newline at end of file diff --git a/memory/main/MemoryRepository.java b/memory/main/MemoryRepository.java new file mode 100644 index 0000000..e27594f --- /dev/null +++ b/memory/main/MemoryRepository.java @@ -0,0 +1,39 @@ +package hello.hellospring.repository; +import hello.hellospring.domain.Member; +import java.util.*; + +//@Repository +public class MemoryRepository implements MemberRepository { + private static Map store = new HashMap<>(); + //동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려 + private static long sequence = 0L; + + @Override + public Member save(Member member) { + member.setId(++sequence); //auto increment + store.put(member.getId(), member); + return member; + } + @Override + public Optional findById(Long id) { + return Optional.ofNullable(store.get(id)); + //optional = Null일 수 있는 변수를 감싸는 Wrapper 클래스 + //Null이면 Optinal.empty()가 리턴됨 + } + @Override + public List findAll() { + return new ArrayList<>(store.values()); + //map을 list로 반환 + } + @Override + public Optional findByName(String name) { + return store.values().stream() //store의 value로 반복문을 돌림 + .filter(member -> member.getName().equals(name)) + //map에 저장된 member의 이름중 인자로 받은 name과 동일한 값이 있는지 체크 + .findAny(); + //하나라도 찾으면 종료 + } + public void clearStore() { + store.clear(); + } +} \ No newline at end of file diff --git a/memory/main/SpringConfig.java b/memory/main/SpringConfig.java new file mode 100644 index 0000000..85a1f76 --- /dev/null +++ b/memory/main/SpringConfig.java @@ -0,0 +1,18 @@ +package hello.hellospring; +import hello.hellospring.repository.MemberRepository; +import hello.hellospring.repository.MemoryRepository; +import hello.hellospring.service.MemberService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +@Configuration +public class SpringConfig { + + @Bean + public MemberService memberService() { + return new MemberService(memberRepository()); + } + @Bean + public MemberRepository memberRepository() { + return new MemoryRepository(); + } +} \ No newline at end of file From 00d86ebc694919a9ffda33e29b119002147943ae Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 05:16:56 +0900 Subject: [PATCH 35/43] Delete a --- memory/main/a | 1 - 1 file changed, 1 deletion(-) delete mode 100644 memory/main/a diff --git a/memory/main/a b/memory/main/a deleted file mode 100644 index 8b13789..0000000 --- a/memory/main/a +++ /dev/null @@ -1 +0,0 @@ - From 7316e59826e6ee6658fa8b6fdd39d01aeb5e7020 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 06:27:35 +0900 Subject: [PATCH 36/43] Create README.md --- JPA/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 JPA/README.md diff --git a/JPA/README.md b/JPA/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/JPA/README.md @@ -0,0 +1 @@ + From 7d54bb4296a6df287c0dc6572db2effb6c65dfe5 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 06:28:29 +0900 Subject: [PATCH 37/43] Create a --- JPA/Main/a | 1 + 1 file changed, 1 insertion(+) create mode 100644 JPA/Main/a diff --git a/JPA/Main/a b/JPA/Main/a new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/JPA/Main/a @@ -0,0 +1 @@ + From 8e444b50c5944813ed2d18ce1e8f1b6f4aca0a32 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 06:28:53 +0900 Subject: [PATCH 38/43] Delete a --- JPA/Main/a | 1 - 1 file changed, 1 deletion(-) delete mode 100644 JPA/Main/a diff --git a/JPA/Main/a b/JPA/Main/a deleted file mode 100644 index 8b13789..0000000 --- a/JPA/Main/a +++ /dev/null @@ -1 +0,0 @@ - From 5e82f7709ebb1c8a1d15b9cb66a32bae81f11531 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 06:29:50 +0900 Subject: [PATCH 39/43] Add files via upload --- JPA/Member.java | 26 ++++++++++++++++++++++++++ JPA/SpringConfig.java | 21 +++++++++++++++++++++ JPA/SpringDataJpaMemberRepository.java | 8 ++++++++ 3 files changed, 55 insertions(+) create mode 100644 JPA/Member.java create mode 100644 JPA/SpringConfig.java create mode 100644 JPA/SpringDataJpaMemberRepository.java diff --git a/JPA/Member.java b/JPA/Member.java new file mode 100644 index 0000000..ae3f088 --- /dev/null +++ b/JPA/Member.java @@ -0,0 +1,26 @@ +package hello.hellospring.domain; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Member { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + //@Column(name = "username") + private String name; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } +} + diff --git a/JPA/SpringConfig.java b/JPA/SpringConfig.java new file mode 100644 index 0000000..e437080 --- /dev/null +++ b/JPA/SpringConfig.java @@ -0,0 +1,21 @@ +package hello.hellospring; +import hello.hellospring.repository.*; +import hello.hellospring.service.MemberService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +public class SpringConfig { + + private final MemberRepository memberRepository; + public SpringConfig(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + //인터페이스만 만들면 스프링이 구현체를 만들어 bean에 등록 + + @Bean + public MemberService memberService() { + return new MemberService(memberRepository); + } +} diff --git a/JPA/SpringDataJpaMemberRepository.java b/JPA/SpringDataJpaMemberRepository.java new file mode 100644 index 0000000..1bd9d92 --- /dev/null +++ b/JPA/SpringDataJpaMemberRepository.java @@ -0,0 +1,8 @@ +package hello.hellospring.repository; + +import hello.hellospring.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; +public interface SpringDataJpaMemberRepository extends JpaRepository, MemberRepository { + Optional findByName(String name); +} \ No newline at end of file From eed3762015e7f797c4607ca90e4caf8b5f4a93f7 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 06:30:42 +0900 Subject: [PATCH 40/43] Add files via upload --- JPA/application.properties | 5 +++++ JPA/build.gradle | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 JPA/application.properties create mode 100644 JPA/build.gradle diff --git a/JPA/application.properties b/JPA/application.properties new file mode 100644 index 0000000..8e34fa9 --- /dev/null +++ b/JPA/application.properties @@ -0,0 +1,5 @@ +spring.datasource.url=jdbc:h2:tcp://localhost/~/test +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=none \ No newline at end of file diff --git a/JPA/build.gradle b/JPA/build.gradle new file mode 100644 index 0000000..8049504 --- /dev/null +++ b/JPA/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '2.7.7' + id 'io.spring.dependency-management' version '1.0.15.RELEASE' +} + +group = 'hello' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + runtimeOnly 'com.h2database:h2' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('test') { + useJUnitPlatform() +} From 84ffd94069f0e2d2533ddbd6d36452c4de045955 Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Mon, 30 Jan 2023 06:31:48 +0900 Subject: [PATCH 41/43] Update README.md --- JPA/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JPA/README.md b/JPA/README.md index 8b13789..8cfa8d4 100644 --- a/JPA/README.md +++ b/JPA/README.md @@ -1 +1 @@ - +https://khs20010327.tistory.com/136 From 6fc7e9d0bc5bacd7ea2327f1b71d33160bb8656a Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Tue, 7 Feb 2023 05:54:23 +0900 Subject: [PATCH 42/43] Create README.md --- CarrotMarket/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 CarrotMarket/README.md diff --git a/CarrotMarket/README.md b/CarrotMarket/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/CarrotMarket/README.md @@ -0,0 +1 @@ + From 01fc6e0aa5312e249c06fe140f5f8d533e29a66b Mon Sep 17 00:00:00 2001 From: gillyongs <101636590+gillyongs@users.noreply.github.com> Date: Tue, 7 Feb 2023 05:55:11 +0900 Subject: [PATCH 43/43] Add files via upload --- CarrotMarket/HelloSpringApplication.java | 13 +++++++ CarrotMarket/SpringConfig.java | 29 ++++++++++++++ .../controller/CustomerController.java | 33 ++++++++++++++++ .../controller/ProductController.java | 39 +++++++++++++++++++ CarrotMarket/controller/ReactController.java | 16 ++++++++ CarrotMarket/domain/Customer.java | 33 ++++++++++++++++ CarrotMarket/domain/Product.java | 31 +++++++++++++++ .../repository/CustomerRepository.java | 14 +++++++ .../repository/ProductRepository.java | 14 +++++++ CarrotMarket/service/CustomerService.java | 33 ++++++++++++++++ CarrotMarket/service/ProductService.java | 33 ++++++++++++++++ 11 files changed, 288 insertions(+) create mode 100644 CarrotMarket/HelloSpringApplication.java create mode 100644 CarrotMarket/SpringConfig.java create mode 100644 CarrotMarket/controller/CustomerController.java create mode 100644 CarrotMarket/controller/ProductController.java create mode 100644 CarrotMarket/controller/ReactController.java create mode 100644 CarrotMarket/domain/Customer.java create mode 100644 CarrotMarket/domain/Product.java create mode 100644 CarrotMarket/repository/CustomerRepository.java create mode 100644 CarrotMarket/repository/ProductRepository.java create mode 100644 CarrotMarket/service/CustomerService.java create mode 100644 CarrotMarket/service/ProductService.java diff --git a/CarrotMarket/HelloSpringApplication.java b/CarrotMarket/HelloSpringApplication.java new file mode 100644 index 0000000..f0f0fd4 --- /dev/null +++ b/CarrotMarket/HelloSpringApplication.java @@ -0,0 +1,13 @@ +package hello.hellospring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HelloSpringApplication { + + public static void main(String[] args) { + SpringApplication.run(HelloSpringApplication.class, args); + } + +} diff --git a/CarrotMarket/SpringConfig.java b/CarrotMarket/SpringConfig.java new file mode 100644 index 0000000..2fb5b5f --- /dev/null +++ b/CarrotMarket/SpringConfig.java @@ -0,0 +1,29 @@ +package hello.hellospring; +import hello.hellospring.domain.Customer; +import hello.hellospring.repository.*; +import hello.hellospring.service.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +public class SpringConfig { + + private final ProductRepository productRepository; + private final CustomerRepository customerRepository; + public SpringConfig(ProductRepository productRepository, CustomerRepository customerRepository) { + this.customerRepository = customerRepository; + this.productRepository = productRepository; + } + //인터페이스만 만들면 스프링이 구현체를 만들어 bean에 + + @Bean + public ProductService productService() { + return new ProductService(productRepository); + } + + @Bean + public CustomerService customerService() { + return new CustomerService(customerRepository); + } +} diff --git a/CarrotMarket/controller/CustomerController.java b/CarrotMarket/controller/CustomerController.java new file mode 100644 index 0000000..324bf98 --- /dev/null +++ b/CarrotMarket/controller/CustomerController.java @@ -0,0 +1,33 @@ +package hello.hellospring.controller; + +import hello.hellospring.domain.Customer; +import hello.hellospring.service.CustomerService; +import org.apache.tomcat.util.json.JSONParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CustomerController { + + private final CustomerService customerService; + @Autowired + public CustomerController(CustomerService customerService) { + this.customerService = customerService; + } + + + + @GetMapping("new") + void join(@RequestParam("email") String em, @RequestParam("password") String ps ) { + Customer cus = new Customer(); + cus.setemail(em); + cus.setpassword(ps); + customerService.join(cus); + + } + + + +} \ No newline at end of file diff --git a/CarrotMarket/controller/ProductController.java b/CarrotMarket/controller/ProductController.java new file mode 100644 index 0000000..17e5496 --- /dev/null +++ b/CarrotMarket/controller/ProductController.java @@ -0,0 +1,39 @@ +package hello.hellospring.controller; + +import hello.hellospring.domain.Product; +import hello.hellospring.service.ProductService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class ProductController { + + private final ProductService productService; + @Autowired + public ProductController(ProductService productService) { + this.productService = productService; + } + + @GetMapping("products") + public List list() { + List products = productService.findProducts(); + return products; + } + + @GetMapping("heartclick") + void heartclick(@RequestParam("pid") Long pid) { + productService.HeartClick(pid); + } + + @GetMapping("heartunclick") + void heartunclick(@RequestParam("pid") Long pid) { + productService.HeartUnClick(pid); + } + + +} diff --git a/CarrotMarket/controller/ReactController.java b/CarrotMarket/controller/ReactController.java new file mode 100644 index 0000000..c0390c1 --- /dev/null +++ b/CarrotMarket/controller/ReactController.java @@ -0,0 +1,16 @@ +package hello.hellospring.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.List; + +@RestController +public class ReactController { + + @GetMapping("hello") + public List hello() { + return Arrays.asList("강동원","여진구","송중기"); + } +} \ No newline at end of file diff --git a/CarrotMarket/domain/Customer.java b/CarrotMarket/domain/Customer.java new file mode 100644 index 0000000..1671bac --- /dev/null +++ b/CarrotMarket/domain/Customer.java @@ -0,0 +1,33 @@ + +package hello.hellospring.domain; +import javax.persistence.*; + +@Entity +public class Customer{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long cid; + private String cname; + private String email; + private String password; + private String phone; + private String nickname; + + + public Long getcid() { return cid; } + public void setcid(Long cid) { this.cid = cid; } + public String getcname() { + return cname; + } + public void setcname(String cname) { + this.cname = cname; + } + public String getemail() {return email;} + public void setemail(String email) { this.email = email;} + public String getpassword() { return password;} + public void setpassword(String password) { this.password = password;} + public String getphone() { return phone;} + public void setphone(String phone) {this.phone = phone;} + public String getnickname() {return nickname;} + public void setnickname(String nickname) {this.nickname = nickname;} +} diff --git a/CarrotMarket/domain/Product.java b/CarrotMarket/domain/Product.java new file mode 100644 index 0000000..fddc752 --- /dev/null +++ b/CarrotMarket/domain/Product.java @@ -0,0 +1,31 @@ +package hello.hellospring.domain; + + +import javax.persistence.*; + +@Entity +public class Product{ + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long pid; + private String pname; + private Long price; + private Long heart; + private String seller; + + public Long getpid() { + return pid; + } + public void setpid(Long pid) { this.pid = pid; } + public String getpname() { + return pname; + } + public void setpname(String pname) { + this.pname = pname; + } + public String getSeller() {return seller;} + public void setSeller(String seller) { this.seller = seller;} + public Long getPrice() { return price; } + public void setPrice(Long price) { this.price = price; } + public Long getHeart() { return heart; } + public void setHeart(Long heart) { this.heart = heart; } +} \ No newline at end of file diff --git a/CarrotMarket/repository/CustomerRepository.java b/CarrotMarket/repository/CustomerRepository.java new file mode 100644 index 0000000..b2ff841 --- /dev/null +++ b/CarrotMarket/repository/CustomerRepository.java @@ -0,0 +1,14 @@ +package hello.hellospring.repository; + +import hello.hellospring.domain.Customer; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface CustomerRepository extends JpaRepository { + Customer save(Customer product); + Optional findByCname(String name); + Customer findByCid(Long pid); + List findAll(); +} diff --git a/CarrotMarket/repository/ProductRepository.java b/CarrotMarket/repository/ProductRepository.java new file mode 100644 index 0000000..b48b850 --- /dev/null +++ b/CarrotMarket/repository/ProductRepository.java @@ -0,0 +1,14 @@ +package hello.hellospring.repository; + +import hello.hellospring.domain.Product; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface ProductRepository extends JpaRepository { + Product save(Product product); + Optional findByPname(String name); + Product findByPid(Long pid); + List findAll(); +} diff --git a/CarrotMarket/service/CustomerService.java b/CarrotMarket/service/CustomerService.java new file mode 100644 index 0000000..96097e3 --- /dev/null +++ b/CarrotMarket/service/CustomerService.java @@ -0,0 +1,33 @@ +package hello.hellospring.service; + +import hello.hellospring.domain.Customer; +import hello.hellospring.repository.CustomerRepository; + + +import java.util.List; +import java.util.Optional; + +//@service +public class CustomerService { + private final CustomerRepository customerRepository; + //@Autowired + public CustomerService(CustomerRepository customerRepository) { //의존관계 추가 + this.customerRepository = customerRepository; + } + + public List findCustomers() { //전체 회원 조회 + return customerRepository.findAll(); + } + + public Long join(Customer customer) { // 회원가입 + validateDuplicateMember(customer); //중복 회원 체크 + customerRepository.save(customer); + return customer.getcid(); + } + private void validateDuplicateMember(Customer customer) { + customerRepository.findByCname(customer.getcname()) + .ifPresent(m -> { //optinal 값이 null이 아니면 + throw new IllegalStateException("이미 존재하는 회원입니다."); + }); + } +} \ No newline at end of file diff --git a/CarrotMarket/service/ProductService.java b/CarrotMarket/service/ProductService.java new file mode 100644 index 0000000..19eb774 --- /dev/null +++ b/CarrotMarket/service/ProductService.java @@ -0,0 +1,33 @@ +package hello.hellospring.service; + +import hello.hellospring.domain.Product; +import hello.hellospring.repository.ProductRepository; + + +import java.util.List; +import java.util.Optional; + +//@service +public class ProductService { + private final ProductRepository productRepository; + //@Autowired + public ProductService(ProductRepository productRepository) { //의존관계 추가 + this.productRepository = productRepository; + } + + public List findProducts() { //전체 회원 조회 + return productRepository.findAll(); + } + + public void HeartClick(Long pid) { + Product pd = productRepository.findByPid(pid); + pd.setHeart(pd.getHeart()+1); + productRepository.save(pd); + } + + public void HeartUnClick(Long pid) { + Product pd = productRepository.findByPid(pid); + pd.setHeart(pd.getHeart()-1); + productRepository.save(pd); + } +} \ No newline at end of file