From 51b5d7e8facec8955267fc609988f6791c20c18f Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:20:37 +0900 Subject: [PATCH 01/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20-=20'=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/.gitignore | 37 ++++ SpringBoot-Introduction/Lectures/Contents.md | 4 + SpringBoot-Introduction/Lectures/Lecture01.md | 95 +++++++++ SpringBoot-Introduction/build.gradle | 23 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + SpringBoot-Introduction/gradlew | 185 ++++++++++++++++++ SpringBoot-Introduction/gradlew.bat | 89 +++++++++ SpringBoot-Introduction/settings.gradle | 1 + .../SpringIntroductionApplication.java | 13 ++ .../src/main/resources/application.properties | 1 + .../SpringIntroductionApplicationTests.java | 13 ++ 12 files changed, 466 insertions(+) create mode 100644 SpringBoot-Introduction/.gitignore create mode 100644 SpringBoot-Introduction/Lectures/Contents.md create mode 100644 SpringBoot-Introduction/Lectures/Lecture01.md create mode 100644 SpringBoot-Introduction/build.gradle create mode 100644 SpringBoot-Introduction/gradle/wrapper/gradle-wrapper.jar create mode 100644 SpringBoot-Introduction/gradle/wrapper/gradle-wrapper.properties create mode 100644 SpringBoot-Introduction/gradlew create mode 100644 SpringBoot-Introduction/gradlew.bat create mode 100644 SpringBoot-Introduction/settings.gradle create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringIntroductionApplication.java create mode 100644 SpringBoot-Introduction/src/main/resources/application.properties create mode 100644 SpringBoot-Introduction/src/test/java/hello/springintroduction/SpringIntroductionApplicationTests.java diff --git a/SpringBoot-Introduction/.gitignore b/SpringBoot-Introduction/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/SpringBoot-Introduction/.gitignore @@ -0,0 +1,37 @@ +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/ diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md new file mode 100644 index 0000000..8842f69 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -0,0 +1,4 @@ +# Contents + +## 프로젝트 환경설정 +- [프로젝트 생성](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture01.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture01.md b/SpringBoot-Introduction/Lectures/Lecture01.md new file mode 100644 index 0000000..672e3bd --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture01.md @@ -0,0 +1,95 @@ +# 프로젝트 생성 + +--- + +## spring initializr +- [spring initializr](https://start.spring.io/)에서 스프링부트 기반으로 스프링 프로젝트를 만들어주는 사이트이며, 스프링이 운영하고 있다. + +--- + +## Maven, Gradle? +- 필요한 라이브러리를 가져오고 빌드하는 라이프사이클까지 관리해주는 툴이다. +- 과거에는 `Maven`을 많이 사용했으나 요즘 추세는 `Gradle`로 넘어가는 추세이다. +- 레거시 프로젝트나 과거 프로젝트는 `Maven`으로 남아있는 경우가 있다. +- 심지어 스프링 라이브러리 관리 자체도 요즘에는 `Gradle`로 넘어온 상황이다. +- 따라서 `Gradle`을 추천한다. + +--- + +## Language +- Java + +--- + +## Spring Boot +- `SNAPSHOT`은 아직 만들고 있는 버전이다 +- `M1`은 정식 릴리즈된 버전이 아니다. +- 강의상으로는 `2.3.1` 버전을 선택했으나 버전이 바뀌었을 때의 대처는 강의교재를 참고하자. + +--- + +## Project Metadata +- `Group`에 보통 기업 도메인명 같은 것들을 적어준다. +- `Artifact`는 빌드되어 나올 때의 결과물이라고 보면 된다(프로젝트명 같은 것). +- 나머지(`Name`, `Description` 등)는 그대로 둔다. + +--- + +## Dependencies +- 어떤 라이브러리를 가져와서 사용할 것인지를 선택하는 것. +- `Spring Web`, HTML을 만들어주는 템플릿 엔진이 필요한데 이것으로 `Thymeleaf`선택(회사마다 다름). + +--- + +## GENERATE +- 아래의 `GENERATE` 버튼 누르면 `zip` 파일이 다운로드 되는데 이 것을 압축 푼 다음 인텔리제이에서 `Open or import`로 `build.gradle`을 열면된다. +- `Open as Project` 선택. + +--- + +## 프로젝트 내부 구조 + +### `.gradle` +- 무시.. + +### `.idea` +- 인텔리제이가 사용하는 설정파일이다. + +### `gradle` -> `wrapper` +- `gradle`과 관련해서 `gradle`을 사용하는 폴더이다. + +### `src` -> `main`, `test` +- `main` : `java`(하위에 실제 패키지와 소스파일 존재), `resources`(실제 자바 코드파일을 제외한 `xml`이나 `properties`, `html`등의 설정 파일 등이 존재 -> 자바 파일을 제외한 나머지는 `resources`라 보면됨) + +- `test` : `java`(테스트 코드들과 관련된 소스들이 존재 -> 테스트 코드라는 것이 요즘 개발 트랜드에서는 중요하다는 뜻이다) +### `build.gradle` +- 중요!! 예전에는 한땀한땀 입력해야 했으나... 앞서 `start.spring.io`에서 선택한 설정들이 지정되어 있는 파일이다. +- 버전 설정하고 라이브러리를 가져오는구나.. 정도로 이해하면 된다. + +### `dependencies` +- 앞서 설정한 라이브러리들이 입력되어 있고, 여기에 입력하면 해당 라이브러리를 사용할 수 있다. +- 요즘에는 기본적으로 테스트 라이브러리가 들어가는데 `JUnit5`가 기본적으로 들어간다. + +### `repositories` +- 라이브러리를 사용하기 위해서는 다운로드를 받아야하는데, 어디서(입력된 사이트에서) 다운로드 받을지 설정을 해놓는 항목이다. + +### `.gitignore` +- 소스코드를 관리해준다. +- `git`에는 필요한 소스코드 파일만 올라가야 하며 빌드된 결과물등은 올라가면 안된다. +- 기본적으로 어느정도는 `start.spring.io`에서 다 해준다. + +### `gradlew`, `gradlew.bat` +- `gradle`로 빌드할 때 사용한다. + +--- + +## Application +- `springboot`는 톰캣 웹 서버를 내장하고 있다. +- 그래서 `@SpringBootApplication` 어노테이션이 붙어있는 클래스에서 `main` 메서드 내에 `SpringApplication.run()`의 인자로 해당 클래스와 `main`메서드의 `args`를 넣고 실행하면 내장 톰캣 웹 서버를 자체적으로 띄우면서 스프링부트가 같이 올라온다(?). + +--- + +## 번외 +- 인텔리제이를 사용하면 빌드가 자바를 직접 실행하는 것이 아니라 `gradle`을 통해 실행될때가 있다. +- 이럴 때는 설정의 `Build, Execution, Deployment`에서 `Build and run using` 항목과 `Run tests using` 항목을 `IntelliJ IDEA`로 바꿔준다. +- `gradle`을 통해서 실행하면 느릴 때가 있는데, 이렇게 설정해주면 인텔리제이에서 `gradle`을 통하지 않고 바로 자바를 띄워서 실행하므로 훨씬 빠르다. \ No newline at end of file diff --git a/SpringBoot-Introduction/build.gradle b/SpringBoot-Introduction/build.gradle new file mode 100644 index 0000000..0feba1b --- /dev/null +++ b/SpringBoot-Introduction/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'org.springframework.boot' version '2.4.1' + id 'io.spring.dependency-management' version '1.0.10.RELEASE' + id 'java' +} + +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' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +test { + useJUnitPlatform() +} diff --git a/SpringBoot-Introduction/gradle/wrapper/gradle-wrapper.jar b/SpringBoot-Introduction/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/gradle/wrapper/gradle-wrapper.properties b/SpringBoot-Introduction/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..4d9ca16 --- /dev/null +++ b/SpringBoot-Introduction/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/SpringBoot-Introduction/gradlew b/SpringBoot-Introduction/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/SpringBoot-Introduction/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or 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 UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$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 "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + 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" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/SpringBoot-Introduction/gradlew.bat b/SpringBoot-Introduction/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/SpringBoot-Introduction/gradlew.bat @@ -0,0 +1,89 @@ +@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%" == "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%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/SpringBoot-Introduction/settings.gradle b/SpringBoot-Introduction/settings.gradle new file mode 100644 index 0000000..b93bc3d --- /dev/null +++ b/SpringBoot-Introduction/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'spring-introduction' diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringIntroductionApplication.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringIntroductionApplication.java new file mode 100644 index 0000000..4d77ec9 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringIntroductionApplication.java @@ -0,0 +1,13 @@ +package hello.springintroduction; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringIntroductionApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringIntroductionApplication.class, args); + } + +} diff --git a/SpringBoot-Introduction/src/main/resources/application.properties b/SpringBoot-Introduction/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/SpringBoot-Introduction/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/SpringBoot-Introduction/src/test/java/hello/springintroduction/SpringIntroductionApplicationTests.java b/SpringBoot-Introduction/src/test/java/hello/springintroduction/SpringIntroductionApplicationTests.java new file mode 100644 index 0000000..43d6b40 --- /dev/null +++ b/SpringBoot-Introduction/src/test/java/hello/springintroduction/SpringIntroductionApplicationTests.java @@ -0,0 +1,13 @@ +package hello.springintroduction; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SpringIntroductionApplicationTests { + + @Test + void contextLoads() { + } + +} From 0869e803fd2ac9db73c377cb25cbb4010d8dcd45 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:23:51 +0900 Subject: [PATCH 02/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20-=20'=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC?= =?UTF-8?q?=EB=A6=AC=20=EC=82=B4=ED=8E=B4=EB=B3=B4=EA=B8=B0'=20=EC=88=98?= =?UTF-8?q?=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture02.md | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture02.md diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 8842f69..5e95ad3 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -1,4 +1,5 @@ # Contents ## 프로젝트 환경설정 -- [프로젝트 생성](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture01.md) \ No newline at end of file +- [프로젝트 생성](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture01.md) +- [라이브러리 살펴보기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture02.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture02.md b/SpringBoot-Introduction/Lectures/Lecture02.md new file mode 100644 index 0000000..0188ba8 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture02.md @@ -0,0 +1,51 @@ +# 라이브러리 살펴보기 +- `build.gradle`의 `dependencies`에서 확인할 수 있다. + +--- + +## `External Libraries` +- 프로젝트 내부에 에서 현재 다운로드된 라이브러리들을 확인할 수 있다(매우 많다!). + +--- + +## `Maven`, `Gradle`과 같은 빌드 툴 +- 의존관계를 관리해준다. +- `spring-boot-starter-web` 라이브러리를 가져오면 `spring-boot-starter-tomcat` 등과 같이 추가로 필요한(의존관계가 있는) 라이브러리를 같이 가져온다. + +--- + +## Gradle(우측 세로 메뉴) +- 현재 가져온 라이브러리들을 확인할 수 있다. +- 라이브러리들을 보다보면 `(*)` 표시를 볼 수 있는데, 이미 다른 라이브러리에서 가져온 라이브러리라는 의미로 중복을 제거한 것이다. + +--- + +## `spring-boot-starter-tomcat` +- 고대에는 톰캣과 같은 웹서버(WAS)를 직접 설치해놓고 자바 코드를 밀어넣는 식 사용하여 웹서버와 개발 라이브러리가 분리되어 있있다. +- 최근에는 소스 라이브러리에서 웹서버를 내장하고(임베디드) 있다. +- 그래서 실행만 해도 웹서버가 나온다(따라서 설정이 필요가 없다). + +--- + +## `spring-boot-starter` +- 스프링부트와 관련된 프로젝트를 사용하면 웬만해서는 의존관계가 다 가져와지므로 직접 가져오지 않아도 괜찮다. + +스프링부트와 관계된 라이브러리를 쓰면 `spring-core`까지 다 가져와서 스프링 관련된 세팅이 되면서 프로그램이 돌아간다고 이해하자. + +--- + +## `spring-boot-starter-logging` +- 현업에서는 로그로 출력을 해야한다. +- 로그로 남겨야 심각한 에러를 모아보거나 로그 파일들의 관리가 가능하기 때문이다. +- `slf4j`, `logback`의 두 라이브러리를 포함하고 있다. +- 로그에 대해 궁금하다면 위의 두 가지 라이브러리를 공부해보자. + +--- + +## `spring-boot-starter-test` +- 자바진영에서는 `JUnit`이라는 라이브러리를 사용한다. +- `mockito`, `assertj` 등 테스트를 편리하게 하도록 도와주는 라이브러리들이 포함되어 있다. +- `spring-test` + - 스프링과 통합해서 테스트할 수 있도록 해주는 라이브러리이다. + +--- \ No newline at end of file From 3e667e995882e9e073854f5c9e4afcadb4b702f9 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:24:35 +0900 Subject: [PATCH 03/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20-=20'View=20=ED=99=98=EA=B2=BD=EC=84=A4?= =?UTF-8?q?=EC=A0=95'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture03.md | 60 +++++++++++++++++++ .../controller/HelloController.java | 15 +++++ .../src/main/resources/static/index.html | 11 ++++ .../src/main/resources/templates/hello.html | 10 ++++ 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture03.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HelloController.java create mode 100644 SpringBoot-Introduction/src/main/resources/static/index.html create mode 100644 SpringBoot-Introduction/src/main/resources/templates/hello.html diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 5e95ad3..8ae0c32 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -2,4 +2,5 @@ ## 프로젝트 환경설정 - [프로젝트 생성](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture01.md) -- [라이브러리 살펴보기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture02.md) \ No newline at end of file +- [라이브러리 살펴보기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture02.md) +- [View 환경설정](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture03.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture03.md b/SpringBoot-Introduction/Lectures/Lecture03.md new file mode 100644 index 0000000..f350b05 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture03.md @@ -0,0 +1,60 @@ +# View 환경설정 + +--- + +## Welcome Page 만들기 +- `Welcome Page` : 도메인만 누르고 들어왔을 때 첫 화면이다. +- `main/resources/static` 디렉토리 내에 `index.html` 파일을 만들면 `static/index.html`이 `Welcome Page`기능을 제공한다. + +--- + +## spring +- 스프링은 자바 엔터프라이즈 웹 애플리케이션 관계된 전반적인 생태계를 다 제공한다. +- 따라서 필요한 것을 찾는 것이 중요하다. +- [스프링 공식 홈페이지](spring.io)(`spring.io`) -> `Projects` -> `Spring Boot` -> `LEARN` -> `Reference Doc.` -> 필요한 정보에 대한 문서 검색(`index.html`을 검색해보자) + +--- + +## 참고할 수 있는 링크 +- [thymeleaf 공식사이트](https://www.thymeleaf.org/) +- [스프링 공식 튜토리얼](https://spring.io/guides/gs/serving-web-content/) +- [스프링 부트 메뉴얼](https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-template-engines) + +--- + +## Controller +- `@Controller` 어노테이션을 명시해야 한다. + +--- + +## @GetMapping("경로") +- 웹 어플리케이션에서 지정한 경로로 들어오면 해당 메서드를 호출한다. + +--- + +## hello.html + +- `th` : `thymeleaf`의 `th`이다. +- `thymeleaf` 템플릿 엔진 : `` + - `html` 내에 작성해주면 템플릿 엔진으로써 `thymeleaf` 문법을 사용할 수 있다. +- `${data}` : `HelloController`에서 `model`의 키 값으로 준 `data`이고, 값은 마찬가지로 `model`의 `value`를 사용하여 치환되어 웹에서 표시된다. + +--- + +## 동작 환경 그림 +- 웹 브라우저에서 `hello`로 접근하면 내장 톰캣 서버가 `HelloController`에 존재하는 `hello`메서드의 `hello` url에 매칭되어 `hello` 메서드가 실행된다. +- 이때 `model`에 키는 `data`, 값은 `hello!!`로 넣는다. +- 그리고 `hello`(`resources`에 존재하는 `hello`)를 리턴한다. +- 이것은 `resources/templates/hello`에 접근해서 랜더링(저 화면을 실행시켜라)하라는 의미이다. +- 컨트롤러에서 리턴 값으로 문자를 반환하면 `뷰 리졸버(viewResolver)`가 화면을 찾아서 처리한다. +- 스프링부트는 템플릿엔진은 기본적으로 `viewName` 매핑을 한다. +- `resources/templates/` + `ViewName` + `.html`과 매핑시켜준다. +- 결과적으로, `resources/templates/hello.html`이 열리게 된다. + +--- + +## 참고 +- `spring-boot-devtools` 라이브러리를 추가하면 `html` 파일을 컴파일만 해주면 서버 재시작 없이 `View` 파일 변경이 가능하다. +- 인텔리제이 컴파일 방법: 메뉴 `build` -> `Recompile` + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HelloController.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HelloController.java new file mode 100644 index 0000000..e959b4b --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HelloController.java @@ -0,0 +1,15 @@ +package hello.springintroduction.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HelloController { + + @GetMapping("hello") + public String hello(Model model) { + model.addAttribute("data", "spring!!"); + return "hello"; + } +} diff --git a/SpringBoot-Introduction/src/main/resources/static/index.html b/SpringBoot-Introduction/src/main/resources/static/index.html new file mode 100644 index 0000000..3bf7dfa --- /dev/null +++ b/SpringBoot-Introduction/src/main/resources/static/index.html @@ -0,0 +1,11 @@ + + + + Hello + + + +Hello +hello + + \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/resources/templates/hello.html b/SpringBoot-Introduction/src/main/resources/templates/hello.html new file mode 100644 index 0000000..81f8f1c --- /dev/null +++ b/SpringBoot-Introduction/src/main/resources/templates/hello.html @@ -0,0 +1,10 @@ + + + + Hello + + + +

안녕하세요. 손님

+ + \ No newline at end of file From dec6621dc5c406b7a971792e37722a38967de3cc Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:25:38 +0900 Subject: [PATCH 04/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20-=20'=EB=B9=8C=EB=93=9C=ED=95=98=EA=B3=A0?= =?UTF-8?q?=20=EC=8B=A4=ED=96=89=ED=95=98=EA=B8=B0'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture04.md | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture04.md diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 8ae0c32..e6e686f 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -3,4 +3,5 @@ ## 프로젝트 환경설정 - [프로젝트 생성](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture01.md) - [라이브러리 살펴보기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture02.md) -- [View 환경설정](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture03.md) \ No newline at end of file +- [View 환경설정](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture03.md) +- [빌드하고 실행하기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture04.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture04.md b/SpringBoot-Introduction/Lectures/Lecture04.md new file mode 100644 index 0000000..ea313ea --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture04.md @@ -0,0 +1,31 @@ +# 빌드하고 실행하기 +- 빌드해서 실행할 수 있는 파일을 만들어본다. +- 사실 인텔리제이에서만 해도 되지만, 실제 개발을 처음 하는 분들은 서버에서 빌드할 때 정말 어떻게 해야하는지를 잘 모르는 경우가 많다(서버에서는 cmd만 사용할 수 있다). +- 실무에서 개발을 하려면 cmd만으로 빌드를 해야할 때도 많다. + +## Mac 사용자일 경우 +- 콘솔로 이동 +- `./gradlew build` +- `cd build/libs` +- `java -jar hello-spring-0.0.1-SNAPSHOT.jar` +- 실행 확인 + +## 윈도우 사용자일 경우 +- 콘솔로 이동 대신 명령 프롬프트(cmd)로 이동. +- `./gradlew` 대신 `gradlew.bat`를 실행. + - 명령 프롬프트에서 `gradlew.bat`를 실행하려면 `gradlew`하고 엔터를 치면 된다. +- `gradlew build` + - 폴더 목록 확인 : `ls` 대신 `dir` 사용. +- `cd build/libs` +- `java -jar hello-spring-0.0.1-SNAPSHOT.jar` +- 실행 확인 + +[윈도우에서 Git Bash 터미널 사용하기](https://www.inflearn.com/questions/53961) + +서버에 배포할때는 `build`를 통해 만들어진 `jar` 파일만 서버에 넣어준 다음 `java -jar`로 실행시키면 서버에서도 스프링이 동작하게 된다. + +- `./gradlew clean`을 이용하면, `build` 폴더 자체가 제거된다. +- `./gradlew clean build`를 이용하면 `build` 폴더를 완전히 지우고 다시 빌드한다. +- 서버를 종료하려면 `Ctrl + C` 를 입력한다. + +--- From d9f320830e508d1a8958c9143a86d501429f9875 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:27:01 +0900 Subject: [PATCH 05/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20-=20'View=20=ED=99=98=EA=B2=BD=EC=84=A4?= =?UTF-8?q?=EC=A0=95'=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Lecture03.md | 4 +++- .../Lectures/images/동작-환경-그림.PNG | Bin 0 -> 50510 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/images/동작-환경-그림.PNG diff --git a/SpringBoot-Introduction/Lectures/Lecture03.md b/SpringBoot-Introduction/Lectures/Lecture03.md index f350b05..13ec4a6 100644 --- a/SpringBoot-Introduction/Lectures/Lecture03.md +++ b/SpringBoot-Introduction/Lectures/Lecture03.md @@ -42,7 +42,9 @@ --- ## 동작 환경 그림 -- 웹 브라우저에서 `hello`로 접근하면 내장 톰캣 서버가 `HelloController`에 존재하는 `hello`메서드의 `hello` url에 매칭되어 `hello` 메서드가 실행된다. +![동작-환경-그림](https://user-images.githubusercontent.com/68052095/102768026-d5d32380-43c3-11eb-9e8c-e7581a2da836.PNG) + +- 웹 브라우저에서 `hello`로 접근하면 내장 톰캣 서버가 `HelloController`에 존재하는 `hello` url이 매핑되어 있는 `hello` 메서드를 찾아서 실행시킨다. - 이때 `model`에 키는 `data`, 값은 `hello!!`로 넣는다. - 그리고 `hello`(`resources`에 존재하는 `hello`)를 리턴한다. - 이것은 `resources/templates/hello`에 접근해서 랜더링(저 화면을 실행시켜라)하라는 의미이다. diff --git a/SpringBoot-Introduction/Lectures/images/동작-환경-그림.PNG b/SpringBoot-Introduction/Lectures/images/동작-환경-그림.PNG new file mode 100644 index 0000000000000000000000000000000000000000..02d01f0a3d03653c699c382f41c45a3abab86565 GIT binary patch literal 50510 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 N5od4iFqi){2~2_ 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 literal 0 HcmV?d00001 From 0d404941a20738994b7c763dc985f0df654ac698 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:27:42 +0900 Subject: [PATCH 06/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9B=B9=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20=EA=B8=B0=EC=B4=88=20-=20'=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 5 ++- SpringBoot-Introduction/Lectures/Lecture05.md | 36 ++++++++++++++++++ .../Lectures/images/정적-컨텐츠-이미지.PNG | Bin 0 -> 37492 bytes .../main/resources/static/hello-static.html | 7 ++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture05.md create mode 100644 SpringBoot-Introduction/Lectures/images/정적-컨텐츠-이미지.PNG create mode 100644 SpringBoot-Introduction/src/main/resources/static/hello-static.html diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index e6e686f..3cc1349 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -4,4 +4,7 @@ - [프로젝트 생성](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture01.md) - [라이브러리 살펴보기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture02.md) - [View 환경설정](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture03.md) -- [빌드하고 실행하기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture04.md) \ No newline at end of file +- [빌드하고 실행하기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture04.md) + +## 스프링 웹 개발 기초 +- [정적 컨텐츠](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture05.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture05.md b/SpringBoot-Introduction/Lectures/Lecture05.md new file mode 100644 index 0000000..7165881 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture05.md @@ -0,0 +1,36 @@ +# 정적 컨텐츠 + +--- + +## 간단한 설명 + +### 정적 컨텐츠 +- `Welcome Page`와 같이 서버에서 파일을 그대로 웹 브라우저에 내려주는 것을 말한다. + +### MVC와 템플릿 엔진 +- `HTML`을 그냥 주는 것이 아니라 서버에서 프로그래밍(변형)을 해서 `HTML`을 동적으로 바꿔서 내려주는 것을 말한다. +- `Model`, `View`, `Controller`의 세 가지를 `MVC`라고 한다. + + +### API +- 최근에는 `json`이라는 데이터 구조 포맷을 이용하여 클라이언트에게 데이터를 전달하는 방식을 말한다. +- 최근에는 `vue.js`, `react`등을 사용할 때도 API로 데이터만 내려주면 화면은 클라이언트가 알아서 그리고 정리하는 방식을 이용할 때도 사용한다. +- 서버끼리 통신할 때에도 사용한다. + +--- + +## 스프링 부트에서의 정적 컨텐츠 + +- 스프링 부트는 정적 컨텐츠 기능을 제공한다. +- [스프링 Static Content](https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-static-content) +- 스프링 부트는 기본적으로 정적 컨텐츠는 `/static` 폴더에서 찾아서 제공한다. +- 원하는 파일을 넣으면(`/static` 폴더 내부에) 정적 파일이 그대로 반환되지만, 어떠한 프로그래밍을 할 수는 없다. + +### 정적 컨텐츠 이미지 +![정적-컨텐츠-이미지](https://user-images.githubusercontent.com/68052095/102767711-580f1800-43c3-11eb-84a2-562cfca57fb5.PNG) +- 웹 브라우저에서 `localhost:8080/hello-static.html` 으로 접근하면 내장 톰캣 서버가 요청을 받아서 스프링한테 넘긴다. +- 컨트롤러쪽에서 `hello-static`이 있는지 먼저 찾아본다(컨트롤러가 우선 순위에 있다는 뜻). +- 하지만 `hello-static`와 매핑된 컨트롤러 메서드는 없다. +- 따라서 `resources/static/hello-static.html`을 찾아서 있으면 그대로 반환한다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/정적-컨텐츠-이미지.PNG b/SpringBoot-Introduction/Lectures/images/정적-컨텐츠-이미지.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b9f039ef0bf4625ab51fa01ea989d562d5e976d3 GIT binary patch literal 37492 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 x+MH5(!s9$ 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 bdxArGrWQqh53P;^{wT;kyqkMR@8$mk1{zk) literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/src/main/resources/static/hello-static.html b/SpringBoot-Introduction/src/main/resources/static/hello-static.html new file mode 100644 index 0000000..d459604 --- /dev/null +++ b/SpringBoot-Introduction/src/main/resources/static/hello-static.html @@ -0,0 +1,7 @@ + + +static content + + + 정적 컨텐츠 입니다. + From d2ccc64ab1eee0b304d997c504783a3b35b1ca8f Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:28:51 +0900 Subject: [PATCH 07/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9B=B9=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20=EA=B8=B0=EC=B4=88=20-=20'MVC=EC=99=80=20=ED=85=9C?= =?UTF-8?q?=ED=94=8C=EB=A6=BF=20=EC=97=94=EC=A7=84'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture06.md | 38 ++++++++++++++++++ .../images/MVC,-템플릿-엔진-이미지.PNG | Bin 0 -> 36931 bytes .../controller/HelloController.java | 7 ++++ .../resources/templates/hello-template.html | 5 +++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture06.md create mode 100644 SpringBoot-Introduction/Lectures/images/MVC,-템플릿-엔진-이미지.PNG create mode 100644 SpringBoot-Introduction/src/main/resources/templates/hello-template.html diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 3cc1349..4bf6bec 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -7,4 +7,5 @@ - [빌드하고 실행하기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture04.md) ## 스프링 웹 개발 기초 -- [정적 컨텐츠](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture05.md) \ No newline at end of file +- [정적 컨텐츠](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture05.md) +- [MVC와 템플릿 엔진](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture06.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture06.md b/SpringBoot-Introduction/Lectures/Lecture06.md new file mode 100644 index 0000000..3e36ff5 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture06.md @@ -0,0 +1,38 @@ +# MVC와 템플릿 엔진 +- `MVC` : `Model`, `View`, `Controller` +- 과거에는 `View`에서 모든 것을 다 했다(`Model 1 방식`). +- 개발을 할 때는 관심사를 분리해야 한다. 역할과 책임. +- `View`는 화면을 그리는데 모든 역량을 집중해야 한다. +- `Model`, `Controller`과 관련된 부분들은 비즈니스 로직과 관련이 있거나 내부적인 것들을 처리하는데 집중해야 한다. +- `View`는 화면에 관계된 일만. +- 비즈니스 로직과 서버 뒷단에 관련된 것은 `Controller`나 뒷단 비즈니스 로직에서 처리하고 `Model`에 화면에 필요한 것들을 담아서 화면쪽에 넘겨준다. + +--- + +## @RequestParam +- 외부에서 파라미터를 받을 때 사용한다. + +--- + +## Thymeleaf +- `html`을 그대로 쓰고 그 파일을 서버 없이 바로 열어봐도 껍데기를 볼 수 있다는 장점이 있다. +- 다음 `html` 코드는 템플릿 엔진으로 동작을 하면 내용(`hello! empty`)이 서버에서 전달해준 데이터로 치환(`'hello ' + ${name}`)된다. + - `

hello! empty

` + +--- + +## 인텔리제이 옵션보기 +- 원하는 부분을 선택한 뒤 `ctrl + p`를 누르면 파라미터 정보 옵션을 볼 수 있다. +- `@RequestParam`의 `required` 옵션의 기본값은 `true`이기 때문에 파라미터를 무조건 전달해줘야 한다(`false`로 지정하면 값을 넘기지 않아도 된다). + +--- + +## MVC, 템플릿 엔진 이미지 +![MVC,-템플릿-엔진-이미지](https://user-images.githubusercontent.com/68052095/102771216-e2a64600-43c8-11eb-97a2-c7504eebcb01.PNG) +- 웹 브라우저에서 `localhost:8080/hello-mvc`로 접근하면 내장 톰캣 서버가 스프링에게 요청을 던진다. +- 스프링은 `helloController`에 해당 url에 매핑되어 있는 메서드를 호출해준다. +- 그리고 리턴을 해줄때 `hello-template`와 `model(name:spring)`을 스프링한테 리턴해준다. +- 스프링의 `viewResolver`가 뷰를 찾고 템플릿 엔진을 연결시켜준다. templates/`hello-template`.html(메서드가 리턴한 값인 `hello-template`)를 찾아서 `Thymeleaf` 템플릿 엔진한테 처리해달라고 넘긴다. +- `Thymeleaf` 템플릿 엔진이 랜더링해서 변환한 `html`을 웹 브라우저에 반환한다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/MVC,-템플릿-엔진-이미지.PNG b/SpringBoot-Introduction/Lectures/images/MVC,-템플릿-엔진-이미지.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ba9967c0086591e7a4ff5ec5c01f16821243ab93 GIT binary patch literal 36931 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%0AV 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 + +

hello! empty

+ + \ No newline at end of file From 2fa159db22f7c9dbe5b634d138da552f655d89c5 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 21:29:31 +0900 Subject: [PATCH 08/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9B=B9=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20=EA=B8=B0=EC=B4=88=20-=20'API'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture07.md | 58 ++++++++++++++++++ .../images/@ResponseBody 사용 원리.PNG | Bin 0 -> 36487 bytes .../controller/HelloController.java | 27 ++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture07.md create mode 100644 SpringBoot-Introduction/Lectures/images/@ResponseBody 사용 원리.PNG diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 4bf6bec..54c9d0a 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -8,4 +8,5 @@ ## 스프링 웹 개발 기초 - [정적 컨텐츠](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture05.md) -- [MVC와 템플릿 엔진](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture06.md) \ No newline at end of file +- [MVC와 템플릿 엔진](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture06.md) +- [API](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture07.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture07.md b/SpringBoot-Introduction/Lectures/Lecture07.md new file mode 100644 index 0000000..7cc8d4c --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture07.md @@ -0,0 +1,58 @@ +# API +- API방식은 데이터를 바로 내려주는 방식이다. + +--- + +## @ResponseBody +- `http`의 통신 프로토콜에서 `header`와 `body` 중에서 `body`에 응답 데이터를 직접 넣어주겠다는 의미이다. +- 메서드에서 리턴하는 문자가 요청하는 클라이언트에 그대로 전달된다. +- 템플릿 엔진과의 차이는 `View`와 같은 것들이 없이 문자가 그대로 전달되는 것이다. +- 즉, `html` 태그와 같은 것들이 하나도 없다... + +--- + +## static class +- `static class`로 만들면 `class` 내부에서 사용할 수 있다. + +--- + +## 인텔리제이 단축키 +- `ctrl + shift + enter`를 누르면 코드의 세미콜론을 자동완성해준다. + +--- + +## JSON +- `키(key)`와 `값(value)`으로 이루어진 구조이다. +- `{키 : 값}`의 형식을 가진다. +- 과거에는 `XML`도 많이 쓰였다(``과 같은 것들). +- 최근에는 `JSON`으로 거의 통일되었다(거의 `json`이 `default`로 세팅되어 있다). + +--- + +## 자바 빈 규약 +- `getter`, `setter`를 자바 빈 규약이라고 하며, 프로퍼티 접근 방식이라고 하기도 한다. +- `private` 필드값인 `name`에 메서드를 통해서 접근하게 된다. + +## @ResponseBody 사용 원리(보통 API를 사용하는 방식) +![@ResponseBody 사용 원리](https://user-images.githubusercontent.com/68052095/102773119-0d45ce00-43cc-11eb-9f0a-64d094196964.PNG) +- 웹 브라우저에서 `localhost:8080/hello-api`로 접근. +- 톰캣 내장 서버가 스프링에 던짐. +- 스프링이 `hello-api`에 매핑된 메서드를 찾음. +- 근데 `@ResponseBody`라는 어노테이션이 붙어있네? 이럴 경우에는 리턴된 데이터를 응답으로 그대로 `HTTP`의 `BODY`에 반환하도록 동작한다(`view` 없이). + - 그런데! 문자가 아니라 객체일 경우에는 `json` 형식으로 데이터를 만들어서 `HTTP`응답에 반환하는 것이 기본정책이다. +- `@ResponseBody`가 있으면 우선, `HttpMessageConverter`라는 녀석이 동작한다(기존에는 `viewResolver`가 동작했었다). + - 단순 문자일 경우에는 `StringConverter`가 동작한다. + - 기본 문자처리 : `StringHttpMessageConverter` + - 객체일 경우에는 `JsonConverter`가 동작해서 `json` 형식으로 바꿔서 요청한 웹 브라우저 또는 서버로 반환한다. + - 기본 객체처리 : `MappingJackson2HttpMessageConverter` +- 실무에서는 `Jackson`, `Gson` 라이브러리를 자주 보게되는데, 스프링에서는 `Jackson` 라이브러리를 기본으로 사용한다(물론 변경 가능하다). +- 객체를 `Jackson`이라는 라이브러리로 `json`으로 바꾸는 것을 `MappingJackson2HttpMessageConverter`가 수행한다. +- 이렇게 나오는 `json` 데이터를 `HTTP`의 `BODY`에 실어서 웹 브라우저 또는 클라이언트 등에 반환한다. +- `byte` 처리 등등 기타 여러 `HttpMessageConverter`가 기본으로 등록되어 있다. + +--- + +## 참고사항 +- 클라이언트의 `HTTP Accept 헤더`와 `서버의 컨트롤러 반환 타입 정보` 둘을 조합해서 `HttpMessageConverter`가 선택된다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/@ResponseBody 사용 원리.PNG b/SpringBoot-Introduction/Lectures/images/@ResponseBody 사용 원리.PNG new file mode 100644 index 0000000000000000000000000000000000000000..11c72e7194aaa8197fbdaa7749da6cef75520f27 GIT binary patch literal 36487 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%0A!Gf+c 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 Date: Mon, 21 Dec 2020 21:35:12 +0900 Subject: [PATCH 09/28] =?UTF-8?q?README=20=EA=B0=95=EC=9D=98=20=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=A4=91=20=EA=B9=80=EC=98=81?= =?UTF-8?q?=ED=95=9C=EB=8B=98=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20?= =?UTF-8?q?=EC=9E=85=EB=AC=B8=20-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=B0=EC=9A=B0=EB=8A=94=20=EC=8A=A4=ED=94=84=EB=A7=81=20?= =?UTF-8?q?=EB=B6=80=ED=8A=B8,=20=EC=9B=B9=20MVC,=20DB=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=20=EA=B8=B0=EC=88=A0=20=EB=B0=8F=20Contents=20?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- SpringBoot-Introduction/Lectures/Contents.md | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 812e1e0..3b0b5ae 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ - [codingTest](https://github.com/banjjoknim/codingTest) ## 강의 -- [김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Contents.md) +- [김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Contents.md) ## Git-GitHub - [직접 만든 Git-GitHub 강의 자료](https://github.com/banjjoknim/RectureForGit/blob/master/README.md) diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 54c9d0a..e62110d 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -1,12 +1,12 @@ # Contents ## 프로젝트 환경설정 -- [프로젝트 생성](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture01.md) -- [라이브러리 살펴보기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture02.md) -- [View 환경설정](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture03.md) -- [빌드하고 실행하기](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture04.md) +- [프로젝트 생성](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture01.md) +- [라이브러리 살펴보기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture02.md) +- [View 환경설정](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture03.md) +- [빌드하고 실행하기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture04.md) ## 스프링 웹 개발 기초 -- [정적 컨텐츠](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture05.md) -- [MVC와 템플릿 엔진](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture06.md) -- [API](https://github.com/banjjoknim/spring-introduction/blob/master/Lectures/Lecture07.md) \ No newline at end of file +- [정적 컨텐츠](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture05.md) +- [MVC와 템플릿 엔진](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture06.md) +- [API](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture07.md) \ No newline at end of file From 185c343faf675c373f6205546e3f77bac9f24107 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 22:08:21 +0900 Subject: [PATCH 10/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EB=B0=B1=EC=97=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20-=20'=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=A0=95=EB=A6=AC'=20?= =?UTF-8?q?=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 5 +++- SpringBoot-Introduction/Lectures/Lecture08.md | 28 ++++++++++++++++++ .../일반적인-웹-어플리케이션-계층-구조.PNG | Bin 0 -> 12684 bytes .../Lectures/images/클래스-의존관계.PNG | Bin 0 -> 16242 bytes 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture08.md create mode 100644 SpringBoot-Introduction/Lectures/images/일반적인-웹-어플리케이션-계층-구조.PNG create mode 100644 SpringBoot-Introduction/Lectures/images/클래스-의존관계.PNG diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index e62110d..e0eb90e 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -9,4 +9,7 @@ ## 스프링 웹 개발 기초 - [정적 컨텐츠](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture05.md) - [MVC와 템플릿 엔진](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture06.md) -- [API](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture07.md) \ No newline at end of file +- [API](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture07.md) + +## 회원 관리 예제 - 백엔드 개발 +- [비즈니스 요구사항 정리](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture08.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture08.md b/SpringBoot-Introduction/Lectures/Lecture08.md new file mode 100644 index 0000000..c42fd7e --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture08.md @@ -0,0 +1,28 @@ +# 비즈니스 요구사항 정리 +- 데이터 : 회원ID, 이름 +- 기능 : 회원등록, 조회 +- 아직 데이터 저장소가 선정되지 않음(가상의 시나리오) + +--- + +## 일반적인 웹 어플리케이션 계층 구조 +![일반적인-웹-어플리케이션-계층-구조](https://user-images.githubusercontent.com/68052095/102780119-beeafc00-43d8-11eb-9b8d-89b1c0c69c4a.PNG) + +- 컨트롤러 : 웹 MVC의 컨트롤러 역할을 한다. +- 서비스 : 서비스 클래스의 핵심 비즈니스 로직을 구현한다(ex. 회원은 중복가입이 안된다거나..). + - 서비스는 비즈니스 도메인 객체를 가지고 핵심 비즈니스 로직이 동작하도록 구현한 객체이다. +- 리포지토리 : 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리한다. +- 도메인 : 회원, 주문, 쿠폰 등등 주문 데이터베이스에 저장하고 관리되는 비즈니스 도메인 객체이다. + +--- + +## 클래스 의존관계 +![클래스-의존관계](https://user-images.githubusercontent.com/68052095/102780114-be526580-43d8-11eb-8bb1-d7ef7652a753.PNG) + +- 회원 비즈니스 로직에는 회원 서비스가 있다. +- 회원 리포지토리는 인터페이스로 설계한다. + - 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계한다. + - 개발을 진행하기 위해서 초기 개발 단계에서는 구현체로 가벼운 `메모리 기반의 데이터 저장소`를 사용한다(굉장히 단순하며 금방 만들 수 있다). + - 이는 향후에 `RDB`, `JPA` 등의 구체적인 기술이 선정되고나면(현재는 다양한 저장소를 고려중인 상황이라고 가정) 바꿔끼운다(바꿔끼우기 위해서는 인터페이스가 필요하므로 리포지토리는 인터페이스로 설계한다). + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/일반적인-웹-어플리케이션-계층-구조.PNG b/SpringBoot-Introduction/Lectures/images/일반적인-웹-어플리케이션-계층-구조.PNG new file mode 100644 index 0000000000000000000000000000000000000000..402b2084b5837c0a14be91f5dbbaddb9db47cd3b GIT binary patch literal 12684 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 B*|`7! literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/Lectures/images/클래스-의존관계.PNG b/SpringBoot-Introduction/Lectures/images/클래스-의존관계.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d2ff139169ecf53e5def36d8765483135d058f09 GIT binary patch literal 16242 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 JK`PmV|1S~8fr|hD literal 0 HcmV?d00001 From b8f6bed3e499bc2511f61df7292c4ed9749b0029 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 22:26:57 +0900 Subject: [PATCH 11/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EB=B0=B1=EC=97=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20-=20'=ED=9A=8C=EC=9B=90=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EA=B3=BC=20=EB=A6=AC=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EB=A7=8C=EB=93=A4=EA=B8=B0'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture09.md | 35 +++++++++++++++++++ .../springintroduction/domain/Member.java | 22 ++++++++++++ .../repository/MemberRepository.java | 13 +++++++ .../repository/MemoryMemberRepository.java | 35 +++++++++++++++++++ 5 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture09.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemberRepository.java create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index e0eb90e..00c9545 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -12,4 +12,5 @@ - [API](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture07.md) ## 회원 관리 예제 - 백엔드 개발 -- [비즈니스 요구사항 정리](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture08.md) \ No newline at end of file +- [비즈니스 요구사항 정리](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture08.md) +- [회원 도메인과 리포지토리 만들기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture09.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture09.md b/SpringBoot-Introduction/Lectures/Lecture09.md new file mode 100644 index 0000000..bfd8f40 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture09.md @@ -0,0 +1,35 @@ +# 회원 도메인과 리포지토리 만들기 + +--- + +## Member class +- id : 임의의 값(고객이 정하는 아이디가 아닌 데이터 구분을 위해 시스템이 저장하는 ID) + +--- + +## Optional +- 자바8에 추가된 기능이다. +- 최근에는 `null`을 처리하는 방법 중에서 `null`을 `Optional`로 감싸서 반환하는 방법을 선호한다. + +--- + +## HashMap, long +- 실무에서는 동시성 문제가 발생할 수 있으므로 공유되는 변수에는 `ConcurrentHashMap<>`을 사용해야 한다. +- 이 역시 동시성 문제를 고려해서 `atomicLong` 등을 사용해야 한다. + +--- + +## Optional.ofNullable(store.get(id)) +- `store.get(id)`가 `null`이어도 감싸서 반환할 수 있다. + +--- + +## findAll() +- 실무에서는 리스트를 많이 사용한다(편리하다고 함). + +--- + +## store.values() +- `store`라는 `Map`의 값들을 불러온다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java new file mode 100644 index 0000000..222ae03 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java @@ -0,0 +1,22 @@ +package hello.springintroduction.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/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemberRepository.java new file mode 100644 index 0000000..3fd5f9e --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemberRepository.java @@ -0,0 +1,13 @@ +package hello.springintroduction.repository; + +import hello.springintroduction.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); + List findAll(); +} diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java new file mode 100644 index 0000000..498bb4f --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java @@ -0,0 +1,35 @@ +package hello.springintroduction.repository; + +import hello.springintroduction.domain.Member; + +import java.util.*; + +public class MemoryMemberRepository implements MemberRepository { + + private static Map store = new HashMap<>(); + private static long sequence = 0L; + + @Override + public Member save(Member member) { + member.setId(++sequence); + store.put(member.getId(), member); + return member; + } + + @Override + public Optional findById(Long id) { + return Optional.ofNullable(store.get(id)); + } + + @Override + public Optional findByName(String name) { + return store.values().stream() + .filter(member -> member.getName().equals(name)) + .findAny(); + } + + @Override + public List findAll() { + return new ArrayList<>(store.values()); + } +} From fd18326e5e3ca01fd57a2b0412f53504f52acef8 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 21 Dec 2020 23:02:00 +0900 Subject: [PATCH 12/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EB=B0=B1=EC=97=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20-=20'=ED=9A=8C=EC=9B=90=20=EB=A6=AC=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=9E=91=EC=84=B1'=20=EC=88=98?= =?UTF-8?q?=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture10.md | 32 +++++++++ .../repository/MemoryMemberRepository.java | 4 ++ .../MemoryMemberRepositoryTest.java | 70 +++++++++++++++++++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture10.md create mode 100644 SpringBoot-Introduction/src/test/java/hello/springintroduction/repository/MemoryMemberRepositoryTest.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 00c9545..4cfb707 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -13,4 +13,5 @@ ## 회원 관리 예제 - 백엔드 개발 - [비즈니스 요구사항 정리](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture08.md) -- [회원 도메인과 리포지토리 만들기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture09.md) \ No newline at end of file +- [회원 도메인과 리포지토리 만들기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture09.md) +- [회원 리포지토리 테스트 케이스 작성](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture10.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture10.md b/SpringBoot-Introduction/Lectures/Lecture10.md new file mode 100644 index 0000000..f3da991 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture10.md @@ -0,0 +1,32 @@ +# 회원 리포지토리 테스트 케이스 작성 +- 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. +- 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. +- 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다. + +--- + +## 테스트 클래스 명명법 관례 +- `테스트하고자 하는 클래스의 이름` + `Test`로 짓는다. + +--- + +## 테스트가 실패한다면? +- 실무에서는 빌드 툴에서 빌드할 때 테스트가 통과하지 않으면 다음 단계로 못 넘어가게 막아버린다. + +--- + +## 테스트는 순서가 보장이 안된다 +- 모든 테스트는 순서에 관계없이 메서드별로 각자 동작하게끔 만들어야 한다. +- 순서의 의존적으로 설계하면 절대 안된다. + +--- + +## 테스트가 끝날 때마다 데이터를 클리어 해줘야 한다. +- `@AfterEach` 어노테이션을 붙여서 메서드를 만들면 테스트 하나가 끝날 때마다 동작하는 메서드를 정의할 수 있다. + +--- + +## TDD(Test Driven Development) +- 테스트를 먼저 만들고 구현 클래스를 만들어서 테스트를 실행하는 방식으로 개발하는 방법을 말한다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java index 498bb4f..fe41fae 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java @@ -32,4 +32,8 @@ public class MemoryMemberRepository implements MemberRepository { public List findAll() { return new ArrayList<>(store.values()); } + + public void clearStore() { + store.clear(); + } } diff --git a/SpringBoot-Introduction/src/test/java/hello/springintroduction/repository/MemoryMemberRepositoryTest.java b/SpringBoot-Introduction/src/test/java/hello/springintroduction/repository/MemoryMemberRepositoryTest.java new file mode 100644 index 0000000..5f2a517 --- /dev/null +++ b/SpringBoot-Introduction/src/test/java/hello/springintroduction/repository/MemoryMemberRepositoryTest.java @@ -0,0 +1,70 @@ +package hello.springintroduction.repository; + +import hello.springintroduction.domain.Member; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MemoryMemberRepositoryTest { + + MemoryMemberRepository repository = new MemoryMemberRepository(); + + @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(member).isEqualTo(result); + } + + @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); + } + +} From 9c025243f2c6b1ec8032816e458c3964d314150c Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Tue, 22 Dec 2020 20:16:13 +0900 Subject: [PATCH 13/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EB=B0=B1=EC=97=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20-=20'=ED=9A=8C=EC=9B=90=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EA=B0=9C=EB=B0=9C'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture11.md | 33 ++++++++++++++ .../service/MemberService.java | 44 +++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture11.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 4cfb707..9e31feb 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -14,4 +14,5 @@ ## 회원 관리 예제 - 백엔드 개발 - [비즈니스 요구사항 정리](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture08.md) - [회원 도메인과 리포지토리 만들기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture09.md) -- [회원 리포지토리 테스트 케이스 작성](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture10.md) \ No newline at end of file +- [회원 리포지토리 테스트 케이스 작성](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture10.md) +- [회원 서비스 개발](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture11.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture11.md b/SpringBoot-Introduction/Lectures/Lecture11.md new file mode 100644 index 0000000..4550f76 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture11.md @@ -0,0 +1,33 @@ +# 회원 서비스 개발 + +--- + +## 회원 서비스 +- 회원 리포지토리와 도메인을 사용하는 실제 비즈니스 로직을 작성한다. + +--- + +## ifPresent +- `Optional`에서 `null`이 아닌 값이 있으면 정의된 로직이 동작한다. +- `null`일 가능성이 있으면 `Optional`로 감싸주고 사용할 수 있다. + +--- + +## 메서드 추출 +- `Ctrl + Alt + m`(window) +- `Command + Option + m`(Mac) + +--- + +## 리포지토리 +- 단순히 기계적으로 개발스럽게 용어들을 보통 선택한다. +- 단순히 데이터베이스에 접근(데이터를 넣었다 뺐다)하는 역할을 수행한다. + +--- + +## 서비스 클래스 +- 비즈니스에 가까운 용어를 사용해야 한다. +- 비즈니스에 의존적으로 설계한다. +- 비즈니스를 처리하는 역할을 수행한다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java new file mode 100644 index 0000000..31428a4 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java @@ -0,0 +1,44 @@ +package hello.springintroduction.service; + +import hello.springintroduction.domain.Member; +import hello.springintroduction.repository.MemberRepository; +import hello.springintroduction.repository.MemoryMemberRepository; + +import java.util.List; +import java.util.Optional; + +public class MemberService { + + private final MemberRepository memberRepository = new MemoryMemberRepository(); + + /* + * 회원 가입 + */ + public Long join(Member member) { + // 같은 이름이 있는 중복 회원X + validateDuplicateMember(member); // 중복 회원 검증 + memberRepository.save(member); + return member.getId(); + } + + private void validateDuplicateMember(Member member) { + memberRepository.findByName(member.getName()) + .ifPresent(mem -> { + throw new IllegalArgumentException("이미 존재하는 회원입니다."); + }); + } + + /* + * 전체 회원 조회 + */ + public List findMembers() { + return memberRepository.findAll(); + } + + /* + * 아이디로 회원 조회 + */ + public Optional findOne(Long memberId) { + return memberRepository.findById(memberId); + } +} From e2ec5c9dd2019b8ff9d435b294f65d9c9d782f0f Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Tue, 22 Dec 2020 20:44:20 +0900 Subject: [PATCH 14/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EB=B0=B1=EC=97=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20-=20'=ED=9A=8C=EC=9B=90=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture12.md | 23 +++++++ .../service/MemberService.java | 7 +- .../service/MemberServiceTest.java | 68 +++++++++++++++++++ 4 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture12.md create mode 100644 SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceTest.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 9e31feb..fab1277 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -15,4 +15,5 @@ - [비즈니스 요구사항 정리](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture08.md) - [회원 도메인과 리포지토리 만들기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture09.md) - [회원 리포지토리 테스트 케이스 작성](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture10.md) -- [회원 서비스 개발](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture11.md) \ No newline at end of file +- [회원 서비스 개발](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture11.md) +- [회원 서비스 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture12.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture12.md b/SpringBoot-Introduction/Lectures/Lecture12.md new file mode 100644 index 0000000..3931efa --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture12.md @@ -0,0 +1,23 @@ +# 회원 서비스 테스트 + +--- + +## 테스트 클래스 작성 +- `Ctrl + Shift + T` +- 테스트 코드는 과감하게 한글을 사용해도 된다(영어권 사람들과 일하는 것이 아니라면). +- 빌드될 때 테스트 코드는 실제 코드에 포함되지 않는다. +- `given`, `when`, `then` 주석을 권장하는 편이다. + - `given` : 무언가 상황이 주어졌을 때 + - `when` : 이것을 실행하면 + - `then` : 이러한 결과가 나와야 한다. +- 테스트는 예외상황이 정상상황보다 더 중요하다. +- `Ctrl + R` : 이전에 실행했던 것을 그대로 실행해준다(Mac). + - 윈도우는 `Shift + F10`을 사용한다. + +--- + +## Dependency Injection(의존성 주입) +- 직접 인스턴스를 만드는 것이 아니라 외부에서 넣어주는 것을 말한다. + - `MemberSerivce` 입장에서는 직접 `new`로 인스턴스를 만드는 것이 아니라 외부에서 `MemberRepository`를 넣어주는 것이다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java index 31428a4..96d1d10 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java @@ -2,14 +2,17 @@ package hello.springintroduction.service; import hello.springintroduction.domain.Member; import hello.springintroduction.repository.MemberRepository; -import hello.springintroduction.repository.MemoryMemberRepository; import java.util.List; import java.util.Optional; public class MemberService { - private final MemberRepository memberRepository = new MemoryMemberRepository(); + private final MemberRepository memberRepository; + + public MemberService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } /* * 회원 가입 diff --git a/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceTest.java b/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceTest.java new file mode 100644 index 0000000..8ec8530 --- /dev/null +++ b/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceTest.java @@ -0,0 +1,68 @@ +package hello.springintroduction.service; + +import hello.springintroduction.domain.Member; +import hello.springintroduction.repository.MemoryMemberRepository; +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.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MemberServiceTest { + + MemberService memberService; + MemoryMemberRepository memberRepository; + + @BeforeEach + public void beforeEach() { + memberRepository = new MemoryMemberRepository(); + memberService = new MemberService(memberRepository); + } + + @AfterEach + public void afterEach() { + memberRepository.clearStore(); + } + + @Test + void 회원가입() { + // given + Member member = new Member(); + member.setName("hello"); + + // when + Long saveId = memberService.join(member); + + // then + Member findMember = memberService.findOne(saveId).get(); + assertThat(member.getName()).isEqualTo(findMember.getName()); + } + + @Test + public void 중복_회원_예외() { + // given + Member member1 = new Member(); + member1.setName("spring"); + + Member member2 = new Member(); + member2.setName("spring"); + + // when + memberService.join(member1); + assertThatThrownBy(() -> memberService.join(member2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이미 존재하는 회원입니다."); + + // then + + } + + @Test + void findMembers() { + } + + @Test + void findOne() { + } +} \ No newline at end of file From 08d48963cf8d9b542ab911de819d80a6ac1e0bdd Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Tue, 22 Dec 2020 21:28:35 +0900 Subject: [PATCH 15/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B9=88=EA=B3=BC=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EA=B4=80=EA=B3=84=20-=20'=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=8A=A4=EC=BA=94=EA=B3=BC=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=9D=98=EC=A1=B4=EA=B4=80=EA=B3=84=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 5 +- SpringBoot-Introduction/Lectures/Lecture13.md | 58 ++++++++++++++++++ .../Lectures/images/스프링-컨테이너.PNG | Bin 0 -> 14493 bytes .../controller/MemberController.java | 16 +++++ .../repository/MemoryMemberRepository.java | 2 + .../service/MemberService.java | 4 ++ 6 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture13.md create mode 100644 SpringBoot-Introduction/Lectures/images/스프링-컨테이너.PNG create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index fab1277..7123a77 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -16,4 +16,7 @@ - [회원 도메인과 리포지토리 만들기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture09.md) - [회원 리포지토리 테스트 케이스 작성](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture10.md) - [회원 서비스 개발](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture11.md) -- [회원 서비스 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture12.md) \ No newline at end of file +- [회원 서비스 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture12.md) + +## 스프링 빈과 의존관계 +- [컴포넌트 스캔과 자동 의존관계 설정](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture13.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture13.md b/SpringBoot-Introduction/Lectures/Lecture13.md new file mode 100644 index 0000000..41197d6 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture13.md @@ -0,0 +1,58 @@ +# 컴포넌트 스캔과 자동 의존관계 설정 +- 화면을 고치려면 먼저 컨트롤러와 뷰 템플릿이 필요하다. +- 그러려면 우선 컨트롤러가 있어야 하는데 컨트롤러가 서비스를 통해서 회원가입과 조회를 할 수 있어야 한다. +- 이러한 관계를 의존관계가 있다고 한다(컨트롤러가 서비스를 의존한다). + +--- + +## 컨트롤러 선언시 발생하는 일 +- 스프링은 시작할 때 `스프링 컨테이너`라는 것이 생기는데 `@Controller` 어노테이션이 있으면 해당 객체를 생성해서 `스프링 컨테이너`에 넣어두고 관리한다. +- 이를 두고 `'스프링 컨테이너에서 스프링 빈이 관리된다'` 라고 표현한다. +- 스프링이 관리하게 되면 스프링 컨테이너에 등록되고, 스프링 컨테이너에서 받아서 쓰도록 바꿔야 한다. 불필요하게 인스턴스를 생성할 필요가 없다는 뜻이다. +- 즉, 스프링 컨테이너에 등록하면 된다. 스프링 컨테이너에 등록하면 단 하나만 등록된다. +- 스프링 컨테이너와의 연결 방법은 생성자를 만들고 거기에 `@Autowired` 어노테이션을 선언하면 된다. +- 스프링을 시작하고 컨테이너가 뜰 때 `Controller`가 생성되는데 이때 생성자 호출을 하게된다. +- 그런데 생성자에 `@Autowired`라고 되어있으면 생성자로 주입되는 의존성 객체를 스프링이 스프링 컨테이너에서 가져와서 `Controller`에 연결시켜 준다(`Dependency Injection`), 의존성 주입. + +![스프링-컨테이너](https://user-images.githubusercontent.com/68052095/102889452-08514f00-449e-11eb-8317-8b56a7c7f88a.PNG) + +--- + +## @Autowired +- 컨트롤러와 서비스등 컨테이너에 등록된 객체를 가져와서 연결시켜줄 때 사용한다. +- 스프링 컨테이너에서 의존성(생성자 파라미터)을 가져온다. +- 하지만 스프링에서 관리하지 않는 순수한 클래스는 가져오지 못한다. +- 서비스의 경우, `@Service`를 클래스에 선언해주면 스프링이 컨테이너에 서비스를 등록해준다. +- 마찬가지로 리포지토리의 경우, `@Repository`를 구현체에 선언해주면 스프링이 컨테이너에 리포지토리를 등록해준다. + +--- + +## Controller, Service, Repository +- 정형화된 패턴이다. +- `Controller`에서 외부 요청을 받는다. +- `Service`에서 비즈니스 로직을 만든다. +- `Repository`에서 데이터를 저장한다. +- 스프링을 실행할 때 위 세 가지를 모두 컨테이너로 가져온다. + +--- + +## 스프링 빈을 등록하는 2가지 방법 +- 컴포넌트 스캔(`@Controller, @Service, @Repository 등의 어노테이션 선언`, `각각의 어노테이션은 @Component를 포함하고 있다.`)과 자동 의존관계 설정(`@Autowired`) + - 스프링은 `@Component`를 포함하는 어노테이션이 있으면 해당하는 것들은 전부 객체를 생성해서 스프링 컨테이너에 스프링 빈으로 등록한다. +- 자바 코드로 직접 스프링 빈 등록하기 + +--- + +## 아무데나 @Component를 선언해도 빈으로 등록되는가? +- 아니다. +- `@SpringBootApplication` 어노테이션이 선언된 패키지부터 시작(포함)해서 하위는 스프링이 다 뒤져서 빈으로 등록한다. +- 하지만 하위 패키지가 위의 패키지와 동일하거나 하위 패키지가 아닌 것들은 스프링 빈으로 컴포넌트 스캔을 하지 않으므로 컨테이너에 등록되지 않는다. + +--- + +## 참고 +- 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다). +- 따라서 같은 스프링 빈이면 모두 같은 인스턴스이다. +- 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/스프링-컨테이너.PNG b/SpringBoot-Introduction/Lectures/images/스프링-컨테이너.PNG new file mode 100644 index 0000000000000000000000000000000000000000..64d69d908a1b87d5c63c79abaa93389d49e9e152 GIT binary patch literal 14493 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 literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java new file mode 100644 index 0000000..d876aa4 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java @@ -0,0 +1,16 @@ +package hello.springintroduction.controller; + +import hello.springintroduction.service.MemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; + +@Controller +public class MemberController { + + private final MemberService memberService; + + @Autowired + public MemberController(MemberService memberService) { + this.memberService = memberService; + } +} diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java index fe41fae..6714c20 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java @@ -1,9 +1,11 @@ package hello.springintroduction.repository; import hello.springintroduction.domain.Member; +import org.springframework.stereotype.Repository; import java.util.*; +@Repository public class MemoryMemberRepository implements MemberRepository { private static Map store = new HashMap<>(); diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java index 96d1d10..88e951e 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java @@ -2,14 +2,18 @@ package hello.springintroduction.service; import hello.springintroduction.domain.Member; import hello.springintroduction.repository.MemberRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; +@Service public class MemberService { private final MemberRepository memberRepository; + @Autowired public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } From 92a008b443c0a92d230de391de9c30b711660027 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Tue, 22 Dec 2020 22:21:30 +0900 Subject: [PATCH 16/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B9=88=EA=B3=BC=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EA=B4=80=EA=B3=84=20-=20'=EC=9E=90=EB=B0=94?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EC=A7=81=EC=A0=91=20=EC=8A=A4?= =?UTF-8?q?=ED=94=84=EB=A7=81=20=EB=B9=88=20=EB=93=B1=EB=A1=9D=ED=95=98?= =?UTF-8?q?=EA=B8=B0'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture14.md | 42 +++++++++++++++++++ .../springintroduction/SpringConfig.java | 21 ++++++++++ .../repository/MemoryMemberRepository.java | 2 - .../service/MemberService.java | 4 -- 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture14.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 7123a77..05adf9b 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -19,4 +19,5 @@ - [회원 서비스 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture12.md) ## 스프링 빈과 의존관계 -- [컴포넌트 스캔과 자동 의존관계 설정](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture13.md) \ No newline at end of file +- [컴포넌트 스캔과 자동 의존관계 설정](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture13.md) +- [자바 코드로 직접 스프링 빈 등록하기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture14.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture14.md b/SpringBoot-Introduction/Lectures/Lecture14.md new file mode 100644 index 0000000..3ffbaaf --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture14.md @@ -0,0 +1,42 @@ +# 자바 코드로 직접 스프링 빈 등록하기 +직접 설정 파일을 등록하는 방법이다. + +![스프링-컨테이너](https://user-images.githubusercontent.com/68052095/102889452-08514f00-449e-11eb-8317-8b56a7c7f88a.PNG) + +--- + +## @Configuration, @Bean +- 스프링이 실행될 때 `@Configuration` 어노테이션이 붙은 클래스를 읽고 `@Bean`이 선언된 메서드를 확인한다. +- 다음으로 확인한 메서드(`@Bean` 어노테이션이 선언되어 있는)를 호출해서 해당 메서드의 로직을 호출해서 스프링 빈에 등록해준다. +- 이후 의존관계 주입을 할 때 등록된 빈을 사용하게 한다. +- `Controller`의 경우는 어차피 스프링이 관리를 하기때문에 `@Controller`를 그대로 둔다. 또한 컴포넌트 스캔이기 때문에 `@Autowired` 어노테이션을 사용한다(다른 곳에서 설정할 수 있는게 아니므로). + +--- + +## 참고 + +### `DI`에는 `필드 주입`, `setter 주입`, `생성자 주입`의 3가지 방법이 있다. + +#### 필드 주입 +- 스프링을 사용할 때만 넣어주고 이후에 변경할 수 있는 방법이 없으므로 권장하지 않는다. + +#### setter 주입(setter 메서드에 @Autowired 선언) +- `setter`를 통해서 의존성이 주입된다. +- 생성은 생성대로 되고 `setter`를 나중에 호출해서 의존성을 주입해준다. +- 단점은 누군가가 호출했을 때 `public`으로 열려있어야 한다(처음에 세팅이 되어있으면 중간에 바꿀 일이 없는데 노출이 되어있기 때문에 잘못 변경하면 문제가 발생할 수 있다). + +#### 생성자 주입(가장 권장하는 방법) +- 처음에 애플리케이션이 조립(세팅)될 때 생성자로 의존성이 주입되고 끝난다(이후 변경이 불가능하게 막을 수 있다). +- 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다. + +### 컴포넌트 스캔 vs 직접 자바코드로 설정파일 만들어서 빈 등록하기 +- 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. **그리고 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.** + +직접 설정파일을 만들어서 등록하면 설정파일만 수정하면 다른 코드를 전혀 수정할 필요 없이 변경점을 적용할 수 있다. + +### 주의 +- `@Autowired` 를 통한 `DI`는 helloConroller , memberService 등과 같이 스프링이 관리하는 객체에서만 동작한다. +- 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다. +- 직접 `new`로 인스턴스를 생성하는 경우에도 `@Autowired`가 동작하지 않는다(스프링 컨테이너에 올라가지 않았기 때문). + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java new file mode 100644 index 0000000..ce308f9 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java @@ -0,0 +1,21 @@ +package hello.springintroduction; + +import hello.springintroduction.repository.MemberRepository; +import hello.springintroduction.repository.MemoryMemberRepository; +import hello.springintroduction.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 MemoryMemberRepository(); + } +} diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java index 6714c20..fe41fae 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/MemoryMemberRepository.java @@ -1,11 +1,9 @@ package hello.springintroduction.repository; import hello.springintroduction.domain.Member; -import org.springframework.stereotype.Repository; import java.util.*; -@Repository public class MemoryMemberRepository implements MemberRepository { private static Map store = new HashMap<>(); diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java index 88e951e..96d1d10 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java @@ -2,18 +2,14 @@ package hello.springintroduction.service; import hello.springintroduction.domain.Member; import hello.springintroduction.repository.MemberRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; -@Service public class MemberService { private final MemberRepository memberRepository; - @Autowired public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } From 4342ddcac0742394dd921f5350c2e1581ba168f0 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Tue, 22 Dec 2020 23:47:26 +0900 Subject: [PATCH 17/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EC=9B=B9=20MVC=20=EA=B0=9C=EB=B0=9C=20-=20'?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=9B=B9=20=EA=B8=B0=EB=8A=A5=20-=20?= =?UTF-8?q?=ED=99=88=20=ED=99=94=EB=A9=B4=20=EC=B6=94=EA=B0=80'=20?= =?UTF-8?q?=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 5 ++++- SpringBoot-Introduction/Lectures/Lecture15.md | 12 ++++++++++++ .../controller/HomeController.java | 13 +++++++++++++ .../src/main/resources/templates/home.html | 15 +++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture15.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HomeController.java create mode 100644 SpringBoot-Introduction/src/main/resources/templates/home.html diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 05adf9b..5d3629f 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -20,4 +20,7 @@ ## 스프링 빈과 의존관계 - [컴포넌트 스캔과 자동 의존관계 설정](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture13.md) -- [자바 코드로 직접 스프링 빈 등록하기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture14.md) \ No newline at end of file +- [자바 코드로 직접 스프링 빈 등록하기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture14.md) + +## 회원 관리 예제 - 웹 MVC 개발 +- [회원 웹 기능 - 홈 화면 추가](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture15.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture15.md b/SpringBoot-Introduction/Lectures/Lecture15.md new file mode 100644 index 0000000..b9f7822 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture15.md @@ -0,0 +1,12 @@ +# 회원 웹 기능 - 홈 화면 추가 + +--- + +## @GetMapping +- `("/")`에서 `/`는 도메인에 아무것도 입력하지 않고 접근한 url이다. +- 우선순위가 있다. + - 컨트롤러에 매핑된 메서드 -> 스태틱 파일 순으로 찾는다. + - 이는 정적 컨텐츠에서 설명한 것과 같은 맥락이다. + - 매핑된 메서드를 찾으면 해당 메서드를 호출한다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HomeController.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HomeController.java new file mode 100644 index 0000000..90fa88a --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/HomeController.java @@ -0,0 +1,13 @@ +package hello.springintroduction.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + + @GetMapping("/") + public String home() { + return "home"; + } +} diff --git a/SpringBoot-Introduction/src/main/resources/templates/home.html b/SpringBoot-Introduction/src/main/resources/templates/home.html new file mode 100644 index 0000000..109d59d --- /dev/null +++ b/SpringBoot-Introduction/src/main/resources/templates/home.html @@ -0,0 +1,15 @@ + + + +
+ + \ No newline at end of file From 34affd356db9f0002da30a042182f14c69ca497f Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 23 Dec 2020 00:22:05 +0900 Subject: [PATCH 18/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EC=9B=B9=20MVC=20=EA=B0=9C=EB=B0=9C=20-=20'?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=9B=B9=20=EA=B8=B0=EB=8A=A5=20-=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 ++- SpringBoot-Introduction/Lectures/Lecture16.md | 19 +++++++++++++++++++ .../controller/MemberController.java | 18 ++++++++++++++++++ .../controller/MemberForm.java | 13 +++++++++++++ .../templates/members/createMemberForm.html | 14 ++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture16.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberForm.java create mode 100644 SpringBoot-Introduction/src/main/resources/templates/members/createMemberForm.html diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 5d3629f..16d8b6c 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -23,4 +23,5 @@ - [자바 코드로 직접 스프링 빈 등록하기](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture14.md) ## 회원 관리 예제 - 웹 MVC 개발 -- [회원 웹 기능 - 홈 화면 추가](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture15.md) \ No newline at end of file +- [회원 웹 기능 - 홈 화면 추가](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture15.md) +- [회원 웹 기능 - 등록](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture16.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture16.md b/SpringBoot-Introduction/Lectures/Lecture16.md new file mode 100644 index 0000000..5e1723e --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture16.md @@ -0,0 +1,19 @@ +# 회원 웹 기능 - 등록 + +--- + +## Get방식 +- `url`에서 직접 접근하는 방식 +- 조회할 때 주로 사용하는 방식 +- 전달(데이터 등록)할 때는 `post`방식을 주로 사용한다. + +--- + +## form 태그 +- 값을 입력할 수 있는 `HTML` 태그 +- `method`에 `get`, `post`등을 지정한다. +- `input 태그`에서는 `name`이 서버로 넘어갈 때 `키(key)`가 된다. +- `action`에 지정된 `url`로 `post` 방식으로 값이 넘어간다. +- 값이 넘어갈 때 스프링이 알아서 `setName`을 통해서 `MemberForm`의 `name`에 값을 넣어준다(우리는 `getName`으로 꺼내면 된다). + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java index d876aa4..e8eb31e 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java @@ -1,8 +1,11 @@ package hello.springintroduction.controller; +import hello.springintroduction.domain.Member; import hello.springintroduction.service.MemberService; 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.PostMapping; @Controller public class MemberController { @@ -13,4 +16,19 @@ public class MemberController { public MemberController(MemberService memberService) { this.memberService = memberService; } + + @GetMapping("/members/new") + public String createForm() { + return "members/createMemberForm"; + } + + @PostMapping("/members/new") + public String create(MemberForm form) { + Member member = new Member(); + member.setName(form.getName()); + + memberService.join(member); + + return "redirect:/"; + } } diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberForm.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberForm.java new file mode 100644 index 0000000..0808118 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberForm.java @@ -0,0 +1,13 @@ +package hello.springintroduction.controller; + +public class MemberForm { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/SpringBoot-Introduction/src/main/resources/templates/members/createMemberForm.html b/SpringBoot-Introduction/src/main/resources/templates/members/createMemberForm.html new file mode 100644 index 0000000..c0353f2 --- /dev/null +++ b/SpringBoot-Introduction/src/main/resources/templates/members/createMemberForm.html @@ -0,0 +1,14 @@ + + + +
+
+
+ + +
+ +
+
+ + \ No newline at end of file From 4e136d93b0ff5dbf503ff944ec4d318e6b7992e9 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 23 Dec 2020 00:38:42 +0900 Subject: [PATCH 19/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=9A=8C=EC=9B=90=20=EA=B4=80=EB=A6=AC=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20-=20=EC=9B=B9=20MVC=20=EA=B0=9C=EB=B0=9C=20-=20'?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=20=EC=9B=B9=20=EA=B8=B0=EB=8A=A5=20-=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 ++- SpringBoot-Introduction/Lectures/Lecture17.md | 12 ++++++++++ .../controller/MemberController.java | 10 ++++++++ .../templates/members/memberList.html | 23 +++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture17.md create mode 100644 SpringBoot-Introduction/src/main/resources/templates/members/memberList.html diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 16d8b6c..33a895f 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -24,4 +24,5 @@ ## 회원 관리 예제 - 웹 MVC 개발 - [회원 웹 기능 - 홈 화면 추가](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture15.md) -- [회원 웹 기능 - 등록](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture16.md) \ No newline at end of file +- [회원 웹 기능 - 등록](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture16.md) +- [회원 웹 기능 - 조회](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture17.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture17.md b/SpringBoot-Introduction/Lectures/Lecture17.md new file mode 100644 index 0000000..41b67bb --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture17.md @@ -0,0 +1,12 @@ +# 회원 웹 기능 - 조회 + +--- + +## 템플릿 엔진 +- `${키}`은 모델안에 있는 해당 키의 값을 꺼내는 것이다. + - ex. `${members}`는 모델에서 `members`라는 키에 해당하는 값을 꺼내온다. +- `th:each="member : ${members}"` : `members` 리스트의 루프를 돌면서 객체를 하나씩 `member`에 할당한 뒤, 해당 태그 내부의 로직을 실행한다. 자바의 `for-each`문과 비슷하다. +- `${member.id}` : 위에서 할당된 `member` 객체에서 `getId`를 호출한 결과값이 할당된다. +- `${member.name}` : 위에서 할당된 `member` 객체에서 `getName`를 호출한 결과값이 할당된다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java index e8eb31e..67fb7c7 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java @@ -4,9 +4,12 @@ import hello.springintroduction.domain.Member; import hello.springintroduction.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 { @@ -31,4 +34,11 @@ public class MemberController { return "redirect:/"; } + + @GetMapping("/members") + public String list(Model model) { + List members = memberService.findMembers(); + model.addAttribute("members", members); + return "members/memberList"; + } } diff --git a/SpringBoot-Introduction/src/main/resources/templates/members/memberList.html b/SpringBoot-Introduction/src/main/resources/templates/members/memberList.html new file mode 100644 index 0000000..31aaf5e --- /dev/null +++ b/SpringBoot-Introduction/src/main/resources/templates/members/memberList.html @@ -0,0 +1,23 @@ + + + +
+
+ + + + + + + + + + + + + +
#이름
+
+
+ + \ No newline at end of file From f6d98eabf431c7b820eaf59858f5aa72d1ca0483 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 23 Dec 2020 02:31:56 +0900 Subject: [PATCH 20/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20DB=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=88=A0=20-=20'H2=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=84=A4=EC=B9=98'=20=EC=88=98?= =?UTF-8?q?=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 5 ++- SpringBoot-Introduction/Lectures/Lecutre18.md | 40 ++++++++++++++++++ ...2 데이터베이스가 정상 생성되지 않을 때.PNG | Bin 0 -> 57417 bytes SpringBoot-Introduction/sql/ddl.sql | 7 +++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecutre18.md create mode 100644 SpringBoot-Introduction/Lectures/images/H2 데이터베이스가 정상 생성되지 않을 때.PNG create mode 100644 SpringBoot-Introduction/sql/ddl.sql diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 33a895f..2682b6d 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -25,4 +25,7 @@ ## 회원 관리 예제 - 웹 MVC 개발 - [회원 웹 기능 - 홈 화면 추가](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture15.md) - [회원 웹 기능 - 등록](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture16.md) -- [회원 웹 기능 - 조회](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture17.md) \ No newline at end of file +- [회원 웹 기능 - 조회](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture17.md) + +## 스프링 DB 접근 기술 +- [H2 데이터베이스 설치](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture18.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecutre18.md b/SpringBoot-Introduction/Lectures/Lecutre18.md new file mode 100644 index 0000000..801fb4c --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecutre18.md @@ -0,0 +1,40 @@ +# H2 데이터베이스 설치 +- 실무에서는 데이터베이스에 데이터를 저장하고 관리한다. +- `H2 데이터베이스`는 교육용으로 굉장히 좋다. 용량도 작고 가볍고 웹으로 어드민 화면도 제공해준다. + +--- + +## H2 데이터베이스 +- [H2 데이터베이스](https://www.h2database.com) 압축파일 다운로드 및 설치, h2 데이터베이스 버전은 스프링 부트 버전에 맞춘다. +- 실행파일을 실행(Mac의 경우 권한추가 필요)하면 `H2 콘솔` 창이 뜬다. + - 권한 주기(Mac): chmod 755 h2.sh + - 실행(Mac): ./h2.sh +- 이때 포트번호 앞의 ip부분을 `localhost`로 변경하여 접근한다. +- 가장 먼저 데이터베이스 파일을 만들어야 한다. + +### 데이터베이스 파일 생성 방법 +- `JDBC URL`에 `jdbc:h2:~/test` (최초 한번) 입력후 연결. +- `~/test.mv.db` 파일 생성되었는지 확인(여기서 `~`은 C드라이브의 사용자 폴더(`home`)를 말함) +- 이후부터는 `jdbc:h2:tcp://localhost/~/test` 이렇게 접속한다(파일로 접근하면 애플리케이션이랑 웹 콘솔이랑 동시에 접근이 안되거나 오류가 날 수 있기 때문이다). + +![H2 데이터베이스가 정상 생성되지 않을 때](https://user-images.githubusercontent.com/68052095/102915621-72c9b580-44c5-11eb-8daa-923bc58f4308.PNG) + +--- + +## H2 데이터베이스 테이블 생성하기 + +테이블 관리를 위해 프로젝트 루트에 `sql/ddl.sq` 파일을 생성하여 정리한다. +``` +drop table if exists member CASCADE; +create table member +( +id bigint generated by default as identity, +name varchar(255), +primary key (id) +); +``` +- 자바의 `Long` 타입은 `DB`에서는 `bigint` 타입으로 선언한다. +- `generated by default as identity`를 선언하면 만약 `null`값, 즉 해당 컬럼에 값을 셋팅하지 않았다면 데이터가 들어왔을 때 `DB`가 자동으로 값을 채워준다. +- 쉽게 말하면 `DB야 너가 알아서 PK값 넣어줘`와 같다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/H2 데이터베이스가 정상 생성되지 않을 때.PNG b/SpringBoot-Introduction/Lectures/images/H2 데이터베이스가 정상 생성되지 않을 때.PNG new file mode 100644 index 0000000000000000000000000000000000000000..640b2f30b763f6d8e7b8e6ebc88f8f9b0e978b50 GIT binary patch literal 57417 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 z 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 Date: Wed, 23 Dec 2020 03:39:55 +0900 Subject: [PATCH 21/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20DB=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=88=A0=20-=20'=EC=88=9C=EC=88=98=20JDBC'=20?= =?UTF-8?q?=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecutre19.md | 237 ++++++++++++++++++ .../images/구현 클래스 추가 이미지.PNG | Bin 0 -> 17331 bytes .../무료버전의 application.properties.PNG | Bin 0 -> 18389 bytes .../Lectures/images/스프링 설정 이미지.PNG | Bin 0 -> 28603 bytes SpringBoot-Introduction/build.gradle | 2 + .../springintroduction/SpringConfig.java | 15 +- .../repository/JdbcMemberRepository.java | 152 +++++++++++ .../src/main/resources/application.properties | 4 +- 9 files changed, 409 insertions(+), 4 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecutre19.md create mode 100644 SpringBoot-Introduction/Lectures/images/구현 클래스 추가 이미지.PNG create mode 100644 SpringBoot-Introduction/Lectures/images/무료버전의 application.properties.PNG create mode 100644 SpringBoot-Introduction/Lectures/images/스프링 설정 이미지.PNG create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JdbcMemberRepository.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 2682b6d..c77735b 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -28,4 +28,5 @@ - [회원 웹 기능 - 조회](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture17.md) ## 스프링 DB 접근 기술 -- [H2 데이터베이스 설치](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture18.md) \ No newline at end of file +- [H2 데이터베이스 설치](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture18.md) +- [순수 JDBC](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture19.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecutre19.md b/SpringBoot-Introduction/Lectures/Lecutre19.md new file mode 100644 index 0000000..90689dc --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecutre19.md @@ -0,0 +1,237 @@ +# 순수 JDBC + +--- + +## 환경 설정 + +### build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가 +``` +implementation 'org.springframework.boot:spring-boot-starter-jdbc' +runtimeOnly 'com.h2database:h2' +``` +- 자바는 기본적으로 `DB`와 연결하려면 `jdbc` 드라이버(여기서는 `'org.springframework.boot:spring-boot-starter-jdbc'`)가 반드시 있어야 하며, 이를 통해 연동한다. + +### 스프링 부트 데이터베이스 연결 설정 추가(`resources/application.properties`에 추가) +``` +spring.datasource.url=jdbc:h2:tcp://localhost/~/test +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +``` +- `DB`와 연결될 때 데이터베이스가 제공하는 클라이언트(여기서는 `'com.h2database:h2'`)가 필요하다. +- `DB`와 연결하려면 접속정보를 넣어줘야 한다(`application.properties`에 기재). +- 이렇게 기재하면 스프링이 데이터베이스와 연결하는 작업을 다 해준다. 이제 갖다 쓰기만 하면된다. + +> **주의!** +> +>스프링부트 2.4부터는 spring.datasource.username=sa 를 꼭 추가해주어야 한다. 그렇지 않으면 Wrong user name or password 오류가 발생한다. 참고로 다음과 같이 마지막에 공백이 들어가면 같은 오류가 발생한다. spring.datasource.username=sa 공백 주의, 공백은 모두 제거해야 한다. + +> **참고** +> +> 인텔리J 커뮤니티(무료) 버전의 경우 application.properties 파일의 왼쪽이 다음 그림과 같이 회색으로 나온다. 엔터프라이즈(유료) 버전에서 제공하는 스프링의 소스 코드를 연결해주는 편의 기능이 빠진 것인데, 실제 동작하는데는 아무런 문제가 없다. +>![무료버전의 application properties](https://user-images.githubusercontent.com/68052095/102917070-e4a2fe80-44c7-11eb-9bd9-ee6c8545313c.PNG) + +--- + +## javax.sql.DataSource +- `DB`와 연동하기 위해 필요하다. +- 스프링한테 주입받아야 한다. + +--- + +## Jdbc 리포지토리 구현 +```java +public class JdbcMemberRepository implements MemberRepository { + private final DataSource dataSource; + + public JdbcMemberRepository(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public Member save(Member member) { + String sql = "insert into member(name) values(?)"; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + conn = getConnection(); + pstmt = conn.prepareStatement(sql, + Statement.RETURN_GENERATED_KEYS); + pstmt.setString(1, member.getName()); + pstmt.executeUpdate(); + rs = pstmt.getGeneratedKeys(); + if (rs.next()) { + member.setId(rs.getLong(1)); + } else { + throw new SQLException("id 조회 실패"); + } + return member; + } catch (Exception e) { + throw new IllegalStateException(e); + } finally { + close(conn, pstmt, rs); + } + } + + @Override + public Optional findById(Long id) { + String sql = "select * from member where id = ?"; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + conn = getConnection(); + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + rs = pstmt.executeQuery(); + if (rs.next()) { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + return Optional.of(member); + } else { + return Optional.empty(); + } + } catch (Exception e) { + throw new IllegalStateException(e); + } finally { + close(conn, pstmt, rs); + } + } + + @Override + public List findAll() { + String sql = "select * from member"; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + conn = getConnection(); + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + List members = new ArrayList<>(); + while (rs.next()) { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + members.add(member); + } + return members; + } catch (Exception e) { + throw new IllegalStateException(e); + } finally { + close(conn, pstmt, rs); + } + } + + @Override + public Optional findByName(String name) { + String sql = "select * from member where name = ?"; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + conn = getConnection(); + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, name); + rs = pstmt.executeQuery(); + if (rs.next()) { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + return Optional.of(member); + } + return Optional.empty(); + } catch (Exception e) { + throw new IllegalStateException(e); + } finally { + close(conn, pstmt, rs); + } + } + + private Connection getConnection() { + return DataSourceUtils.getConnection(dataSource); + } + + private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { + try { + if (rs != null) { + rs.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + try { + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + try { + if (conn != null) { + close(conn); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void close(Connection conn) throws SQLException { + DataSourceUtils.releaseConnection(conn, dataSource); + } +} +``` + +>**주의!** +> +>이렇게 JDBC API로 직접 코딩하는 것은 20년 전 이야기이다. 따라서 고대 개발자들이 이렇게 고생하고 살았구나 생각하고, 정신건강을 위해 참고만 하고 넘어가자. + +--- + +## 스프링 프레임워크에서 데이터베이스 Connection을 사용할 때 주의할 점 +- 반드시 `DataSourceUtils.getConnection()`을 통해서 `Connection`을 획득해야 한다. +- 트랜잭션이 걸리거나 했을 때 똑같은 데이터베이스 커넥션을 유지해야 하는데, 위의 방법으로 해야 유지시켜준다. + +```java +private Connection getConnection() { + return DataSourceUtils.getConnection(dataSource); +} +``` + +- 닫을 때도 `DataSourceUtils`를 이용해서 릴리즈 해줘야 한다. + +```java +private void close(Connection conn) throws SQLException { + DataSourceUtils.releaseConnection(conn, dataSource); +} +``` +--- + +## 추가 설명 + +- 스프링 부트는 데이터베이스 설정 파일를 보고 스프링 자체적으로 빈(데이터베이스와 연결할 수 있는 정보가 담긴 `DataSource`)도 생성해준다. + +- `DataSource`는 데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다. + +- `다형성을 활용한다` : 인터페이스를 두고 구현체를 바꿔끼우기 하는 것. + - 스프링은 이를 편리하게 할 수 있도록 스프링 컨테이너가 지원해준다. + - `DI` 덕분에 다형성을 편리하게 활용할 수 있다. + +- `어셈블리(조립)` : 기존의 코드는 하나도 손대지 않고 애플리케이션을 설정하는 것, 조립하는 코드만 약간 수정하면 실제 애플리케이션에 관련된 코드는 하나도 손대지 않아도 된다. + +--- + +## 구현 클래스 추가 이미지 +![구현 클래스 추가 이미지](https://user-images.githubusercontent.com/68052095/102921470-c6410100-44cf-11eb-95c9-b8a8750864a5.PNG) + +## 스프링 설정 이미지 +![스프링 설정 이미지](https://user-images.githubusercontent.com/68052095/102921465-c50fd400-44cf-11eb-925a-adabd373d6b2.PNG) + +- 개방-폐쇄 원칙(OCP, Open-Closed Principle) + - 확장에는 열려있고, 수정, 변경에는 닫혀있다. +- 스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 **구현 클래스를 변경**할 수 있다. +- 회원을 등록하고 DB에 결과가 잘 입력되는지 확인하자. +- 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/구현 클래스 추가 이미지.PNG b/SpringBoot-Introduction/Lectures/images/구현 클래스 추가 이미지.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7caa057511d5a7f4423ad050de7d83d787f19e30 GIT binary patch literal 17331 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 literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/Lectures/images/무료버전의 application.properties.PNG b/SpringBoot-Introduction/Lectures/images/무료버전의 application.properties.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5c7bcf65cbdc607846bf96430a1c7d83fc854cc9 GIT binary patch literal 18389 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 literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/Lectures/images/스프링 설정 이미지.PNG b/SpringBoot-Introduction/Lectures/images/스프링 설정 이미지.PNG new file mode 100644 index 0000000000000000000000000000000000000000..8c91caef63d1a74d9bb5f784dc894e1c7e1a0bf6 GIT binary patch literal 28603 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 findById(Long id) { + String sql = "select * from member where id = ?"; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + conn = getConnection(); + pstmt = conn.prepareStatement(sql); + pstmt.setLong(1, id); + rs = pstmt.executeQuery(); + if (rs.next()) { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + return Optional.of(member); + } else { + return Optional.empty(); + } + } catch (Exception e) { + throw new IllegalStateException(e); + } finally { + close(conn, pstmt, rs); + } + } + + @Override + public List findAll() { + String sql = "select * from member"; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + conn = getConnection(); + pstmt = conn.prepareStatement(sql); + rs = pstmt.executeQuery(); + List members = new ArrayList<>(); + while (rs.next()) { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + members.add(member); + } + return members; + } catch (Exception e) { + throw new IllegalStateException(e); + } finally { + close(conn, pstmt, rs); + } + } + + @Override + public Optional findByName(String name) { + String sql = "select * from member where name = ?"; + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + conn = getConnection(); + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, name); + rs = pstmt.executeQuery(); + if (rs.next()) { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + return Optional.of(member); + } + return Optional.empty(); + } catch (Exception e) { + throw new IllegalStateException(e); + } finally { + close(conn, pstmt, rs); + } + } + + private Connection getConnection() { + return DataSourceUtils.getConnection(dataSource); + } + + private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { + try { + if (rs != null) { + rs.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + try { + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + try { + if (conn != null) { + close(conn); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void close(Connection conn) throws SQLException { + DataSourceUtils.releaseConnection(conn, dataSource); + } +} \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/resources/application.properties b/SpringBoot-Introduction/src/main/resources/application.properties index 8b13789..f7b65c4 100644 --- a/SpringBoot-Introduction/src/main/resources/application.properties +++ b/SpringBoot-Introduction/src/main/resources/application.properties @@ -1 +1,3 @@ - +spring.datasource.url=jdbc:h2:tcp://localhost/~/test +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa \ No newline at end of file From eb3903fcf88d33e4103e06dd72872bdd28c0c54b Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 23 Dec 2020 19:39:46 +0900 Subject: [PATCH 22/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20DB=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=88=A0=20-=20'=EC=8A=A4=ED=94=84=EB=A7=81=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8'=20=EC=88=98?= =?UTF-8?q?=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecutre20.md | 38 +++++++++++++ .../service/MemberServiceIntegrationTest.java | 53 +++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecutre20.md create mode 100644 SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index c77735b..3248c90 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -29,4 +29,5 @@ ## 스프링 DB 접근 기술 - [H2 데이터베이스 설치](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture18.md) -- [순수 JDBC](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture19.md) \ No newline at end of file +- [순수 JDBC](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture19.md) +- [스프링 통합 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture20.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecutre20.md b/SpringBoot-Introduction/Lectures/Lecutre20.md new file mode 100644 index 0000000..f5adbcc --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecutre20.md @@ -0,0 +1,38 @@ +# 스프링 통합 테스트 +- 스프링 컨테이너와 DB까지 연결한 통합 테스트를 진행해보자. +- 순수한 자바 코드로 테스트할 수 없다(데이터베이스 커넥션 정보도 스프링 부트가 들고있는등의 이유로 인해). + +--- + +## 추가 설명 + +- 통합 테스트를 위해서는 직접 객체를 생성하는 것이 아니라 스프링 컨테이너에서 의존성을 가져와서 진행해야 한다. +- 사실 테스트는 제일 끝단에 있는 것이기 때문에 테스트 코드를 작성할 때는 가장 편한 방법을 사용하면 된다. +- 기존 코드들은 생성자를 통해 의존성을 주입하는 것이 좋지만 테스트 코드는 필요한 의존성을 주입한 뒤 테스트를 진행하면 끝이기 때문에 테스트 코드를 작성할 때 필드 기반으로 `@Autowired`를 사용하는 것도 편한 방법이다. + +--- + +## @SpringBootTest +- 스프링 컨테이너와 테스트를 함께 실행한다. +- 테스트를 실행하면 스프링 서버가 올라가고 테스트가 완료되면 서버가 내려간다. + +--- + +## @Transactional +- 데이터베이스는 기본적으로 트랜잭션이라는 개념이 있다. DB의 데이터를 수정할 경우 커밋을 해야 DB에 반영이 된다(`오토커밋` 이라는 것도 있다). +- 테스트가 끝난 뒤(DB의 데이터 수정을 마친 뒤)에 롤백해버리면 DB의 변경사항들이 반영이 되지 않는다. +- `@Transactional`를 테스트 클래스에 선언하면 테스트를 실행할 때 트랜잭션을 먼저 실행하고 DB의 데이터를 변경한 다음에 테스트가 끝나면 해당 데이터 변경사항들을 롤백해준다. 즉, 독립적으로 다음 테스트를 반복해서 실행할 수 있게 된다(이후 추가적으로 처리해주는 코드 없이도!). +- 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다. +- `@Transactional` 어노테이션을 서비스와 같은 것들에 선언하면 롤백하지 않고 정상적으로 동작하며, 테스트 케이스에 선언했을 때만 항상 롤백하도록 동작한다. +- `@Commit` 같은 어노테이션도 있다. + +--- + +## 단위 테스트 +- 순수하게 자바 코드로 진행하며, 최소단위로 진행되는 테스트이다. +- 가급적이면 순수한 단위 테스트가 훨씬 좋은 테스트일 확률이 높다. +- 그러므로 단위별로 쪼개서 테스트를 잘 할 수 있도록 해야하고 스프링 컨테이너 없이 테스트할 수 있도록 훈련해야 한다. +- 만약 스프링 컨테이너까지 올려서 테스트를 해야하는 상황이 발생한다면 그 테스트는 설계가 잘못되었을 확률이 높다. +- 통합 테스트도 물론 필요하지만 단위 테스트를 잘 만드는 것이 훨씬 좋은 테스트이다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java b/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java new file mode 100644 index 0000000..3b03abe --- /dev/null +++ b/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java @@ -0,0 +1,53 @@ +package hello.springintroduction.service; + +import hello.springintroduction.domain.Member; +import hello.springintroduction.repository.MemberRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +@SpringBootTest +@Transactional +class MemberServiceIntegrationTest { + + @Autowired MemberService memberService; + @Autowired MemberRepository memberRepository; + + @Test + void 회원가입() { + // given + Member member = new Member(); + member.setName("spring"); + + // when + Long saveId = memberService.join(member); + + // then + Member findMember = memberService.findOne(saveId).get(); + assertThat(member.getName()).isEqualTo(findMember.getName()); + } + + @Test + public void 중복_회원_예외() { + // given + Member member1 = new Member(); + member1.setName("spring"); + + Member member2 = new Member(); + member2.setName("spring"); + + // when + memberService.join(member1); + assertThatThrownBy(() -> memberService.join(member2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이미 존재하는 회원입니다."); + + // then + + } + +} \ No newline at end of file From 9a8c7445d9914027d5fa809057bfb648ad3a74ae Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 23 Dec 2020 19:42:21 +0900 Subject: [PATCH 23/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20=EC=98=A4=ED=83=88=EC=9E=90?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/{Lecutre18.md => Lecture18.md} | 0 SpringBoot-Introduction/Lectures/{Lecutre19.md => Lecture19.md} | 0 SpringBoot-Introduction/Lectures/{Lecutre20.md => Lecture20.md} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename SpringBoot-Introduction/Lectures/{Lecutre18.md => Lecture18.md} (100%) rename SpringBoot-Introduction/Lectures/{Lecutre19.md => Lecture19.md} (100%) rename SpringBoot-Introduction/Lectures/{Lecutre20.md => Lecture20.md} (100%) diff --git a/SpringBoot-Introduction/Lectures/Lecutre18.md b/SpringBoot-Introduction/Lectures/Lecture18.md similarity index 100% rename from SpringBoot-Introduction/Lectures/Lecutre18.md rename to SpringBoot-Introduction/Lectures/Lecture18.md diff --git a/SpringBoot-Introduction/Lectures/Lecutre19.md b/SpringBoot-Introduction/Lectures/Lecture19.md similarity index 100% rename from SpringBoot-Introduction/Lectures/Lecutre19.md rename to SpringBoot-Introduction/Lectures/Lecture19.md diff --git a/SpringBoot-Introduction/Lectures/Lecutre20.md b/SpringBoot-Introduction/Lectures/Lecture20.md similarity index 100% rename from SpringBoot-Introduction/Lectures/Lecutre20.md rename to SpringBoot-Introduction/Lectures/Lecture20.md From 3165f209e0b0707b676bbdd275530aeaa65a91c7 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 23 Dec 2020 22:31:59 +0900 Subject: [PATCH 24/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20DB=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=88=A0=20-=20'=EC=8A=A4=ED=94=84=EB=A7=81=20JdbcTem?= =?UTF-8?q?plate'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture21.md | 34 ++++++++++ .../springintroduction/SpringConfig.java | 4 +- .../JdbcTemplateMemberRepository.java | 64 +++++++++++++++++++ 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture21.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JdbcTemplateMemberRepository.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 3248c90..6c670fd 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -30,4 +30,5 @@ ## 스프링 DB 접근 기술 - [H2 데이터베이스 설치](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture18.md) - [순수 JDBC](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture19.md) -- [스프링 통합 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture20.md) \ No newline at end of file +- [스프링 통합 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture20.md) +- [스프링 JdbcTemplate](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture21.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture21.md b/SpringBoot-Introduction/Lectures/Lecture21.md new file mode 100644 index 0000000..70b5eac --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture21.md @@ -0,0 +1,34 @@ +# 스프링 JdbcTemplate +- 순수 Jdbc와 동일한 환경설정을 하면 된다. +- 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다. +- 실무에서도 많이 사용한다. +- 사용하기 위해서는 `org.springframework.jdbc.core.JdbcTemplate`가 필요하다. +- `org.springframework.jdbc.core.JdbcTemplate`는 주입 받을 수 있는 것은 아니며, `DataSource`를 주입 받는다. + +```java +private final JdbcTemplate jdbcTemplate; + + @Autowired + public JdbcTemplateMemberRepository(DataSource dataSource) { + jdbcTemplate = new JdbcTemplate(dataSource); + } +``` +- 위와 같은 형태로 사용한다. +- 이때 생성자가 단 하나만 있으면 스프링 빈으로 등록할 때 `@Autowired`를 생략할 수 있다. + +```java +private RowMapper memberRowMapper() { + return (rs, rowNum) -> { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + return member; + }; +} +``` + +- `디자인 패턴` 중에서 `템플릿 메서드 패턴`을 사용해서 중복을 제거하고 코드를 줄인 결과가 위의 코드이다. +- `JdbcTemplate`에서 쿼리를 날려서 나온 결과를 `RowMapper`를 통해서 매핑한 뒤, 그 결과를 리스트로 받아서 `Optional`로 변환시켜서 반환한다. +- `RowMapper`는 `resultSet` 결과를 `Member` 객체로 매핑하고 생성한 다음에 반환해준다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java index 369808c..d67cfab 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java @@ -1,6 +1,7 @@ package hello.springintroduction; import hello.springintroduction.repository.JdbcMemberRepository; +import hello.springintroduction.repository.JdbcTemplateMemberRepository; import hello.springintroduction.repository.MemberRepository; import hello.springintroduction.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; @@ -27,6 +28,7 @@ public class SpringConfig { @Bean public MemberRepository memberRepository() { // return new MemoryMemberRepository(); - return new JdbcMemberRepository(dataSource); +// return new JdbcMemberRepository(dataSource); + return new JdbcTemplateMemberRepository(dataSource); } } diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JdbcTemplateMemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JdbcTemplateMemberRepository.java new file mode 100644 index 0000000..b67b070 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JdbcTemplateMemberRepository.java @@ -0,0 +1,64 @@ +package hello.springintroduction.repository; + +import hello.springintroduction.domain.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.simple.SimpleJdbcInsert; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class JdbcTemplateMemberRepository implements MemberRepository { + + private final JdbcTemplate jdbcTemplate; + + @Autowired + public JdbcTemplateMemberRepository(DataSource dataSource) { + jdbcTemplate = new JdbcTemplate(dataSource); + } + + @Override + public Member save(Member member) { + SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate); + jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id"); + + Map parameters = new HashMap<>(); + parameters.put("name", member.getName()); + + Number key = jdbcInsert.executeAndReturnKey(new + MapSqlParameterSource(parameters)); + member.setId(key.longValue()); + return member; + } + + @Override + public Optional findById(Long id) { + List result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id); + return result.stream().findAny(); + } + + @Override + public Optional findByName(String name) { + List result = jdbcTemplate.query("select * from member where name = ? ", memberRowMapper(), name); + return result.stream().findAny(); + } + + @Override + public List findAll() { + return jdbcTemplate.query("select * from member", memberRowMapper()); + } + + private RowMapper memberRowMapper() { + return (rs, rowNum) -> { + Member member = new Member(); + member.setId(rs.getLong("id")); + member.setName(rs.getString("name")); + return member; + }; + } +} From 93d0b59e094c639754575818d0aa2c706cf0e88e Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Wed, 23 Dec 2020 23:43:39 +0900 Subject: [PATCH 25/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20DB=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=88=A0=20-=20'JPA'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture22.md | 145 ++++++++++++++++++ SpringBoot-Introduction/build.gradle | 3 +- .../springintroduction/SpringConfig.java | 16 +- .../springintroduction/domain/Member.java | 6 + .../repository/JpaMemberRepository.java | 45 ++++++ .../src/main/resources/application.properties | 4 +- .../service/MemberServiceIntegrationTest.java | 1 + 8 files changed, 212 insertions(+), 11 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture22.md create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JpaMemberRepository.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 6c670fd..a4b90e2 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -31,4 +31,5 @@ - [H2 데이터베이스 설치](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture18.md) - [순수 JDBC](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture19.md) - [스프링 통합 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture20.md) -- [스프링 JdbcTemplate](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture21.md) \ No newline at end of file +- [스프링 JdbcTemplate](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture21.md) +- [JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture22.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture22.md b/SpringBoot-Introduction/Lectures/Lecture22.md new file mode 100644 index 0000000..f36522e --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture22.md @@ -0,0 +1,145 @@ +# JPA +- JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다. +- JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다. +- JPA를 사용하면 개발 생산성을 크게 높일 수 있다. +- 객체를 JPA에 넣으면 JPA가 중간에서 DB에 SQL을 날리고 데이터를 가져오는 등의 처리를 JPA가 다 해준다. + +--- + +## build.gradle 파일에 JPA, h2 데이터베이스 관련 라이브러리 추가 +```java +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-web' + //implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + runtimeOnly 'com.h2database:h2' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } +} +``` + +- `spring-boot-starter-data-jpa` 는 내부에 `jdbc 관련 라이브러리를 포함`한다. 따라서 jdbc는 제거해도 된다. + +--- + +## 스프링 부트에 JPA 설정 추가 +`resources/application.properties` +```java +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 +``` + +>**주의** +> +>스프링부트 2.4부터는 spring.datasource.username=sa 를 꼭 추가해주어야 한다. 그렇지 않으면 오류가 발생한다. + +- `show-sql` : JPA가 생성하는 SQL을 출력한다. +- `ddl-auto` : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데 `none` 를 사용하면 해당 기능을 끈다. + - `create` 를 사용하면 엔티티 정보를 바탕으로 테이블도 직접 생성해준다. + +--- + +## JPA 엔티티 매핑 +- `JPA`를 사용하려면 먼저 `Entity`를 매핑해야한다. +- `JPA`는 인터페이스만 제공한다. 그리고 구현 기술들이 여러개가 있는데, 우리는 `Hibernate`만 사용한다고 생각하면 된다. +- `JPA`는 자바진영의 표준 인터페이스이고 구현은 여러 업체들이 하는 것이라 생각하면 된다. 각 업체별로 차이점이 조금씩 있다. +- `ORM(Object Relational Mapping)` : 객체와 관계형 데이터베이스의 테이블을 매핑한다는 뜻이다. +- `@Entity(javax.persistence.Entity)`를 클래스에 선언하면 해당 클래스는 `JPA`가 관리하는 엔티티가 된다. +- 그 다음으로는 `PK`를 매핑해줘야 한다(`@Id` 사용). 또, 현재 우리는 데이터베이스에서 자동으로 `ID`를 생성해주고 있는데 이를 `IDENTITY`전략이라고 부르며 `@GeneratedValue(strategy = GenerationType.IDENTITY)`로 선언한다. +- 특정 필드를 DB에 있는 특정 컬럼명과 매핑할 때, 해당 필드에 `@Column(name = "컬럼명")`을 선언해주면 된다. +- 이렇게 어노테이션들을 통해서 데이터베이스의 테이블과 매핑하면 `JPA`가 해당 정보를 가지고 각종 쿼리들을 처리해준다. + +--- + +## JPA 회원 리포지토리 +```java +@Transactional +public class JpaMemberRepository implements MemberRepository { + + private final EntityManager entityManager; + + public JpaMemberRepository(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Override + public Member save(Member member) { + entityManager.persist(member); + return member; + } + + @Override + public Optional findById(Long id) { + Member member = entityManager.find(Member.class, id); + return Optional.ofNullable(member); + } + + @Override + public Optional findByName(String name) { + List result = entityManager.createQuery("select m from Member m where m.name = :name", Member.class) + .setParameter("name", name) + .getResultList(); + + return result.stream().findAny(); + } + + @Override + public List findAll() { + return entityManager.createQuery("select m from Member m", Member.class) + .getResultList(); + } +} +``` + +- `'org.springframework.boot:spring-boot-starter-data-jpa'` 라이브러리를 받으면 스프링 부트가 자동으로 설정 정보와 데이터베이스 커넥션 정보등을 이용해서 `EntityManager`라는 것을 생성해준다. 그럼 우리는 이걸 그대로 주입받으면 된다. +- `JPA`는 `EntityManager`라는 것으로 모든게 동작한다. 결론적으로 `JPA`를 사용하려면 `EntityManager`를 주입받아야 한다. +- `EntityManager`는 내부적으로 `DataSource`를 가지고 있어서 DB와 통신하는 등의 행위를 알아서 처리한다. +- `persist` 는 영구저장(영속화)하다 라는 뜻이다. 이렇게 하면`JPA`가 알아서 `insert` 쿼리를 만들어 DB에 집어넣고 `setId`까지 모든걸 다 해준다. +- `inline` 단축키 : `Ctrl + Alt + N` +- `PK`의 경우는 그냥 조회할 수 있지만(`EntityManager.find()` 이용) 그 외에 `PK` 기반이 아닌 것들은 `JPQL`이라는 객체지향 쿼리언어를 사용해야 한다(거의 SQL과 똑같다). + - 객체를 대상으로 쿼리를 날리면 SQL로 번역이 된다. + - `select`의 대상이 객체(`Entity`) 그 자체이다. +- `JPA`를 사용하려면 항상 `@Transactional`이 선언되어 있어야 한다. +- `org.springframework.transaction.annotation.Transactional` 를 사용하자. +- 스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을 커밋한다. 만약 런타임 예외가 발생하면 롤백한다. +- JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다. + +--- + +## JPA를 사용하도록 스프링 설정 변경 + +```java +@Configuration +public class SpringConfig { + + private EntityManager entityManager; + + @Autowired + public SpringConfig(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Bean + public MemberService memberService() { + return new MemberService(memberRepository()); + } + + @Bean + public MemberRepository memberRepository() { +// return new MemoryMemberRepository(); +// return new JdbcMemberRepository(dataSource); +// return new JdbcTemplateMemberRepository(dataSource); + return new JpaMemberRepository(entityManager); + } +} +``` + +--- + +## 추가 설명 +- `spring-data-jpa`를 세팅하면 기본적으로 `Hibernate`라는 오픈소스 구현체가 사용된다. diff --git a/SpringBoot-Introduction/build.gradle b/SpringBoot-Introduction/build.gradle index 0ac91e6..3ca8d7b 100644 --- a/SpringBoot-Introduction/build.gradle +++ b/SpringBoot-Introduction/build.gradle @@ -15,7 +15,8 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' +// implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java index d67cfab..baeeaea 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java @@ -1,23 +1,22 @@ package hello.springintroduction; -import hello.springintroduction.repository.JdbcMemberRepository; -import hello.springintroduction.repository.JdbcTemplateMemberRepository; +import hello.springintroduction.repository.JpaMemberRepository; import hello.springintroduction.repository.MemberRepository; import hello.springintroduction.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import javax.sql.DataSource; +import javax.persistence.EntityManager; @Configuration public class SpringConfig { - private DataSource dataSource; + private EntityManager entityManager; @Autowired - public SpringConfig(DataSource dataSource) { - this.dataSource = dataSource; + public SpringConfig(EntityManager entityManager) { + this.entityManager = entityManager; } @Bean @@ -29,6 +28,7 @@ public class SpringConfig { public MemberRepository memberRepository() { // return new MemoryMemberRepository(); // return new JdbcMemberRepository(dataSource); - return new JdbcTemplateMemberRepository(dataSource); +// return new JdbcTemplateMemberRepository(dataSource); + return new JpaMemberRepository(entityManager); } -} +} \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java index 222ae03..1f4aab3 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/domain/Member.java @@ -1,7 +1,13 @@ package hello.springintroduction.domain; +import javax.persistence.*; + +@Entity public class Member { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + private String name; public Long getId() { diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JpaMemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JpaMemberRepository.java new file mode 100644 index 0000000..1aba523 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/JpaMemberRepository.java @@ -0,0 +1,45 @@ +package hello.springintroduction.repository; + +import hello.springintroduction.domain.Member; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import java.util.List; +import java.util.Optional; + +@Transactional +public class JpaMemberRepository implements MemberRepository { + + private final EntityManager entityManager; + + public JpaMemberRepository(EntityManager entityManager) { + this.entityManager = entityManager; + } + + @Override + public Member save(Member member) { + entityManager.persist(member); + return member; + } + + @Override + public Optional findById(Long id) { + Member member = entityManager.find(Member.class, id); + return Optional.ofNullable(member); + } + + @Override + public Optional findByName(String name) { + List result = entityManager.createQuery("select m from Member m where m.name = :name", Member.class) + .setParameter("name", name) + .getResultList(); + + return result.stream().findAny(); + } + + @Override + public List findAll() { + return entityManager.createQuery("select m from Member m", Member.class) + .getResultList(); + } +} \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/resources/application.properties b/SpringBoot-Introduction/src/main/resources/application.properties index f7b65c4..8e34fa9 100644 --- a/SpringBoot-Introduction/src/main/resources/application.properties +++ b/SpringBoot-Introduction/src/main/resources/application.properties @@ -1,3 +1,5 @@ spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.username=sa \ No newline at end of file +spring.datasource.username=sa +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=none \ No newline at end of file diff --git a/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java b/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java index 3b03abe..4ed37a5 100644 --- a/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java +++ b/SpringBoot-Introduction/src/test/java/hello/springintroduction/service/MemberServiceIntegrationTest.java @@ -5,6 +5,7 @@ import hello.springintroduction.repository.MemberRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Commit; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; From f767d1227c7504888b7bb0279436f6b5af1af84c Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Thu, 24 Dec 2020 03:50:22 +0900 Subject: [PATCH 26/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20=EC=8A=A4=ED=94=84=EB=A7=81=20DB=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=88=A0=20-=20'=EC=8A=A4=ED=94=84=EB=A7=81=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20JPA'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture23.md | 82 ++++++++++++++++++ .../images/스프링 데이터 JPA 제공 클래스.PNG | Bin 0 -> 58083 bytes .../springintroduction/SpringConfig.java | 19 ++-- .../SpringDataJpaMemberRepository.java | 12 +++ 5 files changed, 104 insertions(+), 12 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture23.md create mode 100644 SpringBoot-Introduction/Lectures/images/스프링 데이터 JPA 제공 클래스.PNG create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/SpringDataJpaMemberRepository.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index a4b90e2..25bd399 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -32,4 +32,5 @@ - [순수 JDBC](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture19.md) - [스프링 통합 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture20.md) - [스프링 JdbcTemplate](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture21.md) -- [JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture22.md) \ No newline at end of file +- [JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture22.md) +- [스프링 데이터 JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture23.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture23.md b/SpringBoot-Introduction/Lectures/Lecture23.md new file mode 100644 index 0000000..fceaa29 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture23.md @@ -0,0 +1,82 @@ +# 스프링 데이터 JPA +- `스프링 부트`와 `JPA`만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어든다. +-여기에 `스프링 데이터 JPA`를 사용하면 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있다. +- 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다. +- 스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어든다. +- 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있다. +- 실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수이다. + +>**주의** +> +>스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 한다. + +--- + +## SpringDataJpaRepository 인터페이스 생성 +```java +public interface SpringDataJpaMemberRepository extends JpaRepository, MemberRepository { + + @Override + Optional findByName(String name); +} +``` + +- `org.springframework.data.jpa.repository.JpaRepository`를 상속받는다. +- 인터페이스는 인터페이스를 `상속(extends)` 받는다(`구현(implements)`-말고). +- `JpaRepository`의 제네릭 타입은 `Entity`와 `ID`로 지정해야 하며, 각각 `Entity`가 선언된 클래스 타입과 해당 클래스의 `PK` 타입을 지정한다. +- 인터페이스는 다중 상속이 된다. +- `스프링 데이터 JPA`는 `JpaRepository`를 상속받는 인터페이스의 구현체를 `프록시`라는 기능을 이용해서 자동으로 만들어 스프링 빈에 자동으로 등록해준다. 우리는 그걸 그냥 가져다가 쓰는 것이다. + +--- + +## 스프링 데이터 JPA 회원 리포지토리를 사용하도록 스프링 설정 변경 + +```java +@Configuration +public class SpringConfig { + + private final MemberRepository memberRepository; + + @Autowired + public SpringConfig(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + @Bean + public MemberService memberService() { + return new MemberService(memberRepository); + } +} +``` + +- 위의 `SpringConfig` 생성자에 `MemberRepository`는 다음과 같이 주입된다. +- 스프링 컨테이너에서 `MemberRepository`를 찾는다. 이때 `MemberRepository`는 `스프링 데이터 JPA`가 만들고 빈으로 등록해줬던 구현체가(를) 주입된다(주입 받을 수 있다). +- `스프링 데이터 JPA`는 `JPA`의 기술을 그대로 가져다 쓰기 때문에 로그가 동일하게 나온다. + +--- + +## 스프링 데이터 JPA 제공 클래스 +![스프링 데이터 JPA 제공 클래스](https://user-images.githubusercontent.com/68052095/103027431-310a3f00-4599-11eb-8cc5-1e2d7a02b86f.PNG) + +- 기본적으로 `JpaRepository` 인터페이스에서 공통적인 메서드를 제공해준다. +- 하지만 예를 들어, 이름으로 찾는다던지 이메일로 찾는다던지 공통적이지 않은 경우 메서드를 정의해줘야 한다. + - ex. 메서드명이 `findByName`일 경우, `스프링 데이터 JPA`가 규칙에 따라 되어있는 `select m from Member m where m.name = ?`라는 `JPQL` 쿼리를 짜준다. + - 이와 같이 인터페이스 이름만으로 개발을 끝낼 수 있다. + - 메서드명과 반환타입, 파라미터 등을 `리플렉션` 기술로 읽어들여서 쿼리로 풀어낸다. + +--- + +## 스프링 데이터 JPA 제공 기능 +- 인터페이스를 통한 기본적인 `CRUD` 기능 제공 +- `findByName()` , `findByEmail()` 처럼 `메서드 이름 만으로 조회 기능` 제공 +- `페이징 기능` 자동 제공 + +--- + +## 참고 +- 실무에서는 `JPA`와 `스프링 데이터 JPA`를 기본으로 사용하고, `복잡한 동적 쿼리`는 `Querydsl`이라는 라이브러리를 사용하면 된다. +- `Querydsl`을 사용하면 쿼리도 자바 코드로 안전하게 작성할 수 있고, 동적 +쿼리도 편리하게 작성할 수 있다. +- 이 조합으로 해결하기 어려운 쿼리는 `JPA`가 제공하는 `네이티브 쿼리(직접 쿼리를 짜는 것)`를 사용하거나, 앞서 학습한 스프링 `JdbcTemplate`를 사용하면 된다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/스프링 데이터 JPA 제공 클래스.PNG b/SpringBoot-Introduction/Lectures/images/스프링 데이터 JPA 제공 클래스.PNG new file mode 100644 index 0000000000000000000000000000000000000000..00eeebdfe618d074560a0d4e31faaceb520ec0ef GIT binary patch literal 58083 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 literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java index baeeaea..e2018fd 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java @@ -1,34 +1,31 @@ package hello.springintroduction; -import hello.springintroduction.repository.JpaMemberRepository; import hello.springintroduction.repository.MemberRepository; import hello.springintroduction.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import javax.persistence.EntityManager; - @Configuration public class SpringConfig { - private EntityManager entityManager; + private final MemberRepository memberRepository; @Autowired - public SpringConfig(EntityManager entityManager) { - this.entityManager = entityManager; + public SpringConfig(MemberRepository memberRepository) { + this.memberRepository = memberRepository; } @Bean public MemberService memberService() { - return new MemberService(memberRepository()); + return new MemberService(memberRepository); } - @Bean - public MemberRepository memberRepository() { +// @Bean +// public MemberRepository memberRepository() { // return new MemoryMemberRepository(); // return new JdbcMemberRepository(dataSource); // return new JdbcTemplateMemberRepository(dataSource); - return new JpaMemberRepository(entityManager); - } +// return new JpaMemberRepository(entityManager); +// } } \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/SpringDataJpaMemberRepository.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/SpringDataJpaMemberRepository.java new file mode 100644 index 0000000..43795bf --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/repository/SpringDataJpaMemberRepository.java @@ -0,0 +1,12 @@ +package hello.springintroduction.repository; + +import hello.springintroduction.domain.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface SpringDataJpaMemberRepository extends JpaRepository, MemberRepository { + + @Override + Optional findByName(String name); +} From d8db3463c5b26ac4e0b3d6e3a56e69799dfc12bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?DESKTOP-QSP5N3H=5C=EB=B0=B0=EC=9E=AC=ED=99=8D?= Date: Fri, 25 Dec 2020 00:15:52 +0900 Subject: [PATCH 27/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20AOP=20-=20'AOP=EA=B0=80=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=83=81=ED=99=A9'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 5 ++- SpringBoot-Introduction/Lectures/Lecture24.md | 21 ++++++++++++ .../service/MemberService.java | 32 ++++++++++++++----- 3 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture24.md diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index 25bd399..ed3086d 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -33,4 +33,7 @@ - [스프링 통합 테스트](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture20.md) - [스프링 JdbcTemplate](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture21.md) - [JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture22.md) -- [스프링 데이터 JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture23.md) \ No newline at end of file +- [스프링 데이터 JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture23.md) + +## AOP +- [AOP가 필요한 상황](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture24.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture24.md b/SpringBoot-Introduction/Lectures/Lecture24.md new file mode 100644 index 0000000..277dc90 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture24.md @@ -0,0 +1,21 @@ +# AOP가 필요한 상황 +- 만약 모든 메소드의 호출 시간을 측정하고 싶다면? +- `공통 관심 사항(cross-cutting concern)` vs `핵심 관심 사항(core concern)` +- 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면? +- 즉, `공통 관심 사항`과 `핵심 관심 사항`을 분리해서 적용하고 싶을 때 사용한다. + +--- + +## 추가설명 +- 실제 운영에서는 처음에 서버를 올리고 이것저것 호출하는 `warmUp`이라는 것을 한다. + +--- + +## 문제 +- 회원가입, 회원 조회에 시간을 측정하는 기능은 `핵심 관심 사항(핵심 비즈니스 로직)`이 아니다. +- 시간을 측정하는 로직은 `공통 관심 사항(공통 비즈니스 로직)`이다. +- 시간을 측정하는 로직과 `핵심 비즈니스의 로직`이 섞여서 유지보수가 어렵다. +- 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다. +- 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다. + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java index 96d1d10..a4da9eb 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java @@ -18,24 +18,40 @@ public class MemberService { * 회원 가입 */ public Long join(Member member) { - // 같은 이름이 있는 중복 회원X - validateDuplicateMember(member); // 중복 회원 검증 - memberRepository.save(member); - return member.getId(); + + long start = System.currentTimeMillis(); + + try { + // 같은 이름이 있는 중복 회원X + validateDuplicateMember(member); // 중복 회원 검증 + memberRepository.save(member); + return member.getId(); + } finally { + long finish = System.currentTimeMillis(); + long timeMs = finish - start; + System.out.println("join = " + timeMs + "ms"); + } } private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) - .ifPresent(mem -> { - throw new IllegalArgumentException("이미 존재하는 회원입니다."); - }); + .ifPresent(mem -> { + throw new IllegalArgumentException("이미 존재하는 회원입니다."); + }); } /* * 전체 회원 조회 */ public List findMembers() { - return memberRepository.findAll(); + long start = System.currentTimeMillis(); + try { + return memberRepository.findAll(); + } finally { + long finish = System.currentTimeMillis(); + long timeMs = finish - start; + System.out.println("findMembers = " + timeMs + "ms"); + } } /* From 4399adf988c52a040bf9e51fa61ac5182d3cea96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?DESKTOP-QSP5N3H=5C=EB=B0=B0=EC=9E=AC=ED=99=8D?= Date: Fri, 25 Dec 2020 02:13:31 +0900 Subject: [PATCH 28/28] =?UTF-8?q?[=EA=B9=80=EC=98=81=ED=95=9C=EB=8B=98?= =?UTF-8?q?=EC=9D=98=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=9E=85=EB=AC=B8=20?= =?UTF-8?q?-=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EB=B0=B0=EC=9A=B0=EB=8A=94?= =?UTF-8?q?=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EB=B6=80=ED=8A=B8,=20?= =?UTF-8?q?=EC=9B=B9=20MVC,=20DB=20=EC=A0=91=EA=B7=BC=20=EA=B8=B0=EC=88=A0?= =?UTF-8?q?]=20AOP=20-=20'AOP=20=EC=A0=81=EC=9A=A9'=20=EC=88=98=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpringBoot-Introduction/Lectures/Contents.md | 3 +- SpringBoot-Introduction/Lectures/Lecture25.md | 73 ++++++++++++++++++ .../Lectures/images/AOP 적용 전 의존관계.PNG | Bin 0 -> 44604 bytes .../Lectures/images/AOP 적용 전 전체그림.PNG | Bin 0 -> 29748 bytes .../Lectures/images/AOP 적용 후 의존관계.PNG | Bin 0 -> 57632 bytes .../Lectures/images/AOP 적용 후 전체그림.PNG | Bin 0 -> 76101 bytes .../Lectures/images/공통 관심 사항.PNG | Bin 0 -> 46646 bytes .../springintroduction/SpringConfig.java | 23 ++++-- .../springintroduction/aop/TimeTraceAop.java | 24 ++++++ .../controller/MemberController.java | 1 + .../service/MemberService.java | 9 +-- 11 files changed, 116 insertions(+), 17 deletions(-) create mode 100644 SpringBoot-Introduction/Lectures/Lecture25.md create mode 100644 SpringBoot-Introduction/Lectures/images/AOP 적용 전 의존관계.PNG create mode 100644 SpringBoot-Introduction/Lectures/images/AOP 적용 전 전체그림.PNG create mode 100644 SpringBoot-Introduction/Lectures/images/AOP 적용 후 의존관계.PNG create mode 100644 SpringBoot-Introduction/Lectures/images/AOP 적용 후 전체그림.PNG create mode 100644 SpringBoot-Introduction/Lectures/images/공통 관심 사항.PNG create mode 100644 SpringBoot-Introduction/src/main/java/hello/springintroduction/aop/TimeTraceAop.java diff --git a/SpringBoot-Introduction/Lectures/Contents.md b/SpringBoot-Introduction/Lectures/Contents.md index ed3086d..0e8fbe7 100644 --- a/SpringBoot-Introduction/Lectures/Contents.md +++ b/SpringBoot-Introduction/Lectures/Contents.md @@ -36,4 +36,5 @@ - [스프링 데이터 JPA](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture23.md) ## AOP -- [AOP가 필요한 상황](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture24.md) \ No newline at end of file +- [AOP가 필요한 상황](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture24.md) +- [AOP 적용](https://github.com/banjjoknim/TIL/blob/master/SpringBoot-Introduction/Lectures/Lecture25.md) \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/Lecture25.md b/SpringBoot-Introduction/Lectures/Lecture25.md new file mode 100644 index 0000000..5f01481 --- /dev/null +++ b/SpringBoot-Introduction/Lectures/Lecture25.md @@ -0,0 +1,73 @@ +# AOP 적용 +- `AOP`: `Aspect Oriented Programming(관점지향 프로그래밍)` +- `공통 관심 사항(cross-cutting concern)` vs `핵심 관심 사항(core concern)` 분리 + +![공통 관심 사항](https://user-images.githubusercontent.com/68052095/103096266-b861bc00-4646-11eb-887a-61f9bc0468f4.PNG) + +- `AOP`를 이용하면 `공통 관심 사항`에 대한 로직을 한 군데에 다 모아두고 원하는 곳에만 지정하여 적용할 수 있다. + +```java +@Aspect +@Component +public class TimeTraceAop { + + @Around("execution(* hello.springintroduction..*(..))") + public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { + long start = System.currentTimeMillis(); + System.out.println("START: " + joinPoint.toString()); + try { + return joinPoint.proceed(); + } finally { + long finish = System.currentTimeMillis(); + long timeMs = finish - start; + System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms"); + } + } +} +``` + +- `AOP`는 `@Aspect` 어노테이션을 선언해야 사용할 수 있다. +- `ProceedingJoinPoint`???? +- `joinPoint.proceed()`를 호출하면 다음 메서드로 진행할 수 있다. +- `joinPoint.toString()`를 통해서 어떤 메서드를 호출했는지 이름을 다 얻을 수 있다. +- `AOP`는 설정 파일을 이용해 스프링의 빈으로 등록해서 사용하는 것을 선호한다. 평범한 서비스, 리포지토리와 같은 것들은 정형화해서 사용할 수 있지만, `AOP`의 경우에는 `AOP`임을 인지할 수 있도록 빈으로 직접 등록하는 것이 낫다(강의에서는 간단하게 컴포넌트스캔 사용). +- 그리고 `AOP`를 사용하기 위해서는 `@Around()`를 선언해서 괄호 안에 공통 관심사를 어디에 적용할 것인지를 지정해줘야 한다. +- `@Around("execution(* hello.springintroduction..*(..))")` 에서 `"execution(* hello.springintroduction..*(..))"`는 `hello.springintroduction` 패키지의 하위에는 전부 적용하라 라는 뜻이다. +- `joinPoint`는 메서드가 호출될 때마다 중간에서 인터셉트(?)가 걸려서 메서드 `execute`가 호출된다. 조건을 걸어서 메서드 호출 등을 조작할 수도 있다. + +--- + +## 해결 +- 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다. +- 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다. +- 핵심 관심 사항을 깔끔하게 유지할 수 있다. +- 변경이 필요하면 이 로직만 변경하면 된다. +- 원하는 적용 대상을 선택할 수 있다(보통 패키지레벨로 많이 한다). + +--- + +## 스프링의 AOP 동작 방식 + +### AOP 적용 전 의존관계 +![AOP 적용 전 의존관계](https://user-images.githubusercontent.com/68052095/103100515-41342400-4656-11eb-9aa1-961ab06a3432.PNG) +- 컨트롤러에서 서비스를 호출할 때 의존관계를 이용해서 호출한다. + +### AOP 적용 후 의존관계 +![AOP 적용 후 의존관계](https://user-images.githubusercontent.com/68052095/103100513-409b8d80-4656-11eb-9da4-23fb85a71e78.PNG) +- `AOP`를 적용하고 어디에 적용할지 지정을 하면 의존관계가 있는 서비스가 지정된다. +- 스프링은 `AOP`가 있으면 가짜 서비스를 만들어낸다(프록시라는 기술을 사용한다). +- `AOP`를 적용하면 스프링 컨테이너는 스프링이 올라올 때(스프링 빈을 등록할 때) 진짜 스프링 빈 말고 가짜 스프링 빈을 앞에 세워둔다. +- 그리고 가짜 스프링 빈이 끝나고(?), `joinPoint.proceed()`를 호출하면 내부적인 처리를 거쳐 진짜 스프링 빈을 호출한다. 즉, 컨트롤러가 호출하는 건 진짜 서비스가 아닌 프록시라는 기술로 발생하는 가짜 서비스이다. +- 실제로 서비스가 주입될 때 프록시(가짜 서비스)를 콘솔에서 확인할 수도 있다. +- 콘솔 로그를 보면 `memberService = class hello.springintroduction.service.MemberService$$EnhancerBySpringCGLIB$$6974282c` 라고 해서, `EnhancerBySpringCGLIB`을 확인할 수 있다. 여기서는 `MemberService`를 복제해서 코드를 조작하는 기술이다. +- 스프링 컨테이너가 `AOP`가 적용되면 프록시(가짜)를 통해서 `AOP`가 실행이 되고 다음으로 `joinPoint.proceed()`가 호출되면 진짜 서비스가 호출된다. +- 컨테이너에서 스프링 빈을 관리하면 가짜를 만들어서 `DI`를 해줄 수 있다. 그렇기 때문에 `DI`함으로써(이때 프록시가 주입된다) `AOP`가 가능해진다. +- 스프링에서는 이를 `프록시 방식의 AOP`라고 하며, 아예 자바에서 컴파일할 때 코드를 생성해서 코드를 위아래로 박아서 넣어주는 기술들도 있다(?). + +### AOP 적용 전 전체그림 +![AOP 적용 전 전체그림](https://user-images.githubusercontent.com/68052095/103100512-4002f700-4656-11eb-9d0c-e4070ab70785.PNG) + +### AOP 적용 후 전체그림 +![AOP 적용 후 전체그림](https://user-images.githubusercontent.com/68052095/103100508-3ed1ca00-4656-11eb-9bbc-7907abbbeb65.PNG) + +--- \ No newline at end of file diff --git a/SpringBoot-Introduction/Lectures/images/AOP 적용 전 의존관계.PNG b/SpringBoot-Introduction/Lectures/images/AOP 적용 전 의존관계.PNG new file mode 100644 index 0000000000000000000000000000000000000000..e6c31d55cb4fdf5950b4ff7112376b3fe1a198dd GIT binary patch literal 44604 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 Gi~j|485d&! literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/Lectures/images/AOP 적용 후 의존관계.PNG b/SpringBoot-Introduction/Lectures/images/AOP 적용 후 의존관계.PNG new file mode 100644 index 0000000000000000000000000000000000000000..53606e616eaaddfedd52e2cd215d35970fccfdeb GIT binary patch literal 57632 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�*RPn7Ui~zuJ2wbY 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 QK?7cw)pS(zRm=nbAG)qoR{#J2 literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/Lectures/images/AOP 적용 후 전체그림.PNG b/SpringBoot-Introduction/Lectures/images/AOP 적용 후 전체그림.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ec0e63e88df5342d7749abd8e57a26d64c5a7a41 GIT binary patch literal 76101 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

^=cC@G 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
$2M8 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 u6r`t1^P1Q9?xd$?{4eVLxA;qunED@H66{I< literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/Lectures/images/공통 관심 사항.PNG b/SpringBoot-Introduction/Lectures/images/공통 관심 사항.PNG new file mode 100644 index 0000000000000000000000000000000000000000..528c507b55e50658d1b9c879733a422e15d2b7cc GIT binary patch literal 46646 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 E1sq&3U;qFB literal 0 HcmV?d00001 diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java index e2018fd..76ce4d5 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/SpringConfig.java @@ -1,7 +1,9 @@ package hello.springintroduction; +import hello.springintroduction.aop.TimeTraceAop; import hello.springintroduction.repository.MemberRepository; import hello.springintroduction.service.MemberService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -21,11 +23,16 @@ public class SpringConfig { return new MemberService(memberRepository); } -// @Bean -// public MemberRepository memberRepository() { -// return new MemoryMemberRepository(); -// return new JdbcMemberRepository(dataSource); -// return new JdbcTemplateMemberRepository(dataSource); -// return new JpaMemberRepository(entityManager); -// } -} \ No newline at end of file + // @Bean + // public TimeTraceAop timeTraceAop() { + // return new TimeTraceAop(); + // } + + // @Bean + // public MemberRepository memberRepository() { + // return new MemoryMemberRepository(); + // return new JdbcMemberRepository(dataSource); + // return new JdbcTemplateMemberRepository(dataSource); + // return new JpaMemberRepository(entityManager); + // } +} diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/aop/TimeTraceAop.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/aop/TimeTraceAop.java new file mode 100644 index 0000000..02b92f5 --- /dev/null +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/aop/TimeTraceAop.java @@ -0,0 +1,24 @@ +package hello.springintroduction.aop; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +@Aspect +@Component +public class TimeTraceAop { + + @Around("execution(* hello.springintroduction..*(..))") + public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { + long start = System.currentTimeMillis(); + System.out.println("START: " + joinPoint.toString()); + try { + return joinPoint.proceed(); + } finally { + long finish = System.currentTimeMillis(); + long timeMs = finish - start; + System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms"); + } + } +} diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java index 67fb7c7..b7e40d6 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/controller/MemberController.java @@ -18,6 +18,7 @@ public class MemberController { @Autowired public MemberController(MemberService memberService) { this.memberService = memberService; + System.out.println("memberService = " + memberService.getClass()); } @GetMapping("/members/new") diff --git a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java index a4da9eb..4145544 100644 --- a/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java +++ b/SpringBoot-Introduction/src/main/java/hello/springintroduction/service/MemberService.java @@ -44,14 +44,7 @@ public class MemberService { * 전체 회원 조회 */ public List findMembers() { - long start = System.currentTimeMillis(); - try { - return memberRepository.findAll(); - } finally { - long finish = System.currentTimeMillis(); - long timeMs = finish - start; - System.out.println("findMembers = " + timeMs + "ms"); - } + return memberRepository.findAll(); } /*