From 70818f19a88313fb7133bd3bd58694440c4232bd Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 23 Jun 2023 19:02:05 +0900 Subject: [PATCH 01/40] =?UTF-8?q?FEAT=20:=20domain,=20controller,=20reposi?= =?UTF-8?q?tory,=20service=EB=8B=A8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 68 ++++ mvnw | 316 ++++++++++++++++++ mvnw.cmd | 188 +++++++++++ pom.xml | 47 +++ .../java/com/prgrms/spring/Application.java | 13 + .../spring/config/AppConfiguration.java | 9 + .../spring/controller/AppController.java | 32 ++ .../controller/voucher/VoucherController.java | 35 ++ .../prgrms/spring/domain/menu/MenuType.java | 25 ++ .../domain/voucher/FixedAmountVoucher.java | 27 ++ .../voucher/PercentDiscountVoucher.java | 27 ++ .../prgrms/spring/domain/voucher/Voucher.java | 8 + .../spring/domain/voucher/VoucherType.java | 25 ++ .../voucher/MemoryVoucherRepository.java | 28 ++ .../voucher/VoucherRepository.java | 14 + .../service/voucher/VoucherService.java | 44 +++ src/main/resources/application.properties | 1 + .../com/prgrms/spring/ApplicationTests.java | 13 + 18 files changed, 920 insertions(+) create mode 100644 .gitignore create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml create mode 100644 src/main/java/com/prgrms/spring/Application.java create mode 100644 src/main/java/com/prgrms/spring/config/AppConfiguration.java create mode 100644 src/main/java/com/prgrms/spring/controller/AppController.java create mode 100644 src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java create mode 100644 src/main/java/com/prgrms/spring/domain/menu/MenuType.java create mode 100644 src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java create mode 100644 src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java create mode 100644 src/main/java/com/prgrms/spring/domain/voucher/Voucher.java create mode 100644 src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java create mode 100644 src/main/java/com/prgrms/spring/infrastructure/voucher/MemoryVoucherRepository.java create mode 100644 src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java create mode 100644 src/main/java/com/prgrms/spring/service/voucher/VoucherService.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/prgrms/spring/ApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..ecee04789b --- /dev/null +++ b/.gitignore @@ -0,0 +1,68 @@ +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/ + + +### application.yml ### +application.yaml + +### DS_Store +.DS_Store + +# Created by https://www.toptal.com/developers/gitignore/api/maven +# Edit at https://www.toptal.com/developers/gitignore?templates=maven + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# End of https://www.toptal.com/developers/gitignore/api/maven \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100755 index 0000000000..8a8fb2282d --- /dev/null +++ b/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + 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 + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + 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 + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000000..1d8ab018ea --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. 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, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..7c78cbf23f --- /dev/null +++ b/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.12 + + + com.prgrms + spring + 0.0.1-SNAPSHOT + spring + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + RELEASE + compile + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/prgrms/spring/Application.java b/src/main/java/com/prgrms/spring/Application.java new file mode 100644 index 0000000000..3ebf87ee4b --- /dev/null +++ b/src/main/java/com/prgrms/spring/Application.java @@ -0,0 +1,13 @@ +package com.prgrms.spring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/src/main/java/com/prgrms/spring/config/AppConfiguration.java b/src/main/java/com/prgrms/spring/config/AppConfiguration.java new file mode 100644 index 0000000000..fb78c9f137 --- /dev/null +++ b/src/main/java/com/prgrms/spring/config/AppConfiguration.java @@ -0,0 +1,9 @@ +package com.prgrms.spring.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan +public class AppConfiguration { +} diff --git a/src/main/java/com/prgrms/spring/controller/AppController.java b/src/main/java/com/prgrms/spring/controller/AppController.java new file mode 100644 index 0000000000..57ffe01a70 --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/AppController.java @@ -0,0 +1,32 @@ +package com.prgrms.spring.controller; + +import com.prgrms.spring.controller.voucher.VoucherController; +import com.prgrms.spring.domain.menu.MenuType; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class AppController { + private final VoucherController voucherController; + + public void run() { + boolean isExecute = true; + while (isExecute) { + String type = "Sf"; + MenuType menuType = MenuType.matchType(type); + switch (menuType) { + case EXIT: + isExecute = false; + break; + case CREATE_VOUCHER: + voucherController.createVoucher(); + break; + case LIST_VOUCHER: + voucherController.getAllVoucher(); + break; + default: + + break; + } + } + } +} diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java new file mode 100644 index 0000000000..aba55d7dea --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -0,0 +1,35 @@ +package com.prgrms.spring.controller.voucher; + +import com.prgrms.spring.domain.voucher.Voucher; +import com.prgrms.spring.domain.voucher.VoucherType; +import com.prgrms.spring.service.voucher.VoucherService; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; + +@RequiredArgsConstructor +public class VoucherController { + + private final VoucherService voucherService; + + public void createVoucher() { + System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); + for (VoucherType vt: VoucherType.values()) { + System.out.println(vt.getId() + ". " + vt.getName()); + } + int select = 1; + VoucherType type = VoucherType.matchType(select); + System.out.println(type.getPromptMessage()); + Long discount = 80L; + Voucher voucher = voucherService.createVoucher(type, discount); + if (voucher == null) { + System.out.println("바우처 등록에 실패하였습니다."); + return; + } + System.out.println("정상적으로 바우처가 등록되었습니다."); + } + + public void getAllVoucher() { + voucherService.getAllVoucher().forEach(System.out::println); + } +} diff --git a/src/main/java/com/prgrms/spring/domain/menu/MenuType.java b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java new file mode 100644 index 0000000000..965af998f1 --- /dev/null +++ b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java @@ -0,0 +1,25 @@ +package com.prgrms.spring.domain.menu; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +@Getter +@AllArgsConstructor(access = AccessLevel.PROTECTED) +public enum MenuType { + EXIT("exit", "exit the program"), + CREATE_VOUCHER("create", "create a new voucher"), + LIST_VOUCHER("list", "list all vouchers"); + + private final String name; + private final String explain; + + public static MenuType matchType(String type) { + return Arrays.stream(values()) + .filter(v -> type.equals(v.name)) + .findFirst() + .orElseThrow(IllegalStateException::new); + } +} diff --git a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java new file mode 100644 index 0000000000..41c7414f83 --- /dev/null +++ b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java @@ -0,0 +1,27 @@ +package com.prgrms.spring.domain.voucher; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; + +import java.util.UUID; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class FixedAmountVoucher implements Voucher{ + + private final UUID voucherId; + private final long discount; + + public static FixedAmountVoucher newInstance(UUID voucherId, long discount) { + return new FixedAmountVoucher(voucherId, discount); + } + + @Override + public UUID getVoucherId() { + return voucherId; + } + + @Override + public long getDiscount() { + return discount; + } +} diff --git a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java new file mode 100644 index 0000000000..7d8193e4aa --- /dev/null +++ b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java @@ -0,0 +1,27 @@ +package com.prgrms.spring.domain.voucher; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; + +import java.util.UUID; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class PercentDiscountVoucher implements Voucher{ + + private final UUID voucherId; + private final long discount; + + public static PercentDiscountVoucher newInstance(UUID voucherId, long discount) { + return new PercentDiscountVoucher(voucherId, discount); + } + + @Override + public UUID getVoucherId() { + return voucherId; + } + + @Override + public long getDiscount() { + return discount; + } +} diff --git a/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java b/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java new file mode 100644 index 0000000000..05cfe59d7a --- /dev/null +++ b/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java @@ -0,0 +1,8 @@ +package com.prgrms.spring.domain.voucher; + +import java.util.UUID; + +public interface Voucher { + UUID getVoucherId(); + long getDiscount(); +} diff --git a/src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java b/src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java new file mode 100644 index 0000000000..46ac05cd8b --- /dev/null +++ b/src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java @@ -0,0 +1,25 @@ +package com.prgrms.spring.domain.voucher; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +@Getter +@AllArgsConstructor(access = AccessLevel.PROTECTED) +public enum VoucherType { + FIXED_AMOUNT("1", "Fixed Amount Voucher", "Enter the fixed amount for the voucher:"), + PERCENT_DISCOUNT("2", "Percent Discount Voucher", "Enter the percent discount for the voucher:"); + + private final String id; + private final String name; + private final String promptMessage; + + public static VoucherType matchType(int type) { + return Arrays.stream(values()) + .filter(v -> type == Integer.parseInt(v.id)) + .findFirst() + .orElseThrow(IllegalStateException::new); + } +} diff --git a/src/main/java/com/prgrms/spring/infrastructure/voucher/MemoryVoucherRepository.java b/src/main/java/com/prgrms/spring/infrastructure/voucher/MemoryVoucherRepository.java new file mode 100644 index 0000000000..3a86254063 --- /dev/null +++ b/src/main/java/com/prgrms/spring/infrastructure/voucher/MemoryVoucherRepository.java @@ -0,0 +1,28 @@ +package com.prgrms.spring.infrastructure.voucher; + +import com.prgrms.spring.domain.voucher.Voucher; +import org.springframework.stereotype.Repository; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Repository +public class MemoryVoucherRepository implements VoucherRepository{ + + private final Map storage = new ConcurrentHashMap<>(); + @Override + public Optional findById(UUID voucherId) { + return Optional.ofNullable(storage.get(voucherId)); + } + + @Override + public Voucher insert(Voucher voucher) { + storage.put(voucher.getVoucherId(), voucher); + return voucher; + } + + @Override + public Map findAll() { + return storage; + } +} diff --git a/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java new file mode 100644 index 0000000000..1d3aeb6c4b --- /dev/null +++ b/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java @@ -0,0 +1,14 @@ +package com.prgrms.spring.infrastructure.voucher; + +import com.prgrms.spring.domain.voucher.Voucher; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +public interface VoucherRepository { + Optional findById(UUID voucherId); + Voucher insert(Voucher voucher); + Map findAll(); +} diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java new file mode 100644 index 0000000000..89c9b07b7b --- /dev/null +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -0,0 +1,44 @@ +package com.prgrms.spring.service.voucher; + +import com.prgrms.spring.domain.voucher.FixedAmountVoucher; +import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; +import com.prgrms.spring.domain.voucher.Voucher; +import com.prgrms.spring.domain.voucher.VoucherType; +import com.prgrms.spring.infrastructure.voucher.VoucherRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +@Service +//@RequiredArgsConstructor +public class VoucherService { + + private VoucherRepository voucherRepository; + + public Voucher createVoucher(VoucherType type, Long discount) { + Voucher voucher = null; + if (type == VoucherType.FIXED_AMOUNT) { + voucher = FixedAmountVoucher.newInstance(UUID.randomUUID(), discount); + } else if (type == VoucherType.PERCENT_DISCOUNT) { + voucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), discount); + } + return voucher; + } + + public List getAllVoucher() { + Map vouchers = voucherRepository.findAll(); + List voucherList = new ArrayList<>(vouchers.values()); + List outputList = new ArrayList<>(); + + for (Voucher voucher: voucherList) { + if (voucher instanceof FixedAmountVoucher) { + outputList.add(String.format("FixedAmountVoucher : %d$", voucher.getDiscount())); + } else if (voucher instanceof PercentDiscountVoucher) { + outputList.add(String.format("PercentDiscountVoucher : %d%%", voucher.getDiscount())); + } + } + return outputList; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/com/prgrms/spring/ApplicationTests.java b/src/test/java/com/prgrms/spring/ApplicationTests.java new file mode 100644 index 0000000000..24a82bdfa1 --- /dev/null +++ b/src/test/java/com/prgrms/spring/ApplicationTests.java @@ -0,0 +1,13 @@ +package com.prgrms.spring; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ApplicationTests { + + @Test + void contextLoads() { + } + +} From 521936db1af1402fde7ad8396d3d76d5d5205979 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 23 Jun 2023 21:17:35 +0900 Subject: [PATCH 02/40] FEAT : create AppRunner --- .../AppController.java => AppRunner.java} | 14 ++++++++++---- src/main/java/com/prgrms/spring/Application.java | 7 ++++++- .../controller/voucher/VoucherController.java | 12 +++++++++--- 3 files changed, 25 insertions(+), 8 deletions(-) rename src/main/java/com/prgrms/spring/{controller/AppController.java => AppRunner.java} (70%) diff --git a/src/main/java/com/prgrms/spring/controller/AppController.java b/src/main/java/com/prgrms/spring/AppRunner.java similarity index 70% rename from src/main/java/com/prgrms/spring/controller/AppController.java rename to src/main/java/com/prgrms/spring/AppRunner.java index 57ffe01a70..f5b3f32f10 100644 --- a/src/main/java/com/prgrms/spring/controller/AppController.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -1,17 +1,23 @@ -package com.prgrms.spring.controller; +package com.prgrms.spring; import com.prgrms.spring.controller.voucher.VoucherController; import com.prgrms.spring.domain.menu.MenuType; import lombok.AllArgsConstructor; +import org.springframework.stereotype.Controller; + +import java.io.Console; @AllArgsConstructor -public class AppController { +@Controller +public class AppRunner implements Runnable{ private final VoucherController voucherController; + private static final Console console = System.console(); + @Override public void run() { boolean isExecute = true; while (isExecute) { - String type = "Sf"; + String type = console.readLine("menu: "); MenuType menuType = MenuType.matchType(type); switch (menuType) { case EXIT: @@ -24,7 +30,7 @@ public void run() { voucherController.getAllVoucher(); break; default: - + System.out.println("Error"); break; } } diff --git a/src/main/java/com/prgrms/spring/Application.java b/src/main/java/com/prgrms/spring/Application.java index 3ebf87ee4b..120c8c9dbb 100644 --- a/src/main/java/com/prgrms/spring/Application.java +++ b/src/main/java/com/prgrms/spring/Application.java @@ -2,12 +2,17 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class Application { public static void main(String[] args) { - SpringApplication.run(Application.class, args); + var springApplication = new SpringApplication(Application.class); +// ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args); +// SpringApplication.run(Application.class, args); + var applicationContext = springApplication.run(args); + applicationContext.getBean(AppRunner.class).run(); } } diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index aba55d7dea..64d0643399 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -4,23 +4,29 @@ import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.service.voucher.VoucherService; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; -import java.util.Arrays; +import java.io.Console; + +@Controller @RequiredArgsConstructor public class VoucherController { private final VoucherService voucherService; + private final Console console = System.console(); public void createVoucher() { + System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); + for (VoucherType vt: VoucherType.values()) { System.out.println(vt.getId() + ". " + vt.getName()); } - int select = 1; + int select = Integer.parseInt(console.readLine()); VoucherType type = VoucherType.matchType(select); System.out.println(type.getPromptMessage()); - Long discount = 80L; + Long discount = Long.parseLong(console.readLine()); Voucher voucher = voucherService.createVoucher(type, discount); if (voucher == null) { System.out.println("바우처 등록에 실패하였습니다."); From 9ca33e201fd95011f0d8b2cc619e405392956766 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 23 Jun 2023 22:04:30 +0900 Subject: [PATCH 03/40] =?UTF-8?q?FIX=20:=20RequiredArgsConstructor=20->=20?= =?UTF-8?q?AllArgsConstructor=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/prgrms/spring/AppRunner.java | 9 ++++++--- src/main/java/com/prgrms/spring/Application.java | 3 +-- .../prgrms/spring/config/AppConfiguration.java | 1 + .../controller/voucher/VoucherController.java | 16 ++++++++-------- .../voucher/VoucherRepository.java | 3 ++- .../spring/service/voucher/VoucherService.java | 10 +++++----- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index f5b3f32f10..a8f1a451f0 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -5,19 +5,22 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Controller; -import java.io.Console; +import java.util.Scanner; @AllArgsConstructor @Controller public class AppRunner implements Runnable{ private final VoucherController voucherController; - private static final Console console = System.console(); + private final Scanner scanner = new Scanner(System.in); @Override public void run() { boolean isExecute = true; while (isExecute) { - String type = console.readLine("menu: "); + for (MenuType mt: MenuType.values()) { + System.out.println(mt.getName() + " -> " + mt.getExplain()); + } + String type = scanner.nextLine(); MenuType menuType = MenuType.matchType(type); switch (menuType) { case EXIT: diff --git a/src/main/java/com/prgrms/spring/Application.java b/src/main/java/com/prgrms/spring/Application.java index 120c8c9dbb..dd73e4b313 100644 --- a/src/main/java/com/prgrms/spring/Application.java +++ b/src/main/java/com/prgrms/spring/Application.java @@ -1,5 +1,6 @@ package com.prgrms.spring; +import com.prgrms.spring.infrastructure.voucher.VoucherRepository; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @@ -9,8 +10,6 @@ public class Application { public static void main(String[] args) { var springApplication = new SpringApplication(Application.class); -// ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args); -// SpringApplication.run(Application.class, args); var applicationContext = springApplication.run(args); applicationContext.getBean(AppRunner.class).run(); } diff --git a/src/main/java/com/prgrms/spring/config/AppConfiguration.java b/src/main/java/com/prgrms/spring/config/AppConfiguration.java index fb78c9f137..1e41ee46c1 100644 --- a/src/main/java/com/prgrms/spring/config/AppConfiguration.java +++ b/src/main/java/com/prgrms/spring/config/AppConfiguration.java @@ -6,4 +6,5 @@ @Configuration @ComponentScan public class AppConfiguration { + } diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index 64d0643399..140e45a004 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -3,18 +3,18 @@ import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.service.voucher.VoucherService; -import lombok.RequiredArgsConstructor; +import lombok.AllArgsConstructor; import org.springframework.stereotype.Controller; -import java.io.Console; +import java.util.Scanner; @Controller -@RequiredArgsConstructor +@AllArgsConstructor public class VoucherController { private final VoucherService voucherService; - private final Console console = System.console(); + private final Scanner scanner = new Scanner(System.in); public void createVoucher() { @@ -23,16 +23,16 @@ public void createVoucher() { for (VoucherType vt: VoucherType.values()) { System.out.println(vt.getId() + ". " + vt.getName()); } - int select = Integer.parseInt(console.readLine()); + int select = Integer.parseInt(scanner.nextLine()); VoucherType type = VoucherType.matchType(select); System.out.println(type.getPromptMessage()); - Long discount = Long.parseLong(console.readLine()); + Long discount = Long.parseLong(scanner.nextLine()); Voucher voucher = voucherService.createVoucher(type, discount); if (voucher == null) { - System.out.println("바우처 등록에 실패하였습니다."); + System.out.println("\n바우처 등록에 실패하였습니다.\n"); return; } - System.out.println("정상적으로 바우처가 등록되었습니다."); + System.out.println("\n정상적으로 바우처가 등록되었습니다.\n"); } public void getAllVoucher() { diff --git a/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java index 1d3aeb6c4b..ac44d115f6 100644 --- a/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java +++ b/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java @@ -1,8 +1,9 @@ package com.prgrms.spring.infrastructure.voucher; import com.prgrms.spring.domain.voucher.Voucher; +import org.springframework.stereotype.Repository; + -import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 89c9b07b7b..0066385358 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -5,14 +5,13 @@ import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.infrastructure.voucher.VoucherRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.*; @Service -//@RequiredArgsConstructor +@AllArgsConstructor public class VoucherService { private VoucherRepository voucherRepository; @@ -24,6 +23,7 @@ public Voucher createVoucher(VoucherType type, Long discount) { } else if (type == VoucherType.PERCENT_DISCOUNT) { voucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), discount); } + voucherRepository.insert(voucher); return voucher; } @@ -34,9 +34,9 @@ public List getAllVoucher() { for (Voucher voucher: voucherList) { if (voucher instanceof FixedAmountVoucher) { - outputList.add(String.format("FixedAmountVoucher : %d$", voucher.getDiscount())); + outputList.add(String.format("FixedAmountVoucher : %d $", voucher.getDiscount())); } else if (voucher instanceof PercentDiscountVoucher) { - outputList.add(String.format("PercentDiscountVoucher : %d%%", voucher.getDiscount())); + outputList.add(String.format("PercentDiscountVoucher : %d %%", voucher.getDiscount())); } } return outputList; From f3d3d737803a0aa141ffb48de3e0ab16412c066a Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 27 Jun 2023 23:25:25 +0900 Subject: [PATCH 04/40] =?UTF-8?q?REFACTOR=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/prgrms/spring/Application.java | 2 -- .../voucher/MemoryVoucherRepository.java | 2 +- .../voucher/VoucherRepository.java | 3 +-- .../java/com/prgrms/spring/service/voucher/VoucherService.java | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) rename src/main/java/com/prgrms/spring/{infrastructure => repository}/voucher/MemoryVoucherRepository.java (93%) rename src/main/java/com/prgrms/spring/{infrastructure => repository}/voucher/VoucherRepository.java (73%) diff --git a/src/main/java/com/prgrms/spring/Application.java b/src/main/java/com/prgrms/spring/Application.java index dd73e4b313..c427c962bb 100644 --- a/src/main/java/com/prgrms/spring/Application.java +++ b/src/main/java/com/prgrms/spring/Application.java @@ -1,9 +1,7 @@ package com.prgrms.spring; -import com.prgrms.spring.infrastructure.voucher.VoucherRepository; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class Application { diff --git a/src/main/java/com/prgrms/spring/infrastructure/voucher/MemoryVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java similarity index 93% rename from src/main/java/com/prgrms/spring/infrastructure/voucher/MemoryVoucherRepository.java rename to src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java index 3a86254063..6d41048286 100644 --- a/src/main/java/com/prgrms/spring/infrastructure/voucher/MemoryVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java @@ -1,4 +1,4 @@ -package com.prgrms.spring.infrastructure.voucher; +package com.prgrms.spring.repository.voucher; import com.prgrms.spring.domain.voucher.Voucher; import org.springframework.stereotype.Repository; diff --git a/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java similarity index 73% rename from src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java rename to src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java index ac44d115f6..0e10b4c8f8 100644 --- a/src/main/java/com/prgrms/spring/infrastructure/voucher/VoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java @@ -1,7 +1,6 @@ -package com.prgrms.spring.infrastructure.voucher; +package com.prgrms.spring.repository.voucher; import com.prgrms.spring.domain.voucher.Voucher; -import org.springframework.stereotype.Repository; import java.util.Map; diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 0066385358..7315416359 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -4,7 +4,7 @@ import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; -import com.prgrms.spring.infrastructure.voucher.VoucherRepository; +import com.prgrms.spring.repository.voucher.VoucherRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; From d1552379fdaea3f0e85c2da739a373976e5dd3fc Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 27 Jun 2023 23:29:08 +0900 Subject: [PATCH 05/40] =?UTF-8?q?REFACTOR=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/prgrms/spring/AppRunner.java | 4 ++-- src/main/java/com/prgrms/spring/Application.java | 10 +++++----- .../spring/controller/voucher/VoucherController.java | 2 +- .../spring/domain/voucher/FixedAmountVoucher.java | 2 +- .../spring/domain/voucher/PercentDiscountVoucher.java | 2 +- .../java/com/prgrms/spring/domain/voucher/Voucher.java | 1 + .../repository/voucher/MemoryVoucherRepository.java | 3 ++- .../spring/repository/voucher/VoucherRepository.java | 2 ++ .../prgrms/spring/service/voucher/VoucherService.java | 4 ++-- 9 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index a8f1a451f0..3a010d17e2 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -9,7 +9,7 @@ @AllArgsConstructor @Controller -public class AppRunner implements Runnable{ +public class AppRunner implements Runnable { private final VoucherController voucherController; private final Scanner scanner = new Scanner(System.in); @@ -17,7 +17,7 @@ public class AppRunner implements Runnable{ public void run() { boolean isExecute = true; while (isExecute) { - for (MenuType mt: MenuType.values()) { + for (MenuType mt : MenuType.values()) { System.out.println(mt.getName() + " -> " + mt.getExplain()); } String type = scanner.nextLine(); diff --git a/src/main/java/com/prgrms/spring/Application.java b/src/main/java/com/prgrms/spring/Application.java index c427c962bb..4ef8fb9fbd 100644 --- a/src/main/java/com/prgrms/spring/Application.java +++ b/src/main/java/com/prgrms/spring/Application.java @@ -6,10 +6,10 @@ @SpringBootApplication public class Application { - public static void main(String[] args) { - var springApplication = new SpringApplication(Application.class); - var applicationContext = springApplication.run(args); - applicationContext.getBean(AppRunner.class).run(); - } + public static void main(String[] args) { + var springApplication = new SpringApplication(Application.class); + var applicationContext = springApplication.run(args); + applicationContext.getBean(AppRunner.class).run(); + } } diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index 140e45a004..b764e55a2f 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -20,7 +20,7 @@ public void createVoucher() { System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); - for (VoucherType vt: VoucherType.values()) { + for (VoucherType vt : VoucherType.values()) { System.out.println(vt.getId() + ". " + vt.getName()); } int select = Integer.parseInt(scanner.nextLine()); diff --git a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java index 41c7414f83..e806760831 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java @@ -6,7 +6,7 @@ import java.util.UUID; @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class FixedAmountVoucher implements Voucher{ +public class FixedAmountVoucher implements Voucher { private final UUID voucherId; private final long discount; diff --git a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java index 7d8193e4aa..b82b25c197 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java @@ -6,7 +6,7 @@ import java.util.UUID; @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class PercentDiscountVoucher implements Voucher{ +public class PercentDiscountVoucher implements Voucher { private final UUID voucherId; private final long discount; diff --git a/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java b/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java index 05cfe59d7a..e80ff66b6d 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java @@ -4,5 +4,6 @@ public interface Voucher { UUID getVoucherId(); + long getDiscount(); } diff --git a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java index 6d41048286..da7172458b 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java @@ -7,9 +7,10 @@ import java.util.concurrent.ConcurrentHashMap; @Repository -public class MemoryVoucherRepository implements VoucherRepository{ +public class MemoryVoucherRepository implements VoucherRepository { private final Map storage = new ConcurrentHashMap<>(); + @Override public Optional findById(UUID voucherId) { return Optional.ofNullable(storage.get(voucherId)); diff --git a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java index 0e10b4c8f8..52c5cbd8da 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java @@ -9,6 +9,8 @@ public interface VoucherRepository { Optional findById(UUID voucherId); + Voucher insert(Voucher voucher); + Map findAll(); } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 7315416359..869bd53421 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -32,10 +32,10 @@ public List getAllVoucher() { List voucherList = new ArrayList<>(vouchers.values()); List outputList = new ArrayList<>(); - for (Voucher voucher: voucherList) { + for (Voucher voucher : voucherList) { if (voucher instanceof FixedAmountVoucher) { outputList.add(String.format("FixedAmountVoucher : %d $", voucher.getDiscount())); - } else if (voucher instanceof PercentDiscountVoucher) { + } else if (voucher instanceof PercentDiscountVoucher) { outputList.add(String.format("PercentDiscountVoucher : %d %%", voucher.getDiscount())); } } From a23b63ee0b35c167da2aa90a6a2dc349e3d5ea1b Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 27 Jun 2023 23:30:10 +0900 Subject: [PATCH 06/40] =?UTF-8?q?REFACTOR=20:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/prgrms/spring/service/voucher/VoucherService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 869bd53421..7e89a3e20c 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -14,7 +14,7 @@ @AllArgsConstructor public class VoucherService { - private VoucherRepository voucherRepository; + private final VoucherRepository voucherRepository; public Voucher createVoucher(VoucherType type, Long discount) { Voucher voucher = null; From 7c302192d61c6b2b28ec83b1847773049bb4f2d5 Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 27 Jun 2023 23:34:20 +0900 Subject: [PATCH 07/40] =?UTF-8?q?REFACTOR=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?(AppConfiguration)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/prgrms/spring/config/AppConfiguration.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/main/java/com/prgrms/spring/config/AppConfiguration.java diff --git a/src/main/java/com/prgrms/spring/config/AppConfiguration.java b/src/main/java/com/prgrms/spring/config/AppConfiguration.java deleted file mode 100644 index 1e41ee46c1..0000000000 --- a/src/main/java/com/prgrms/spring/config/AppConfiguration.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.prgrms.spring.config; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ComponentScan -public class AppConfiguration { - -} From 6b7440af99aba63d6fe521c38fe497039c4f3d13 Mon Sep 17 00:00:00 2001 From: sunny Date: Wed, 28 Jun 2023 00:02:15 +0900 Subject: [PATCH 08/40] =?UTF-8?q?FEAT=20:=20CommandLineRunner=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/prgrms/spring/AppRunner.java | 8 +++++--- src/main/java/com/prgrms/spring/Application.java | 6 ++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index 3a010d17e2..91d0ac8168 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -3,18 +3,20 @@ import com.prgrms.spring.controller.voucher.VoucherController; import com.prgrms.spring.domain.menu.MenuType; import lombok.AllArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import java.util.Scanner; @AllArgsConstructor -@Controller -public class AppRunner implements Runnable { +@Component +public class AppRunner implements CommandLineRunner { private final VoucherController voucherController; private final Scanner scanner = new Scanner(System.in); @Override - public void run() { + public void run(String... args) throws Exception { boolean isExecute = true; while (isExecute) { for (MenuType mt : MenuType.values()) { diff --git a/src/main/java/com/prgrms/spring/Application.java b/src/main/java/com/prgrms/spring/Application.java index 4ef8fb9fbd..f7519b953e 100644 --- a/src/main/java/com/prgrms/spring/Application.java +++ b/src/main/java/com/prgrms/spring/Application.java @@ -1,5 +1,6 @@ package com.prgrms.spring; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,9 +8,6 @@ public class Application { public static void main(String[] args) { - var springApplication = new SpringApplication(Application.class); - var applicationContext = springApplication.run(args); - applicationContext.getBean(AppRunner.class).run(); + SpringApplication.run(Application.class, args); } - } From 173a5b0b40e2cd91befc4e6b5d5a7f2dbe3dd6e2 Mon Sep 17 00:00:00 2001 From: sunny Date: Wed, 28 Jun 2023 00:09:10 +0900 Subject: [PATCH 09/40] =?UTF-8?q?FEAT=20:=20storage=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=20=EC=8B=9C=20=EB=B0=A9=EC=96=B4=EC=A0=81=20=EB=B3=B5=EC=82=AC?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/repository/voucher/MemoryVoucherRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java index da7172458b..200da809eb 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java @@ -24,6 +24,6 @@ public Voucher insert(Voucher voucher) { @Override public Map findAll() { - return storage; + return new ConcurrentHashMap<>(storage); } } From 1d20a53850164b24c2d171f0f093a9c7871e10c0 Mon Sep 17 00:00:00 2001 From: sunny Date: Wed, 28 Jun 2023 01:03:05 +0900 Subject: [PATCH 10/40] =?UTF-8?q?FEAT=20:=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC,=20ConsoleView=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/prgrms/spring/AppRunner.java | 16 ++--- .../controller/voucher/VoucherController.java | 25 +++---- .../com/prgrms/spring/exception/Error.java | 15 ++++ .../com/prgrms/spring/exception/Success.java | 14 ++++ .../com/prgrms/spring/io/ConsoleView.java | 68 +++++++++++++++++++ src/main/java/com/prgrms/spring/io/Input.java | 8 +++ .../java/com/prgrms/spring/io/Output.java | 16 +++++ 7 files changed, 139 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/prgrms/spring/exception/Error.java create mode 100644 src/main/java/com/prgrms/spring/exception/Success.java create mode 100644 src/main/java/com/prgrms/spring/io/ConsoleView.java create mode 100644 src/main/java/com/prgrms/spring/io/Input.java create mode 100644 src/main/java/com/prgrms/spring/io/Output.java diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index 91d0ac8168..d9b20fe5e8 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -2,28 +2,26 @@ import com.prgrms.spring.controller.voucher.VoucherController; import com.prgrms.spring.domain.menu.MenuType; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.io.ConsoleView; import lombok.AllArgsConstructor; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Controller; -import java.util.Scanner; @AllArgsConstructor @Component public class AppRunner implements CommandLineRunner { private final VoucherController voucherController; - private final Scanner scanner = new Scanner(System.in); + + private final ConsoleView consoleView; @Override public void run(String... args) throws Exception { boolean isExecute = true; while (isExecute) { - for (MenuType mt : MenuType.values()) { - System.out.println(mt.getName() + " -> " + mt.getExplain()); - } - String type = scanner.nextLine(); - MenuType menuType = MenuType.matchType(type); + consoleView.showMenu(); + MenuType menuType = MenuType.matchType(consoleView.getMenu()); switch (menuType) { case EXIT: isExecute = false; @@ -35,7 +33,7 @@ public void run(String... args) throws Exception { voucherController.getAllVoucher(); break; default: - System.out.println("Error"); + consoleView.showErrorMsg(Error.VALIDATION_WRONG_TYPE); break; } } diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index b764e55a2f..90b49b7599 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -2,11 +2,13 @@ import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.Success; +import com.prgrms.spring.io.ConsoleView; import com.prgrms.spring.service.voucher.VoucherService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Controller; -import java.util.Scanner; @Controller @@ -14,28 +16,23 @@ public class VoucherController { private final VoucherService voucherService; - private final Scanner scanner = new Scanner(System.in); + private final ConsoleView consoleView; public void createVoucher() { - System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); - - for (VoucherType vt : VoucherType.values()) { - System.out.println(vt.getId() + ". " + vt.getName()); - } - int select = Integer.parseInt(scanner.nextLine()); - VoucherType type = VoucherType.matchType(select); - System.out.println(type.getPromptMessage()); - Long discount = Long.parseLong(scanner.nextLine()); + consoleView.showVoucherTypes(); + VoucherType type = VoucherType.matchType(consoleView.getVoucherType()); + consoleView.showVoucherPrompt(type); + Long discount = consoleView.getVoucherDiscount(); Voucher voucher = voucherService.createVoucher(type, discount); if (voucher == null) { - System.out.println("\n바우처 등록에 실패하였습니다.\n"); + consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); return; } - System.out.println("\n정상적으로 바우처가 등록되었습니다.\n"); + consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); } public void getAllVoucher() { - voucherService.getAllVoucher().forEach(System.out::println); + consoleView.showAllVouchers(voucherService.getAllVoucher()); } } diff --git a/src/main/java/com/prgrms/spring/exception/Error.java b/src/main/java/com/prgrms/spring/exception/Error.java new file mode 100644 index 0000000000..812e6f0e25 --- /dev/null +++ b/src/main/java/com/prgrms/spring/exception/Error.java @@ -0,0 +1,15 @@ +package com.prgrms.spring.exception; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum Error { + VALIDATION_WRONG_TYPE("잘못된 입력값입니다."), + CREATE_VOUCHER_EXCEPTION("바우처 등록에 실패하였습니다."), + ; + + private final String message; +} diff --git a/src/main/java/com/prgrms/spring/exception/Success.java b/src/main/java/com/prgrms/spring/exception/Success.java new file mode 100644 index 0000000000..5c11c9d684 --- /dev/null +++ b/src/main/java/com/prgrms/spring/exception/Success.java @@ -0,0 +1,14 @@ +package com.prgrms.spring.exception; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum Success { + CREATE_VOUCHER_SUCCESS("바우처가 성공적으로 등록되었습니다."), + ; + + private final String message; +} diff --git a/src/main/java/com/prgrms/spring/io/ConsoleView.java b/src/main/java/com/prgrms/spring/io/ConsoleView.java new file mode 100644 index 0000000000..c56af9f8e0 --- /dev/null +++ b/src/main/java/com/prgrms/spring/io/ConsoleView.java @@ -0,0 +1,68 @@ +package com.prgrms.spring.io; + +import com.prgrms.spring.domain.menu.MenuType; +import com.prgrms.spring.domain.voucher.VoucherType; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.Success; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Scanner; + +@Component +@AllArgsConstructor +public class ConsoleView implements Input, Output { + private final Scanner scanner = new Scanner(System.in); + + @Override + public String getMenu() { + return scanner.nextLine(); + } + + @Override + public int getVoucherType() { + return Integer.parseInt(scanner.nextLine()); + } + + @Override + public Long getVoucherDiscount() { + return Long.parseLong(scanner.nextLine()); + } + + @Override + public void showMenu() { + System.out.println("=== Voucher Program ==="); + for (MenuType mt : MenuType.values()) { + System.out.println(String.format("Type **%s** to %s.", mt.getName(), mt.getExplain())); + } + } + + @Override + public void showVoucherTypes() { + System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); + for (VoucherType vt : VoucherType.values()) { + System.out.println(String.format("%s. %s", vt.getId(), vt.getName())); + } + } + + @Override + public void showVoucherPrompt(VoucherType voucherType) { + System.out.println(voucherType.getPromptMessage()); + } + + @Override + public void showAllVouchers(List vouchers) { + vouchers.forEach(System.out::println); + } + + @Override + public void showErrorMsg(Error error) { + System.out.println(error.getMessage()); + } + + @Override + public void showSuccessMsg(Success success) { + System.out.println(success.getMessage()); + } +} diff --git a/src/main/java/com/prgrms/spring/io/Input.java b/src/main/java/com/prgrms/spring/io/Input.java new file mode 100644 index 0000000000..24621151e0 --- /dev/null +++ b/src/main/java/com/prgrms/spring/io/Input.java @@ -0,0 +1,8 @@ +package com.prgrms.spring.io; + +public interface Input { + String getMenu(); + int getVoucherType(); + Long getVoucherDiscount(); + +} diff --git a/src/main/java/com/prgrms/spring/io/Output.java b/src/main/java/com/prgrms/spring/io/Output.java new file mode 100644 index 0000000000..4634b0a9b1 --- /dev/null +++ b/src/main/java/com/prgrms/spring/io/Output.java @@ -0,0 +1,16 @@ +package com.prgrms.spring.io; + +import com.prgrms.spring.domain.voucher.VoucherType; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.Success; + +import java.util.List; + +public interface Output { + void showMenu(); + void showVoucherTypes(); + void showVoucherPrompt(VoucherType voucherType); + void showAllVouchers(List vouchers); + void showErrorMsg(Error error); + void showSuccessMsg(Success success); +} From db596fc1d100c15f64426b32670542d79135a5ea Mon Sep 17 00:00:00 2001 From: sunny Date: Wed, 28 Jun 2023 01:07:11 +0900 Subject: [PATCH 11/40] =?UTF-8?q?FEAT=20:=20=ED=83=80=EC=9E=85=20=EB=A7=A4?= =?UTF-8?q?=EC=B9=AD=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/prgrms/spring/domain/menu/MenuType.java | 3 ++- .../java/com/prgrms/spring/domain/voucher/VoucherType.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/prgrms/spring/domain/menu/MenuType.java b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java index 965af998f1..4297cc149f 100644 --- a/src/main/java/com/prgrms/spring/domain/menu/MenuType.java +++ b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java @@ -1,5 +1,6 @@ package com.prgrms.spring.domain.menu; +import com.prgrms.spring.exception.Error; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; @@ -20,6 +21,6 @@ public static MenuType matchType(String type) { return Arrays.stream(values()) .filter(v -> type.equals(v.name)) .findFirst() - .orElseThrow(IllegalStateException::new); + .orElseThrow(() -> new IllegalStateException(String.valueOf(Error.VALIDATION_WRONG_TYPE))); } } diff --git a/src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java b/src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java index 46ac05cd8b..27076d67c3 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/VoucherType.java @@ -1,5 +1,6 @@ package com.prgrms.spring.domain.voucher; +import com.prgrms.spring.exception.Error; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; @@ -20,6 +21,6 @@ public static VoucherType matchType(int type) { return Arrays.stream(values()) .filter(v -> type == Integer.parseInt(v.id)) .findFirst() - .orElseThrow(IllegalStateException::new); + .orElseThrow(() -> new IllegalStateException(String.valueOf(Error.VALIDATION_WRONG_TYPE))); } } From 90f6b4d4a53b95052ce5346c9fa17e72563540ec Mon Sep 17 00:00:00 2001 From: sunny Date: Wed, 28 Jun 2023 01:21:27 +0900 Subject: [PATCH 12/40] =?UTF-8?q?FEAT=20:=20~Voucher=EC=97=90=20voucherNam?= =?UTF-8?q?e,=20voucherUnit=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/domain/voucher/FixedAmountVoucher.java | 13 ++++++++++++- .../domain/voucher/PercentDiscountVoucher.java | 13 ++++++++++++- .../com/prgrms/spring/domain/voucher/Voucher.java | 4 ++++ .../spring/service/voucher/VoucherService.java | 9 ++------- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java index e806760831..507c214be1 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java @@ -7,9 +7,10 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public class FixedAmountVoucher implements Voucher { - + private final String voucherName = "FixedAmountVoucher"; private final UUID voucherId; private final long discount; + private final String discountUnit = "$"; public static FixedAmountVoucher newInstance(UUID voucherId, long discount) { return new FixedAmountVoucher(voucherId, discount); @@ -24,4 +25,14 @@ public UUID getVoucherId() { public long getDiscount() { return discount; } + + @Override + public String getDiscountUnit() { + return discountUnit; + } + + @Override + public String getVoucherName() { + return voucherName; + } } diff --git a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java index b82b25c197..5999ba5c18 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java @@ -7,9 +7,10 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public class PercentDiscountVoucher implements Voucher { - + private final String voucherName = "PercentDiscountVoucher"; private final UUID voucherId; private final long discount; + private final String discountUnit = "%"; public static PercentDiscountVoucher newInstance(UUID voucherId, long discount) { return new PercentDiscountVoucher(voucherId, discount); @@ -24,4 +25,14 @@ public UUID getVoucherId() { public long getDiscount() { return discount; } + + @Override + public String getDiscountUnit() { + return discountUnit; + } + + @Override + public String getVoucherName() { + return voucherName; + } } diff --git a/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java b/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java index e80ff66b6d..c11628c957 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/Voucher.java @@ -6,4 +6,8 @@ public interface Voucher { UUID getVoucherId(); long getDiscount(); + + String getDiscountUnit(); + + String getVoucherName(); } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 7e89a3e20c..ca04f632aa 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -32,13 +32,8 @@ public List getAllVoucher() { List voucherList = new ArrayList<>(vouchers.values()); List outputList = new ArrayList<>(); - for (Voucher voucher : voucherList) { - if (voucher instanceof FixedAmountVoucher) { - outputList.add(String.format("FixedAmountVoucher : %d $", voucher.getDiscount())); - } else if (voucher instanceof PercentDiscountVoucher) { - outputList.add(String.format("PercentDiscountVoucher : %d %%", voucher.getDiscount())); - } - } + voucherList.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); + return outputList; } } From bcbbdf34d12a8305d5f75a38476cf3b528e9358c Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 30 Jun 2023 14:54:03 +0900 Subject: [PATCH 13/40] =?UTF-8?q?FEAT=20:=20logger=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myapp-2023-06-30.log | 30 +++++++++++++++++++ .../java/com/prgrms/spring/AppRunner.java | 5 ++++ .../controller/voucher/VoucherController.java | 5 +++- src/main/resources/logback.xml | 14 +++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 myapp-2023-06-30.log create mode 100644 src/main/resources/logback.xml diff --git a/myapp-2023-06-30.log b/myapp-2023-06-30.log new file mode 100644 index 0000000000..551a847ebe --- /dev/null +++ b/myapp-2023-06-30.log @@ -0,0 +1,30 @@ +14:35:12.615 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: java.lang.IllegalStateException: VALIDATION_WRONG_TYPE + at com.prgrms.spring.domain.menu.MenuType.lambda$matchType$1(MenuType.java:24) + at java.base/java.util.Optional.orElseThrow(Optional.java:403) + at com.prgrms.spring.domain.menu.MenuType.matchType(MenuType.java:24) + at com.prgrms.spring.AppRunner.run(AppRunner.java:29) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted +14:35:19.239 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: java.lang.IllegalStateException: VALIDATION_WRONG_TYPE + at com.prgrms.spring.domain.menu.MenuType.lambda$matchType$1(MenuType.java:24) + at java.base/java.util.Optional.orElseThrow(Optional.java:403) + at com.prgrms.spring.domain.menu.MenuType.matchType(MenuType.java:24) + at com.prgrms.spring.AppRunner.run(AppRunner.java:29) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index d9b20fe5e8..bd90da633e 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -5,6 +5,8 @@ import com.prgrms.spring.exception.Error; import com.prgrms.spring.io.ConsoleView; import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @@ -16,10 +18,13 @@ public class AppRunner implements CommandLineRunner { private final ConsoleView consoleView; + private static final Logger logger = LoggerFactory.getLogger(AppRunner.class); + @Override public void run(String... args) throws Exception { boolean isExecute = true; while (isExecute) { + logger.info("프로그램 시작."); consoleView.showMenu(); MenuType menuType = MenuType.matchType(consoleView.getMenu()); switch (menuType) { diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index 90b49b7599..fe5c9cadbf 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -7,16 +7,18 @@ import com.prgrms.spring.io.ConsoleView; import com.prgrms.spring.service.voucher.VoucherService; import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; - @Controller @AllArgsConstructor public class VoucherController { private final VoucherService voucherService; private final ConsoleView consoleView; + private static final Logger logger = LoggerFactory.getLogger(VoucherController.class); public void createVoucher() { @@ -27,6 +29,7 @@ public void createVoucher() { Voucher voucher = voucherService.createVoucher(type, discount); if (voucher == null) { consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); + logger.error("바우처 생성 실패"); return; } consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000000..95eeb21a92 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,14 @@ + + + + myapp-%d{yyyy-MM-dd}.log + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file From ff48099be924720df0104ab91020a7a8a0bbfa53 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 30 Jun 2023 15:15:49 +0900 Subject: [PATCH 14/40] =?UTF-8?q?REFACTOR=20:=20VoucherService=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EA=B0=80=EA=B3=B5=20->=20controller=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=BC=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myapp-2023-06-30.log | 17 +++++++++++++++++ .../controller/voucher/VoucherController.java | 9 ++++++++- .../spring/service/voucher/VoucherService.java | 9 ++------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/myapp-2023-06-30.log b/myapp-2023-06-30.log index 551a847ebe..1b43a07d14 100644 --- a/myapp-2023-06-30.log +++ b/myapp-2023-06-30.log @@ -28,3 +28,20 @@ Caused by: java.lang.IllegalStateException: VALIDATION_WRONG_TYPE at com.prgrms.spring.AppRunner.run(AppRunner.java:29) at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) ... 5 common frames omitted +15:14:53.855 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: java.lang.NumberFormatException: For input string: "" + at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) + at java.base/java.lang.Long.parseLong(Long.java:721) + at java.base/java.lang.Long.parseLong(Long.java:836) + at com.prgrms.spring.io.ConsoleView.getVoucherDiscount(ConsoleView.java:30) + at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:31) + at com.prgrms.spring.AppRunner.run(AppRunner.java:35) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index fe5c9cadbf..11ee9d9ac1 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -11,6 +11,9 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; +import java.util.ArrayList; +import java.util.List; + @Controller @AllArgsConstructor @@ -36,6 +39,10 @@ public void createVoucher() { } public void getAllVoucher() { - consoleView.showAllVouchers(voucherService.getAllVoucher()); + List voucherList = new ArrayList<>(voucherService.getAllVoucher()); + List outputList = new ArrayList<>(); + voucherList.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); + + consoleView.showAllVouchers(outputList); } } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index ca04f632aa..b660b0263a 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -27,13 +27,8 @@ public Voucher createVoucher(VoucherType type, Long discount) { return voucher; } - public List getAllVoucher() { + public Collection getAllVoucher() { Map vouchers = voucherRepository.findAll(); - List voucherList = new ArrayList<>(vouchers.values()); - List outputList = new ArrayList<>(); - - voucherList.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); - - return outputList; + return vouchers.values(); } } From 50e372363540ad9a3082eabffb7f1265846a1dba Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 30 Jun 2023 15:18:58 +0900 Subject: [PATCH 15/40] =?UTF-8?q?FEAT=20:=20input=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myapp-2023-06-30.log | 2 ++ src/main/java/com/prgrms/spring/AppRunner.java | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/myapp-2023-06-30.log b/myapp-2023-06-30.log index 1b43a07d14..490145aac9 100644 --- a/myapp-2023-06-30.log +++ b/myapp-2023-06-30.log @@ -45,3 +45,5 @@ Caused by: java.lang.NumberFormatException: For input string: "" at com.prgrms.spring.AppRunner.run(AppRunner.java:35) at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) ... 5 common frames omitted +15:18:34.922 [main] ERROR com.prgrms.spring.AppRunner - input error! +15:18:36.307 [main] ERROR com.prgrms.spring.AppRunner - input error! diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index bd90da633e..f847652f5a 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -26,7 +26,14 @@ public void run(String... args) throws Exception { while (isExecute) { logger.info("프로그램 시작."); consoleView.showMenu(); - MenuType menuType = MenuType.matchType(consoleView.getMenu()); + MenuType menuType = null; + try { + menuType = MenuType.matchType(consoleView.getMenu()); + } catch (IllegalStateException e) { + logger.error("input error!"); + consoleView.showErrorMsg(Error.VALIDATION_WRONG_TYPE); + continue; + } switch (menuType) { case EXIT: isExecute = false; @@ -37,9 +44,6 @@ public void run(String... args) throws Exception { case LIST_VOUCHER: voucherController.getAllVoucher(); break; - default: - consoleView.showErrorMsg(Error.VALIDATION_WRONG_TYPE); - break; } } } From ce5bceedfc0f97e8aadd01305c75ec6a85da3ef7 Mon Sep 17 00:00:00 2001 From: sunny Date: Fri, 30 Jun 2023 15:22:12 +0900 Subject: [PATCH 16/40] =?UTF-8?q?FEAT=20:=20discount=20=EA=B0=92=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myapp-2023-06-30.log | 15 +++++++++++++++ .../spring/domain/voucher/FixedAmountVoucher.java | 1 + .../domain/voucher/PercentDiscountVoucher.java | 1 + 3 files changed, 17 insertions(+) diff --git a/myapp-2023-06-30.log b/myapp-2023-06-30.log index 490145aac9..27b38943b4 100644 --- a/myapp-2023-06-30.log +++ b/myapp-2023-06-30.log @@ -47,3 +47,18 @@ Caused by: java.lang.NumberFormatException: For input string: "" ... 5 common frames omitted 15:18:34.922 [main] ERROR com.prgrms.spring.AppRunner - input error! 15:18:36.307 [main] ERROR com.prgrms.spring.AppRunner - input error! +15:21:23.213 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: java.lang.IllegalArgumentException: 유효하지 않은 할인 금액입니다! + at com.prgrms.spring.domain.voucher.FixedAmountVoucher.newInstance(FixedAmountVoucher.java:16) + at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:22) + at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) + at com.prgrms.spring.AppRunner.run(AppRunner.java:42) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted diff --git a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java index 507c214be1..6d0cd1ceb2 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java @@ -13,6 +13,7 @@ public class FixedAmountVoucher implements Voucher { private final String discountUnit = "$"; public static FixedAmountVoucher newInstance(UUID voucherId, long discount) { + if (discount <= 0) throw new IllegalArgumentException("유효하지 않은 할인 금액"); return new FixedAmountVoucher(voucherId, discount); } diff --git a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java index 5999ba5c18..26ee8c6bb8 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java @@ -13,6 +13,7 @@ public class PercentDiscountVoucher implements Voucher { private final String discountUnit = "%"; public static PercentDiscountVoucher newInstance(UUID voucherId, long discount) { + if (discount <= 0 || discount >= 100) throw new IllegalArgumentException("유효하지 않은 할인 금액"); return new PercentDiscountVoucher(voucherId, discount); } From fd00f7cd15ab3895fcbb3ef7f5f5097d2cb8418c Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 4 Jul 2023 15:37:09 +0900 Subject: [PATCH 17/40] [FEAT] JdbcVoucherRepository --- myapp-2023-07-04.log | 252 ++++++++++++++++++ pom.xml | 4 + .../controller/voucher/VoucherController.java | 2 +- .../voucher/JdbcVoucherRepository.java | 82 ++++++ .../voucher/MemoryVoucherRepository.java | 7 +- .../repository/voucher/VoucherRepository.java | 4 +- .../service/voucher/VoucherService.java | 6 +- src/main/resources/application.properties | 5 +- 8 files changed, 354 insertions(+), 8 deletions(-) create mode 100644 myapp-2023-07-04.log create mode 100644 src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java diff --git a/myapp-2023-07-04.log b/myapp-2023-07-04.log new file mode 100644 index 0000000000..029e246503 --- /dev/null +++ b/myapp-2023-07-04.log @@ -0,0 +1,252 @@ +15:34:47.045 [main] ERROR com.zaxxer.hikari.HikariConfig - Failed to load driver class com.mysql.cj.jdbc.Driver from HikariConfig class classloader jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7 +15:34:47.059 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appRunner' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/AppRunner.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 18 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 32 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 46 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 60 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 76 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + ... 90 common frames omitted +Caused by: java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:491) + at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperty.set(DataSourceBuilder.java:463) + at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperties.set(DataSourceBuilder.java:357) + at org.springframework.boot.jdbc.DataSourceBuilder.build(DataSourceBuilder.java:183) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) + ... 91 common frames omitted +15:35:39.185 [main] ERROR com.zaxxer.hikari.HikariConfig - Failed to load driver class com.mysql.cj.jdbc.Driver from HikariConfig class classloader jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7 +15:35:39.199 [main] ERROR o.s.boot.SpringApplication - Application run failed +org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appRunner' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/AppRunner.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 18 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 32 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 46 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 60 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 76 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + ... 90 common frames omitted +Caused by: java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader + at com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:491) + at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperty.set(DataSourceBuilder.java:463) + at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperties.set(DataSourceBuilder.java:357) + at org.springframework.boot.jdbc.DataSourceBuilder.build(DataSourceBuilder.java:183) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) + at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) + ... 91 common frames omitted diff --git a/pom.xml b/pom.xml index 7c78cbf23f..be3501ec94 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,10 @@ RELEASE compile + + org.springframework.boot + spring-boot-starter-jdbc + diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index 11ee9d9ac1..c2388a6857 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -39,7 +39,7 @@ public void createVoucher() { } public void getAllVoucher() { - List voucherList = new ArrayList<>(voucherService.getAllVoucher()); + List voucherList = (List) voucherService.getAllVoucher(); List outputList = new ArrayList<>(); voucherList.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java new file mode 100644 index 0000000000..d281c00709 --- /dev/null +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -0,0 +1,82 @@ +package com.prgrms.spring.repository.voucher; + +import com.prgrms.spring.domain.voucher.FixedAmountVoucher; +import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; +import com.prgrms.spring.domain.voucher.Voucher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.nio.ByteBuffer; +import java.util.*; + +@Repository +@Profile("dev") +public class JdbcVoucherRepository implements VoucherRepository { + + private static final Logger logger = LoggerFactory.getLogger(JdbcVoucherRepository.class); + + private final NamedParameterJdbcTemplate jdbcTemplate; + + public JdbcVoucherRepository(NamedParameterJdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + private static final RowMapper voucherRowMapper = (resultSet, i) -> { + var voucherName = resultSet.getString("voucher_name"); + var voucherId = toUUID(resultSet.getBytes("voucher_id")); + var discount = resultSet.getInt("discount"); + var discountUnit = resultSet.getString("discount_unit"); + if (voucherName.equals("PercentDiscountVoucher")) { + return PercentDiscountVoucher.newInstance(voucherId, discount); + } else { + return FixedAmountVoucher.newInstance(voucherId, discount); + } + }; + + private Map toParamMap(Voucher voucher) { + return new HashMap<>() {{ + put("voucherId", voucher.getVoucherId().toString().getBytes()); + put("voucherName", voucher.getVoucherName()); + put("discount", voucher.getDiscount()); + put("discountUnit", voucher.getDiscountUnit()); + }}; + } + + @Override + public Optional findById(UUID voucherId) { + try { + return Optional.ofNullable(jdbcTemplate.queryForObject("select * from voucher WHERE voucher_id = UUID_TO_BIN(:voucherId)", + Collections.singletonMap("customerId", voucherId.toString().getBytes()), + voucherRowMapper) + ); + } catch (EmptyResultDataAccessException e) { + logger.error("Got empty result", e); + return Optional.empty(); + } + } + + @Override + public Voucher insert(Voucher voucher) { + var update = jdbcTemplate.update("INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(:voucherId), :voucherName, :discount, :discountUnit)", + toParamMap(voucher)); + if (update != 1) { + throw new RuntimeException("Noting was inserted"); + } + return voucher; + } + + @Override + public List findAll() { + return jdbcTemplate.query("select * from voucher", voucherRowMapper); + } + + static UUID toUUID(byte[] bytes) { + var byteBuffer = ByteBuffer.wrap(bytes); + return new UUID(byteBuffer.getLong(), byteBuffer.getLong()); + } +} diff --git a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java index 200da809eb..dae63441ef 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java @@ -1,12 +1,14 @@ package com.prgrms.spring.repository.voucher; import com.prgrms.spring.domain.voucher.Voucher; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @Repository +@Profile("local") public class MemoryVoucherRepository implements VoucherRepository { private final Map storage = new ConcurrentHashMap<>(); @@ -23,7 +25,8 @@ public Voucher insert(Voucher voucher) { } @Override - public Map findAll() { - return new ConcurrentHashMap<>(storage); + public List findAll() { +// return new ConcurrentHashMap<>(storage); + return null; } } diff --git a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java index 52c5cbd8da..76e47d0de1 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java @@ -3,7 +3,7 @@ import com.prgrms.spring.domain.voucher.Voucher; -import java.util.Map; +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -12,5 +12,5 @@ public interface VoucherRepository { Voucher insert(Voucher voucher); - Map findAll(); + List findAll(); } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index b660b0263a..c7823238e7 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -7,6 +7,7 @@ import com.prgrms.spring.repository.voucher.VoucherRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.*; @@ -16,6 +17,7 @@ public class VoucherService { private final VoucherRepository voucherRepository; + @Transactional public Voucher createVoucher(VoucherType type, Long discount) { Voucher voucher = null; if (type == VoucherType.FIXED_AMOUNT) { @@ -27,8 +29,8 @@ public Voucher createVoucher(VoucherType type, Long discount) { return voucher; } + @Transactional public Collection getAllVoucher() { - Map vouchers = voucherRepository.findAll(); - return vouchers.values(); + return voucherRepository.findAll(); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789179..0271d2e392 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,4 @@ - +spring.profiles.active=dev +spring.datasource.url=jdbc:mysql://localhost/voucher_system?autoReconnect=true +spring.datasource.username=root +spring.datasource.password=0828 From 12a61e5d3bb29415cc9a96f3d6376c7b4c560110 Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 4 Jul 2023 16:43:48 +0900 Subject: [PATCH 18/40] =?UTF-8?q?[Feat]=20dependency=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myapp-2023-07-04.log | 236 ++++++++++++++++++ pom.xml | 6 + .../voucher/JdbcVoucherRepository.java | 3 +- src/main/resources/application.properties | 2 +- 4 files changed, 245 insertions(+), 2 deletions(-) diff --git a/myapp-2023-07-04.log b/myapp-2023-07-04.log index 029e246503..3a79503d2d 100644 --- a/myapp-2023-07-04.log +++ b/myapp-2023-07-04.log @@ -250,3 +250,239 @@ Caused by: java.lang.RuntimeException: Failed to load driver class com.mysql.cj. at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ... 91 common frames omitted +16:35:40.626 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:66) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$aba89d3f.insert() + at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) + at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$71828dab.createVoucher() + at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) + at com.prgrms.spring.AppRunner.run(AppRunner.java:42) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted +Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) + at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) + ... 36 common frames omitted +16:36:07.204 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:66) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$aba89d3f.insert() + at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) + at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$71828dab.createVoucher() + at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) + at com.prgrms.spring.AppRunner.run(AppRunner.java:42) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted +Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) + at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) + ... 36 common frames omitted +16:36:43.042 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:66) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$da92aefd.insert() + at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) + at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$f3932812.createVoucher() + at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) + at com.prgrms.spring.AppRunner.run(AppRunner.java:42) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted +Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) + at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) + ... 36 common frames omitted +16:38:27.702 [main] ERROR o.s.boot.SpringApplication - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) + at com.prgrms.spring.Application.main(Application.java:11) +Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) + at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) + at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:67) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$aba89d3f.insert() + at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) + at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) + at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) + at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$71828dab.createVoucher() + at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) + at com.prgrms.spring.AppRunner.run(AppRunner.java:42) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) + ... 5 common frames omitted +Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) + at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) + ... 36 common frames omitted diff --git a/pom.xml b/pom.xml index be3501ec94..78b3717547 100644 --- a/pom.xml +++ b/pom.xml @@ -33,10 +33,16 @@ RELEASE compile + org.springframework.boot spring-boot-starter-jdbc + + mysql + mysql-connector-java + 8.0.25 + diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index d281c00709..29c7152cd0 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -5,6 +5,7 @@ import com.prgrms.spring.domain.voucher.Voucher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Profile; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.RowMapper; @@ -15,7 +16,7 @@ import java.util.*; @Repository -@Profile("dev") +@Primary public class JdbcVoucherRepository implements VoucherRepository { private static final Logger logger = LoggerFactory.getLogger(JdbcVoucherRepository.class); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0271d2e392..b3d27e2298 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,4 @@ -spring.profiles.active=dev +#spring.profiles.active=dev spring.datasource.url=jdbc:mysql://localhost/voucher_system?autoReconnect=true spring.datasource.username=root spring.datasource.password=0828 From 39b91346ccb2aa1a0baf8e96e8811af8a9950ee7 Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 4 Jul 2023 17:32:38 +0900 Subject: [PATCH 19/40] [FEAT] Customer Entity --- .../spring/domain/customer/Customer.java | 33 +++++++++++++++++++ .../voucher/JdbcVoucherRepository.java | 7 ++-- 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/prgrms/spring/domain/customer/Customer.java diff --git a/src/main/java/com/prgrms/spring/domain/customer/Customer.java b/src/main/java/com/prgrms/spring/domain/customer/Customer.java new file mode 100644 index 0000000000..ed23c58244 --- /dev/null +++ b/src/main/java/com/prgrms/spring/domain/customer/Customer.java @@ -0,0 +1,33 @@ +package com.prgrms.spring.domain.customer; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class Customer { + + private final UUID customerId; + private String name; + private final String email; + private final LocalDateTime createdAt; + + public static Customer newInstance(UUID customerId, String name, String email, LocalDateTime createdAt) { + return new Customer(customerId, name, email, createdAt); + } + + public void changeName(String name) { + validateName(name); + this.name = name; + } + + private static void validateName(String name) { + if (name.isBlank()) { + throw new RuntimeException("Name should not be blank."); + } + } +} diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index 29c7152cd0..b383071175 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -3,6 +3,8 @@ import com.prgrms.spring.domain.voucher.FixedAmountVoucher; import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; import com.prgrms.spring.domain.voucher.Voucher; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Primary; @@ -17,16 +19,13 @@ @Repository @Primary +@AllArgsConstructor(access = AccessLevel.PROTECTED) public class JdbcVoucherRepository implements VoucherRepository { private static final Logger logger = LoggerFactory.getLogger(JdbcVoucherRepository.class); private final NamedParameterJdbcTemplate jdbcTemplate; - public JdbcVoucherRepository(NamedParameterJdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - private static final RowMapper voucherRowMapper = (resultSet, i) -> { var voucherName = resultSet.getString("voucher_name"); var voucherId = toUUID(resultSet.getBytes("voucher_id")); From c3a62d86d629882a5cbd20187ba28f90a2ae35c2 Mon Sep 17 00:00:00 2001 From: sunny Date: Tue, 4 Jul 2023 17:32:54 +0900 Subject: [PATCH 20/40] [FEAT] Customer Repository (with jdbc) --- .../customer/CustomerRepository.java | 26 ++++ .../customer/JdbcCustomerRepository.java | 118 ++++++++++++++++++ .../service/customer/CustomerService.java | 15 +++ 3 files changed, 159 insertions(+) create mode 100644 src/main/java/com/prgrms/spring/repository/customer/CustomerRepository.java create mode 100644 src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java create mode 100644 src/main/java/com/prgrms/spring/service/customer/CustomerService.java diff --git a/src/main/java/com/prgrms/spring/repository/customer/CustomerRepository.java b/src/main/java/com/prgrms/spring/repository/customer/CustomerRepository.java new file mode 100644 index 0000000000..5b46a0c3b2 --- /dev/null +++ b/src/main/java/com/prgrms/spring/repository/customer/CustomerRepository.java @@ -0,0 +1,26 @@ +package com.prgrms.spring.repository.customer; + +import com.prgrms.spring.domain.customer.Customer; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface CustomerRepository { + + Customer insert(Customer customer); + + Customer update(Customer customer); + + int count(); + + List findAll(); + + Optional findById(UUID customerId); + + Optional findByName(String name); + + Optional findByEmail(String email); + + void deleteAll(); +} diff --git a/src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java b/src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java new file mode 100644 index 0000000000..4b4ac6e78b --- /dev/null +++ b/src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java @@ -0,0 +1,118 @@ +package com.prgrms.spring.repository.customer; + +import com.prgrms.spring.domain.customer.Customer; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.nio.ByteBuffer; +import java.sql.Timestamp; +import java.util.*; + +@Repository +@AllArgsConstructor(access = AccessLevel.PROTECTED) +public class JdbcCustomerRepository implements CustomerRepository { + + private static final Logger logger = LoggerFactory.getLogger(JdbcCustomerRepository.class); + + private final NamedParameterJdbcTemplate jdbcTemplate; + + private static final RowMapper customerRowMapper = (resultSet, i) -> { + var name = resultSet.getString("name"); + var customerId = toUUID(resultSet.getBytes("customer_id")); + var email = resultSet.getString("email"); + var createdAt = resultSet.getTimestamp("created_at").toLocalDateTime(); + return Customer.newInstance(customerId, name, email, createdAt); + }; + + private Map toParamMap(Customer customer) { + return new HashMap<>() {{ + put("customerId", customer.getCustomerId().toString().getBytes()); + put("name", customer.getName()); + put("email", customer.getEmail()); + put("cratedAt", Timestamp.valueOf(customer.getCreatedAt())); + }}; + } + + @Override + public Customer insert(Customer customer) { + var update = jdbcTemplate.update("INSERT INTO customer(customer_id, name, email, created_at) VALUES (UUID_TO_BIN(:customerId), :name, :email, :cratedAt)", + toParamMap(customer)); + if (update != 1) { + throw new RuntimeException("Noting was inserted"); + } + return customer; + } + + @Override + public Customer update(Customer customer) { + var update = jdbcTemplate.update("UPDATE customer SET name = :name, email = :email WHERE customer_id = UUID_TO_BIN(:customerId)", + toParamMap(customer) + ); + if (update != 1) { + throw new RuntimeException("Noting was updated"); + } + return customer; + } + + @Override + public int count() { + return jdbcTemplate.queryForObject("select count(*) from customer", Collections.emptyMap(), Integer.class); + } + + @Override + public List findAll() { + return jdbcTemplate.query("select * from customer", customerRowMapper); + } + + @Override + public Optional findById(UUID customerId) { + try { + return Optional.ofNullable(jdbcTemplate.queryForObject("select * from customer WHERE customer_id = UUID_TO_BIN(:customerId)", + Collections.singletonMap("customerId", customerId.toString().getBytes()), + customerRowMapper)); + } catch (EmptyResultDataAccessException e) { + logger.error("Got empty result", e); + return Optional.empty(); + } + } + + @Override + public Optional findByName(String name) { + try { + return Optional.ofNullable(jdbcTemplate.queryForObject("select * from customer WHERE name = :name", + Collections.singletonMap("name", name), + customerRowMapper)); + } catch (EmptyResultDataAccessException e) { + logger.error("Got empty result", e); + return Optional.empty(); + } + } + + @Override + public Optional findByEmail(String email) { + try { + return Optional.ofNullable(jdbcTemplate.queryForObject("select * from customer WHERE email = :email", + Collections.singletonMap("email", email), + customerRowMapper)); + } catch (EmptyResultDataAccessException e) { + logger.error("Got empty result", e); + return Optional.empty(); + } + } + + @Override + public void deleteAll() { + jdbcTemplate.update("DELETE FROM customer", Collections.emptyMap()); + } + + static UUID toUUID(byte[] bytes) { + var byteBuffer = ByteBuffer.wrap(bytes); + return new UUID(byteBuffer.getLong(), byteBuffer.getLong()); + } +} diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java new file mode 100644 index 0000000000..aaff1c6bf5 --- /dev/null +++ b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java @@ -0,0 +1,15 @@ +package com.prgrms.spring.service.customer; + +import com.prgrms.spring.repository.customer.CustomerRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +public class CustomerService { + + private final CustomerRepository customerRepository; + + + +} From 595b3e222a54e9e1c750e394e8f508d42d402e7f Mon Sep 17 00:00:00 2001 From: sunny Date: Thu, 6 Jul 2023 14:50:59 +0900 Subject: [PATCH 21/40] [Feat] Customer Service --- .../dto/request/CustomerCreateRequestDto.java | 14 +++++++++++ .../service/customer/CustomerService.java | 24 ++++++++++++++++++- .../resources/logFiles/log.2023-07-06.log | 0 src/main/resources/logback.xml | 2 +- 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java create mode 100644 src/main/resources/logFiles/log.2023-07-06.log diff --git a/src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java b/src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java new file mode 100644 index 0000000000..5173bca9f6 --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java @@ -0,0 +1,14 @@ +package com.prgrms.spring.controller.dto.request; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class CustomerCreateRequestDto { + private String name; + private String email; +} diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java index aaff1c6bf5..d05b47d26e 100644 --- a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java +++ b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java @@ -1,8 +1,15 @@ package com.prgrms.spring.service.customer; +import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; +import com.prgrms.spring.domain.customer.Customer; import com.prgrms.spring.repository.customer.CustomerRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.UUID; @Service @AllArgsConstructor @@ -10,6 +17,21 @@ public class CustomerService { private final CustomerRepository customerRepository; - + @Transactional + public Customer createCustomer(CustomerCreateRequestDto customerCreateRequestDto) { + var newCustomer = Customer.newInstance(UUID.randomUUID(), customerCreateRequestDto.getName(), customerCreateRequestDto.getEmail(), LocalDateTime.now()); + customerRepository.insert(newCustomer); + return newCustomer; + } + + @Transactional + public Customer getCustomerById(UUID customerId) { + return customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("고객 조회 실패")); + } + @Transactional + public Collection getAllCustomers() { + return customerRepository.findAll(); + } } diff --git a/src/main/resources/logFiles/log.2023-07-06.log b/src/main/resources/logFiles/log.2023-07-06.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 95eeb21a92..75771f207c 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,7 +1,7 @@ - myapp-%d{yyyy-MM-dd}.log + src/main/resources/logFiles/log.%d{yyyy-MM-dd}.log %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n From 066f7129f41bd4d2ab78e552378b1dc42ed4b255 Mon Sep 17 00:00:00 2001 From: sunny Date: Thu, 6 Jul 2023 15:22:23 +0900 Subject: [PATCH 22/40] [Feat] JdbcVoucherRepository test --- .../voucher/JdbcVoucherRepository.java | 2 +- .../resources/logFiles/log.2023-07-06.log | 86 ++++++++++++ .../prgrms/spring/VoucherRepositoryTest.java | 131 ++++++++++++++++++ 3 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/prgrms/spring/VoucherRepositoryTest.java diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index b383071175..87bd050d9c 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -51,7 +51,7 @@ private Map toParamMap(Voucher voucher) { public Optional findById(UUID voucherId) { try { return Optional.ofNullable(jdbcTemplate.queryForObject("select * from voucher WHERE voucher_id = UUID_TO_BIN(:voucherId)", - Collections.singletonMap("customerId", voucherId.toString().getBytes()), + Collections.singletonMap("voucherId", voucherId.toString().getBytes()), voucherRowMapper) ); } catch (EmptyResultDataAccessException e) { diff --git a/src/main/resources/logFiles/log.2023-07-06.log b/src/main/resources/logFiles/log.2023-07-06.log index e69de29bb2..773b7d59cd 100644 --- a/src/main/resources/logFiles/log.2023-07-06.log +++ b/src/main/resources/logFiles/log.2023-07-06.log @@ -0,0 +1,86 @@ +15:20:48.186 [main] ERROR c.p.s.r.v.JdbcVoucherRepository - Got empty result +org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0 + at org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:97) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:244) + at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:252) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.findById(JdbcVoucherRepository.java:53) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) + at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$e337547.findById() + at com.prgrms.spring.VoucherRepositoryTest.testFindById(VoucherRepositoryTest.java:128) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) + at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) + at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) + at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) + at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) + at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) + at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) + at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) + at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) + at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) + at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) + at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) diff --git a/src/test/java/com/prgrms/spring/VoucherRepositoryTest.java b/src/test/java/com/prgrms/spring/VoucherRepositoryTest.java new file mode 100644 index 0000000000..d059e61adc --- /dev/null +++ b/src/test/java/com/prgrms/spring/VoucherRepositoryTest.java @@ -0,0 +1,131 @@ +package com.prgrms.spring; + +import com.prgrms.spring.domain.customer.Customer; +import com.prgrms.spring.domain.voucher.FixedAmountVoucher; +import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; +import com.prgrms.spring.domain.voucher.Voucher; +import com.prgrms.spring.repository.voucher.JdbcVoucherRepository; +import com.zaxxer.hikari.HikariDataSource; +import org.junit.jupiter.api.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.sql.DataSource; +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +@SpringJUnitConfig +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class VoucherRepositoryTest { + + private static final Logger logger = LoggerFactory.getLogger(VoucherRepositoryTest.class); + + @Configuration + @ComponentScan( + basePackages = {"com.prgrms.spring"} + ) + static class Config { + + @Bean + public DataSource dataSource() { + var dataSource = DataSourceBuilder.create() + .url("jdbc:mysql://localhost/voucher_system") + .username("root") + .password("0828") + .type(HikariDataSource.class) + .build(); + dataSource.setMaximumPoolSize(1000); + dataSource.setMinimumIdle(100); + return dataSource; + } + + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } + + @Bean + public NamedParameterJdbcTemplate namedParameterJdbcTemplate(JdbcTemplate jdbcTemplate) { + return new NamedParameterJdbcTemplate(jdbcTemplate); + } + + @Bean + public PlatformTransactionManager platformTransactionManager(DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } + + @Bean + public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager) { + return new TransactionTemplate(platformTransactionManager); + } + } + + @Autowired + JdbcVoucherRepository jdbcVoucherRepository; + + @Autowired + DataSource dataSource; + + Voucher newFixedAmountVoucher; + Voucher newPercentAmountVoucher; + + @BeforeAll + void setup() { + newFixedAmountVoucher = FixedAmountVoucher.newInstance(UUID.randomUUID(), 30000); + newPercentAmountVoucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), 30); + } + + @Test + @Order(1) + @DisplayName("바우처를 추가할 수 있다.") + public void testInsert() { + try { + jdbcVoucherRepository.insert(newFixedAmountVoucher); + jdbcVoucherRepository.insert(newPercentAmountVoucher); + } catch (BadSqlGrammarException e) { + logger.error("Got BadSqlGrammarException error code -> {}", e.getSQLException().getErrorCode(), e); + } + + var retrievedVoucher = jdbcVoucherRepository.findById(newPercentAmountVoucher.getVoucherId()); + assertThat(retrievedVoucher.isEmpty(), is(false)); + assertThat(retrievedVoucher.get(), samePropertyValuesAs(newFixedAmountVoucher)); + + var retrievedVoucher2 = jdbcVoucherRepository.findById(newPercentAmountVoucher.getVoucherId()); + assertThat(retrievedVoucher2.isEmpty(), is(false)); + assertThat(retrievedVoucher2.get(), samePropertyValuesAs(newPercentAmountVoucher)); + } + + @Test + @Order(2) + @DisplayName("전체 바우처를 조회할 수 있다.") + public void testFindAll() { + var vouchers = jdbcVoucherRepository.findAll(); + assertThat(vouchers.isEmpty(), is(false)); + } + + @Test + @Order(3) + @DisplayName("아이디로 바우처를 조회할 수 있다.") + public void testFindById() { + var voucher = jdbcVoucherRepository.findById(newPercentAmountVoucher.getVoucherId()); + assertThat(voucher.isEmpty(), is(false)); + + var unknown = jdbcVoucherRepository.findById(UUID.randomUUID()); + assertThat(unknown.isEmpty(), is(true)); + } +} From ebacd64cf38addd26a9390e874616b481692b26c Mon Sep 17 00:00:00 2001 From: sunny Date: Thu, 6 Jul 2023 15:50:31 +0900 Subject: [PATCH 23/40] [Feat] Customer Controller --- myapp-2023-06-30.log | 64 --- myapp-2023-07-04.log | 488 ------------------ .../java/com/prgrms/spring/AppRunner.java | 8 + .../spring/controller/CustomerController.java | 46 ++ .../dto/request/CustomerCreateRequestDto.java | 4 + .../prgrms/spring/domain/menu/MenuType.java | 6 +- .../com/prgrms/spring/exception/Error.java | 1 + .../com/prgrms/spring/exception/Success.java | 1 + .../com/prgrms/spring/io/ConsoleView.java | 25 + src/main/java/com/prgrms/spring/io/Input.java | 2 + .../java/com/prgrms/spring/io/Output.java | 4 + .../voucher/JdbcVoucherRepository.java | 1 - .../resources/logFiles/log.2023-07-06.log | 3 + 13 files changed, 98 insertions(+), 555 deletions(-) delete mode 100644 myapp-2023-06-30.log delete mode 100644 myapp-2023-07-04.log create mode 100644 src/main/java/com/prgrms/spring/controller/CustomerController.java diff --git a/myapp-2023-06-30.log b/myapp-2023-06-30.log deleted file mode 100644 index 27b38943b4..0000000000 --- a/myapp-2023-06-30.log +++ /dev/null @@ -1,64 +0,0 @@ -14:35:12.615 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: java.lang.IllegalStateException: VALIDATION_WRONG_TYPE - at com.prgrms.spring.domain.menu.MenuType.lambda$matchType$1(MenuType.java:24) - at java.base/java.util.Optional.orElseThrow(Optional.java:403) - at com.prgrms.spring.domain.menu.MenuType.matchType(MenuType.java:24) - at com.prgrms.spring.AppRunner.run(AppRunner.java:29) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted -14:35:19.239 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: java.lang.IllegalStateException: VALIDATION_WRONG_TYPE - at com.prgrms.spring.domain.menu.MenuType.lambda$matchType$1(MenuType.java:24) - at java.base/java.util.Optional.orElseThrow(Optional.java:403) - at com.prgrms.spring.domain.menu.MenuType.matchType(MenuType.java:24) - at com.prgrms.spring.AppRunner.run(AppRunner.java:29) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted -15:14:53.855 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: java.lang.NumberFormatException: For input string: "" - at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) - at java.base/java.lang.Long.parseLong(Long.java:721) - at java.base/java.lang.Long.parseLong(Long.java:836) - at com.prgrms.spring.io.ConsoleView.getVoucherDiscount(ConsoleView.java:30) - at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:31) - at com.prgrms.spring.AppRunner.run(AppRunner.java:35) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted -15:18:34.922 [main] ERROR com.prgrms.spring.AppRunner - input error! -15:18:36.307 [main] ERROR com.prgrms.spring.AppRunner - input error! -15:21:23.213 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: java.lang.IllegalArgumentException: 유효하지 않은 할인 금액입니다! - at com.prgrms.spring.domain.voucher.FixedAmountVoucher.newInstance(FixedAmountVoucher.java:16) - at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:22) - at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) - at com.prgrms.spring.AppRunner.run(AppRunner.java:42) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted diff --git a/myapp-2023-07-04.log b/myapp-2023-07-04.log deleted file mode 100644 index 3a79503d2d..0000000000 --- a/myapp-2023-07-04.log +++ /dev/null @@ -1,488 +0,0 @@ -15:34:47.045 [main] ERROR com.zaxxer.hikari.HikariConfig - Failed to load driver class com.mysql.cj.jdbc.Driver from HikariConfig class classloader jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7 -15:34:47.059 [main] ERROR o.s.boot.SpringApplication - Application run failed -org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appRunner' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/AppRunner.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 18 common frames omitted -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 32 common frames omitted -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 46 common frames omitted -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 60 common frames omitted -Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) - at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 76 common frames omitted -Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) - at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) - ... 90 common frames omitted -Caused by: java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:491) - at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperty.set(DataSourceBuilder.java:463) - at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperties.set(DataSourceBuilder.java:357) - at org.springframework.boot.jdbc.DataSourceBuilder.build(DataSourceBuilder.java:183) - at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) - at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.base/java.lang.reflect.Method.invoke(Method.java:568) - at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) - ... 91 common frames omitted -15:35:39.185 [main] ERROR com.zaxxer.hikari.HikariConfig - Failed to load driver class com.mysql.cj.jdbc.Driver from HikariConfig class classloader jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7 -15:35:39.199 [main] ERROR o.s.boot.SpringApplication - Application run failed -org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appRunner' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/AppRunner.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) - at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:920) - at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) - at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) - at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherController' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/controller/voucher/VoucherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 18 common frames omitted -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'voucherService' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/service/voucher/VoucherService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 32 common frames omitted -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jdbcVoucherRepository' defined in file [/Users/seonheui/Developer/PROGRAMMERS/springboot-basic/target/classes/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 46 common frames omitted -Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Unsatisfied dependency expressed through method 'dataSourceScriptDatabaseInitializer' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) - at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 60 common frames omitted -Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) - at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) - at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) - at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) - at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) - at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) - at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) - at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) - at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) - at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) - at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) - ... 76 common frames omitted -Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) - at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) - ... 90 common frames omitted -Caused by: java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader - at com.zaxxer.hikari.HikariConfig.setDriverClassName(HikariConfig.java:491) - at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperty.set(DataSourceBuilder.java:463) - at org.springframework.boot.jdbc.DataSourceBuilder$MappedDataSourceProperties.set(DataSourceBuilder.java:357) - at org.springframework.boot.jdbc.DataSourceBuilder.build(DataSourceBuilder.java:183) - at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:48) - at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari.dataSource(DataSourceConfiguration.java:90) - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) - at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) - at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) - at java.base/java.lang.reflect.Method.invoke(Method.java:568) - at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) - ... 91 common frames omitted -16:35:40.626 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:66) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$aba89d3f.insert() - at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) - at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) - at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) - at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$71828dab.createVoucher() - at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) - at com.prgrms.spring.AppRunner.run(AppRunner.java:42) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted -Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) - at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) - at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) - ... 36 common frames omitted -16:36:07.204 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:66) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$aba89d3f.insert() - at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) - at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) - at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) - at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$71828dab.createVoucher() - at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) - at com.prgrms.spring.AppRunner.run(AppRunner.java:42) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted -Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) - at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) - at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) - ... 36 common frames omitted -16:36:43.042 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:66) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$da92aefd.insert() - at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) - at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) - at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) - at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$f3932812.createVoucher() - at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) - at com.prgrms.spring.AppRunner.run(AppRunner.java:42) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted -Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) - at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) - at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) - ... 36 common frames omitted -16:38:27.702 [main] ERROR o.s.boot.SpringApplication - Application run failed -java.lang.IllegalStateException: Failed to execute CommandLineRunner - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771) - at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) - at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) - at com.prgrms.spring.Application.main(Application.java:11) -Caused by: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(?), ?, ?, ?)]; Data truncation: Data too long for column 'voucher_name' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79) - at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960) - at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:981) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:328) - at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:333) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository.insert(JdbcVoucherRepository.java:67) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$FastClassBySpringCGLIB$$ae38168c.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.repository.voucher.JdbcVoucherRepository$$EnhancerBySpringCGLIB$$aba89d3f.insert() - at com.prgrms.spring.service.voucher.VoucherService.createVoucher(VoucherService.java:28) - at com.prgrms.spring.service.voucher.VoucherService$$FastClassBySpringCGLIB$$56331953.invoke() - at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) - at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) - at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) - at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) - at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) - at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) - at com.prgrms.spring.service.voucher.VoucherService$$EnhancerBySpringCGLIB$$71828dab.createVoucher() - at com.prgrms.spring.controller.voucher.VoucherController.createVoucher(VoucherController.java:32) - at com.prgrms.spring.AppRunner.run(AppRunner.java:42) - at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:768) - ... 5 common frames omitted -Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'voucher_name' at row 1 - at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348) - at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) - at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) - at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) - at org.springframework.jdbc.core.JdbcTemplate.lambda$update$2(JdbcTemplate.java:965) - at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:651) - ... 36 common frames omitted diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index f847652f5a..5e508d60e9 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -1,5 +1,6 @@ package com.prgrms.spring; +import com.prgrms.spring.controller.CustomerController; import com.prgrms.spring.controller.voucher.VoucherController; import com.prgrms.spring.domain.menu.MenuType; import com.prgrms.spring.exception.Error; @@ -15,6 +16,7 @@ @Component public class AppRunner implements CommandLineRunner { private final VoucherController voucherController; + private final CustomerController customerController; private final ConsoleView consoleView; @@ -44,6 +46,12 @@ public void run(String... args) throws Exception { case LIST_VOUCHER: voucherController.getAllVoucher(); break; + case CREATE_CUSTOMER: + customerController.createCustomer(); + break; + case LIST_CUSTOMER: + customerController.getAllCustomers(); + break; } } } diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java new file mode 100644 index 0000000000..82bca59a92 --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/CustomerController.java @@ -0,0 +1,46 @@ +package com.prgrms.spring.controller; + +import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; +import com.prgrms.spring.domain.customer.Customer; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.Success; +import com.prgrms.spring.io.ConsoleView; +import com.prgrms.spring.service.customer.CustomerService; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; + +import java.util.ArrayList; +import java.util.List; + +@Controller +@AllArgsConstructor +public class CustomerController { + + private final CustomerService customerService; + private final ConsoleView consoleView; + private static final Logger logger = LoggerFactory.getLogger(CustomerController.class); + + public void createCustomer() { + consoleView.showGetName(); + String name = consoleView.getCustomerName(); + consoleView.showGetEmail(); + String email = consoleView.getCustomerEmail(); + var request = CustomerCreateRequestDto.of(name, email); + Customer customer = customerService.createCustomer(request); + if (customer == null) { + consoleView.showErrorMsg(Error.CREATE_CUSTOMER_EXCEPTION); + logger.error("고객 등록 실패"); + return; + } + consoleView.showSuccessMsg(Success.CREATE_CUSTOMER_SUCCESS); + } + + public void getAllCustomers() { + List customerList = (List) customerService.getAllCustomers(); + List outputList = new ArrayList<>(); + customerList.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); + consoleView.showAllCustomers(outputList); + } +} diff --git a/src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java b/src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java index 5173bca9f6..3695b1298e 100644 --- a/src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java +++ b/src/main/java/com/prgrms/spring/controller/dto/request/CustomerCreateRequestDto.java @@ -11,4 +11,8 @@ public class CustomerCreateRequestDto { private String name; private String email; + + public static CustomerCreateRequestDto of(String name, String email) { + return new CustomerCreateRequestDto(name, email); + } } diff --git a/src/main/java/com/prgrms/spring/domain/menu/MenuType.java b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java index 4297cc149f..d9b499a108 100644 --- a/src/main/java/com/prgrms/spring/domain/menu/MenuType.java +++ b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java @@ -11,8 +11,10 @@ @AllArgsConstructor(access = AccessLevel.PROTECTED) public enum MenuType { EXIT("exit", "exit the program"), - CREATE_VOUCHER("create", "create a new voucher"), - LIST_VOUCHER("list", "list all vouchers"); + CREATE_VOUCHER("createVoucher", "create a new voucher"), + LIST_VOUCHER("listVoucher", "list all vouchers"), + CREATE_CUSTOMER("createCustomer", "create a new customer"), + LIST_CUSTOMER("listCustomer", "list all customers"); private final String name; private final String explain; diff --git a/src/main/java/com/prgrms/spring/exception/Error.java b/src/main/java/com/prgrms/spring/exception/Error.java index 812e6f0e25..32614ac82b 100644 --- a/src/main/java/com/prgrms/spring/exception/Error.java +++ b/src/main/java/com/prgrms/spring/exception/Error.java @@ -9,6 +9,7 @@ public enum Error { VALIDATION_WRONG_TYPE("잘못된 입력값입니다."), CREATE_VOUCHER_EXCEPTION("바우처 등록에 실패하였습니다."), + CREATE_CUSTOMER_EXCEPTION("고객 등록에 실패하였습니다."), ; private final String message; diff --git a/src/main/java/com/prgrms/spring/exception/Success.java b/src/main/java/com/prgrms/spring/exception/Success.java index 5c11c9d684..1a0fa162a4 100644 --- a/src/main/java/com/prgrms/spring/exception/Success.java +++ b/src/main/java/com/prgrms/spring/exception/Success.java @@ -8,6 +8,7 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum Success { CREATE_VOUCHER_SUCCESS("바우처가 성공적으로 등록되었습니다."), + CREATE_CUSTOMER_SUCCESS("고객이 성공적으로 등록되었습니다."), ; private final String message; diff --git a/src/main/java/com/prgrms/spring/io/ConsoleView.java b/src/main/java/com/prgrms/spring/io/ConsoleView.java index c56af9f8e0..d9050c1980 100644 --- a/src/main/java/com/prgrms/spring/io/ConsoleView.java +++ b/src/main/java/com/prgrms/spring/io/ConsoleView.java @@ -30,6 +30,16 @@ public Long getVoucherDiscount() { return Long.parseLong(scanner.nextLine()); } + @Override + public String getCustomerName() { + return scanner.nextLine(); + } + + @Override + public String getCustomerEmail() { + return scanner.nextLine(); + } + @Override public void showMenu() { System.out.println("=== Voucher Program ==="); @@ -65,4 +75,19 @@ public void showErrorMsg(Error error) { public void showSuccessMsg(Success success) { System.out.println(success.getMessage()); } + + @Override + public void showGetName() { + System.out.print("이름을 입력해주세요 : "); + } + + @Override + public void showGetEmail() { + System.out.print("이메일을 입력해주세요 : "); + } + + @Override + public void showAllCustomers(List customers) { + customers.forEach(System.out::println); + } } diff --git a/src/main/java/com/prgrms/spring/io/Input.java b/src/main/java/com/prgrms/spring/io/Input.java index 24621151e0..dee908970a 100644 --- a/src/main/java/com/prgrms/spring/io/Input.java +++ b/src/main/java/com/prgrms/spring/io/Input.java @@ -5,4 +5,6 @@ public interface Input { int getVoucherType(); Long getVoucherDiscount(); + String getCustomerName(); + String getCustomerEmail(); } diff --git a/src/main/java/com/prgrms/spring/io/Output.java b/src/main/java/com/prgrms/spring/io/Output.java index 4634b0a9b1..e3d5547464 100644 --- a/src/main/java/com/prgrms/spring/io/Output.java +++ b/src/main/java/com/prgrms/spring/io/Output.java @@ -13,4 +13,8 @@ public interface Output { void showAllVouchers(List vouchers); void showErrorMsg(Error error); void showSuccessMsg(Success success); + + void showGetName(); + void showGetEmail(); + void showAllCustomers(List customers); } diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index 87bd050d9c..67c7900b2c 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -8,7 +8,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; diff --git a/src/main/resources/logFiles/log.2023-07-06.log b/src/main/resources/logFiles/log.2023-07-06.log index 773b7d59cd..66f6e6a2d6 100644 --- a/src/main/resources/logFiles/log.2023-07-06.log +++ b/src/main/resources/logFiles/log.2023-07-06.log @@ -84,3 +84,6 @@ org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: e at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) +15:44:00.922 [main] ERROR com.prgrms.spring.AppRunner - input error! +15:48:29.373 [main] ERROR com.prgrms.spring.AppRunner - input error! +15:48:33.719 [main] ERROR com.prgrms.spring.AppRunner - input error! From 2af538416ab1c7c5dce0a28938457f24bb105e37 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 00:26:07 +0900 Subject: [PATCH 24/40] =?UTF-8?q?[Feat]=20Transcational=20readonly=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/prgrms/spring/service/customer/CustomerService.java | 4 ++-- .../com/prgrms/spring/service/voucher/VoucherService.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java index d05b47d26e..8774a07b46 100644 --- a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java +++ b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java @@ -24,13 +24,13 @@ public Customer createCustomer(CustomerCreateRequestDto customerCreateRequestDto return newCustomer; } - @Transactional + @Transactional(readOnly = true) public Customer getCustomerById(UUID customerId) { return customerRepository.findById(customerId) .orElseThrow(() -> new RuntimeException("고객 조회 실패")); } - @Transactional + @Transactional(readOnly = true) public Collection getAllCustomers() { return customerRepository.findAll(); } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index c7823238e7..1bb6db5456 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -29,7 +29,7 @@ public Voucher createVoucher(VoucherType type, Long discount) { return voucher; } - @Transactional + @Transactional(readOnly = true) public Collection getAllVoucher() { return voucherRepository.findAll(); } From cd563dab4b48ba62b9e01fa2092d95c0d1b07b34 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 00:37:19 +0900 Subject: [PATCH 25/40] =?UTF-8?q?[Refactor]=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20string=20=EB=B3=80=ED=99=98=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20service=EB=8B=A8=EC=9C=BC=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/prgrms/spring/controller/CustomerController.java | 5 +---- .../spring/controller/voucher/VoucherController.java | 6 +----- .../prgrms/spring/service/customer/CustomerService.java | 9 +++++++-- .../prgrms/spring/service/voucher/VoucherService.java | 7 +++++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java index 82bca59a92..2546de37fb 100644 --- a/src/main/java/com/prgrms/spring/controller/CustomerController.java +++ b/src/main/java/com/prgrms/spring/controller/CustomerController.java @@ -38,9 +38,6 @@ public void createCustomer() { } public void getAllCustomers() { - List customerList = (List) customerService.getAllCustomers(); - List outputList = new ArrayList<>(); - customerList.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); - consoleView.showAllCustomers(outputList); + consoleView.showAllCustomers(customerService.getAllCustomers()); } } diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index c2388a6857..221cccb0be 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -39,10 +39,6 @@ public void createVoucher() { } public void getAllVoucher() { - List voucherList = (List) voucherService.getAllVoucher(); - List outputList = new ArrayList<>(); - voucherList.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); - - consoleView.showAllVouchers(outputList); + consoleView.showAllVouchers(voucherService.getAllVoucher()); } } diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java index 8774a07b46..3f250e01f4 100644 --- a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java +++ b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java @@ -8,7 +8,9 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.UUID; @Service @@ -31,7 +33,10 @@ public Customer getCustomerById(UUID customerId) { } @Transactional(readOnly = true) - public Collection getAllCustomers() { - return customerRepository.findAll(); + public List getAllCustomers() { + List customerList = customerRepository.findAll(); + List outputList = new ArrayList<>(); + customerList.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); + return outputList; } } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 1bb6db5456..f743560635 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -30,7 +30,10 @@ public Voucher createVoucher(VoucherType type, Long discount) { } @Transactional(readOnly = true) - public Collection getAllVoucher() { - return voucherRepository.findAll(); + public List getAllVoucher() { + List voucherList = voucherRepository.findAll(); + List outputList = new ArrayList<>(); + voucherList.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); + return outputList; } } From a8e2284d94beb2c332c6e78483637830899f459d Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 09:35:02 +0900 Subject: [PATCH 26/40] =?UTF-8?q?[Feat]=20custom=20=EC=98=88=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/prgrms/spring/exception/Error.java | 2 ++ .../spring/exception/model/CustomException.java | 16 ++++++++++++++++ .../exception/model/NotFoundException.java | 10 ++++++++++ .../spring/service/customer/CustomerService.java | 4 +++- 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/prgrms/spring/exception/model/CustomException.java create mode 100644 src/main/java/com/prgrms/spring/exception/model/NotFoundException.java diff --git a/src/main/java/com/prgrms/spring/exception/Error.java b/src/main/java/com/prgrms/spring/exception/Error.java index 32614ac82b..53c648233e 100644 --- a/src/main/java/com/prgrms/spring/exception/Error.java +++ b/src/main/java/com/prgrms/spring/exception/Error.java @@ -10,6 +10,8 @@ public enum Error { VALIDATION_WRONG_TYPE("잘못된 입력값입니다."), CREATE_VOUCHER_EXCEPTION("바우처 등록에 실패하였습니다."), CREATE_CUSTOMER_EXCEPTION("고객 등록에 실패하였습니다."), + NOT_FOUND_CUSTOMER_EXCEPTION("유저 조회 실패"), + NOT_FOUND_VOUCHER_EXCEPTION("바우처 조회 실패") ; private final String message; diff --git a/src/main/java/com/prgrms/spring/exception/model/CustomException.java b/src/main/java/com/prgrms/spring/exception/model/CustomException.java new file mode 100644 index 0000000000..5fcc927522 --- /dev/null +++ b/src/main/java/com/prgrms/spring/exception/model/CustomException.java @@ -0,0 +1,16 @@ +package com.prgrms.spring.exception.model; + +import com.prgrms.spring.exception.Error; +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException{ + + private final Error error; + + public CustomException(Error error, String message) { + super(message); + this.error = error; + } +} + diff --git a/src/main/java/com/prgrms/spring/exception/model/NotFoundException.java b/src/main/java/com/prgrms/spring/exception/model/NotFoundException.java new file mode 100644 index 0000000000..c281e6f9e5 --- /dev/null +++ b/src/main/java/com/prgrms/spring/exception/model/NotFoundException.java @@ -0,0 +1,10 @@ +package com.prgrms.spring.exception.model; + +import com.prgrms.spring.exception.Error; + +public class NotFoundException extends CustomException { + + public NotFoundException(Error error, String message) { + super(error, message); + } +} diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java index 3f250e01f4..8768017052 100644 --- a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java +++ b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java @@ -2,6 +2,8 @@ import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; import com.prgrms.spring.domain.customer.Customer; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.model.NotFoundException; import com.prgrms.spring.repository.customer.CustomerRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -29,7 +31,7 @@ public Customer createCustomer(CustomerCreateRequestDto customerCreateRequestDto @Transactional(readOnly = true) public Customer getCustomerById(UUID customerId) { return customerRepository.findById(customerId) - .orElseThrow(() -> new RuntimeException("고객 조회 실패")); + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_CUSTOMER_EXCEPTION, Error.NOT_FOUND_CUSTOMER_EXCEPTION.getMessage())); } @Transactional(readOnly = true) From 2d268d10d1cfb6a8acdf2dcb5bab1a32c65363d4 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 10:42:47 +0900 Subject: [PATCH 27/40] =?UTF-8?q?[Feat]=20create=20customer=20controller?= =?UTF-8?q?=EC=97=90=EC=84=9C=20input=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/controller/CustomerController.java | 17 +++++++++++------ src/main/java/com/prgrms/spring/io/Output.java | 1 - .../customer/JdbcCustomerRepository.java | 6 ++++-- .../voucher/JdbcVoucherRepository.java | 4 +++- .../service/customer/CustomerService.java | 6 +++++- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java index 2546de37fb..51936bf675 100644 --- a/src/main/java/com/prgrms/spring/controller/CustomerController.java +++ b/src/main/java/com/prgrms/spring/controller/CustomerController.java @@ -23,12 +23,9 @@ public class CustomerController { private static final Logger logger = LoggerFactory.getLogger(CustomerController.class); public void createCustomer() { - consoleView.showGetName(); - String name = consoleView.getCustomerName(); - consoleView.showGetEmail(); - String email = consoleView.getCustomerEmail(); - var request = CustomerCreateRequestDto.of(name, email); - Customer customer = customerService.createCustomer(request); + CustomerCreateRequestDto requestDto = createCustomerIO(); + Customer customer = customerService.createCustomer(requestDto); + if (customer == null) { consoleView.showErrorMsg(Error.CREATE_CUSTOMER_EXCEPTION); logger.error("고객 등록 실패"); @@ -40,4 +37,12 @@ public void createCustomer() { public void getAllCustomers() { consoleView.showAllCustomers(customerService.getAllCustomers()); } + + private CustomerCreateRequestDto createCustomerIO() { + consoleView.showGetName(); + String name = consoleView.getCustomerName(); + consoleView.showGetEmail(); + String email = consoleView.getCustomerEmail(); + return CustomerCreateRequestDto.of(name, email); + } } diff --git a/src/main/java/com/prgrms/spring/io/Output.java b/src/main/java/com/prgrms/spring/io/Output.java index e3d5547464..a2f99ada14 100644 --- a/src/main/java/com/prgrms/spring/io/Output.java +++ b/src/main/java/com/prgrms/spring/io/Output.java @@ -13,7 +13,6 @@ public interface Output { void showAllVouchers(List vouchers); void showErrorMsg(Error error); void showSuccessMsg(Success success); - void showGetName(); void showGetEmail(); void showAllCustomers(List customers); diff --git a/src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java b/src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java index 4b4ac6e78b..21c7032b47 100644 --- a/src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java +++ b/src/main/java/com/prgrms/spring/repository/customer/JdbcCustomerRepository.java @@ -22,6 +22,8 @@ public class JdbcCustomerRepository implements CustomerRepository { private final NamedParameterJdbcTemplate jdbcTemplate; + private static final int CHK_UPDATE = 1; + private static final RowMapper customerRowMapper = (resultSet, i) -> { var name = resultSet.getString("name"); var customerId = toUUID(resultSet.getBytes("customer_id")); @@ -43,7 +45,7 @@ private Map toParamMap(Customer customer) { public Customer insert(Customer customer) { var update = jdbcTemplate.update("INSERT INTO customer(customer_id, name, email, created_at) VALUES (UUID_TO_BIN(:customerId), :name, :email, :cratedAt)", toParamMap(customer)); - if (update != 1) { + if (update != CHK_UPDATE) { throw new RuntimeException("Noting was inserted"); } return customer; @@ -54,7 +56,7 @@ public Customer update(Customer customer) { var update = jdbcTemplate.update("UPDATE customer SET name = :name, email = :email WHERE customer_id = UUID_TO_BIN(:customerId)", toParamMap(customer) ); - if (update != 1) { + if (update != CHK_UPDATE) { throw new RuntimeException("Noting was updated"); } return customer; diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index 67c7900b2c..65ae7c3073 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -25,6 +25,8 @@ public class JdbcVoucherRepository implements VoucherRepository { private final NamedParameterJdbcTemplate jdbcTemplate; + private static final int CHK_UPDATE = 1; + private static final RowMapper voucherRowMapper = (resultSet, i) -> { var voucherName = resultSet.getString("voucher_name"); var voucherId = toUUID(resultSet.getBytes("voucher_id")); @@ -63,7 +65,7 @@ public Optional findById(UUID voucherId) { public Voucher insert(Voucher voucher) { var update = jdbcTemplate.update("INSERT INTO voucher(voucher_id, voucher_name, discount, discount_unit) VALUES (UUID_TO_BIN(:voucherId), :voucherName, :discount, :discountUnit)", toParamMap(voucher)); - if (update != 1) { + if (update != CHK_UPDATE) { throw new RuntimeException("Noting was inserted"); } return voucher; diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java index 8768017052..bbcf893e97 100644 --- a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java +++ b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java @@ -23,7 +23,11 @@ public class CustomerService { @Transactional public Customer createCustomer(CustomerCreateRequestDto customerCreateRequestDto) { - var newCustomer = Customer.newInstance(UUID.randomUUID(), customerCreateRequestDto.getName(), customerCreateRequestDto.getEmail(), LocalDateTime.now()); + Customer newCustomer = Customer.newInstance( + UUID.randomUUID(), + customerCreateRequestDto.getName(), + customerCreateRequestDto.getEmail(), + LocalDateTime.now()); customerRepository.insert(newCustomer); return newCustomer; } From 2cb01b9d5a1c128afb74635917a8d2e2adc19abe Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 12:03:03 +0900 Subject: [PATCH 28/40] =?UTF-8?q?[Feat]=20=EA=B3=A0=EA=B0=9D=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20dto=20=EC=83=9D=EC=84=B1=EC=9D=84=20consoleView?= =?UTF-8?q?=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/controller/CustomerController.java | 10 +------ .../com/prgrms/spring/io/ConsoleView.java | 27 ++++++------------- src/main/java/com/prgrms/spring/io/Input.java | 3 --- .../java/com/prgrms/spring/io/Output.java | 2 -- 4 files changed, 9 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java index 51936bf675..e39e27b957 100644 --- a/src/main/java/com/prgrms/spring/controller/CustomerController.java +++ b/src/main/java/com/prgrms/spring/controller/CustomerController.java @@ -23,7 +23,7 @@ public class CustomerController { private static final Logger logger = LoggerFactory.getLogger(CustomerController.class); public void createCustomer() { - CustomerCreateRequestDto requestDto = createCustomerIO(); + CustomerCreateRequestDto requestDto = consoleView.getCustomerCreateRequestDto(); Customer customer = customerService.createCustomer(requestDto); if (customer == null) { @@ -37,12 +37,4 @@ public void createCustomer() { public void getAllCustomers() { consoleView.showAllCustomers(customerService.getAllCustomers()); } - - private CustomerCreateRequestDto createCustomerIO() { - consoleView.showGetName(); - String name = consoleView.getCustomerName(); - consoleView.showGetEmail(); - String email = consoleView.getCustomerEmail(); - return CustomerCreateRequestDto.of(name, email); - } } diff --git a/src/main/java/com/prgrms/spring/io/ConsoleView.java b/src/main/java/com/prgrms/spring/io/ConsoleView.java index d9050c1980..a4ff15273d 100644 --- a/src/main/java/com/prgrms/spring/io/ConsoleView.java +++ b/src/main/java/com/prgrms/spring/io/ConsoleView.java @@ -1,5 +1,6 @@ package com.prgrms.spring.io; +import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; import com.prgrms.spring.domain.menu.MenuType; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Error; @@ -30,16 +31,6 @@ public Long getVoucherDiscount() { return Long.parseLong(scanner.nextLine()); } - @Override - public String getCustomerName() { - return scanner.nextLine(); - } - - @Override - public String getCustomerEmail() { - return scanner.nextLine(); - } - @Override public void showMenu() { System.out.println("=== Voucher Program ==="); @@ -77,17 +68,15 @@ public void showSuccessMsg(Success success) { } @Override - public void showGetName() { - System.out.print("이름을 입력해주세요 : "); + public void showAllCustomers(List customers) { + customers.forEach(System.out::println); } - @Override - public void showGetEmail() { + public CustomerCreateRequestDto getCustomerCreateRequestDto() { + System.out.print("이름을 입력해주세요 : "); + String name = scanner.nextLine(); System.out.print("이메일을 입력해주세요 : "); - } - - @Override - public void showAllCustomers(List customers) { - customers.forEach(System.out::println); + String email = scanner.nextLine(); + return CustomerCreateRequestDto.of(name, email); } } diff --git a/src/main/java/com/prgrms/spring/io/Input.java b/src/main/java/com/prgrms/spring/io/Input.java index dee908970a..88f12164b4 100644 --- a/src/main/java/com/prgrms/spring/io/Input.java +++ b/src/main/java/com/prgrms/spring/io/Input.java @@ -4,7 +4,4 @@ public interface Input { String getMenu(); int getVoucherType(); Long getVoucherDiscount(); - - String getCustomerName(); - String getCustomerEmail(); } diff --git a/src/main/java/com/prgrms/spring/io/Output.java b/src/main/java/com/prgrms/spring/io/Output.java index a2f99ada14..84d8e0a1e0 100644 --- a/src/main/java/com/prgrms/spring/io/Output.java +++ b/src/main/java/com/prgrms/spring/io/Output.java @@ -13,7 +13,5 @@ public interface Output { void showAllVouchers(List vouchers); void showErrorMsg(Error error); void showSuccessMsg(Success success); - void showGetName(); - void showGetEmail(); void showAllCustomers(List customers); } From a6bf4d1bc1f9eb081e490858eae55959b8b6608c Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 14:19:24 +0900 Subject: [PATCH 29/40] [Refacotr] --- .../java/com/prgrms/spring/AppRunner.java | 1 - .../spring/controller/CustomerController.java | 5 ++-- .../dto/request/VoucherCreateRequestDto.java | 19 +++++++++++++++ .../controller/voucher/VoucherController.java | 13 ++++------ .../prgrms/spring/domain/menu/MenuType.java | 2 +- .../com/prgrms/spring/io/ConsoleView.java | 24 +++++++++++++++---- .../java/com/prgrms/spring/io/Output.java | 6 +++-- .../service/customer/CustomerService.java | 8 ++----- .../service/voucher/VoucherService.java | 18 +++++++------- .../com/prgrms/spring/ApplicationTests.java | 13 ---------- 10 files changed, 62 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java delete mode 100644 src/test/java/com/prgrms/spring/ApplicationTests.java diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index 5e508d60e9..ae90102e46 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -26,7 +26,6 @@ public class AppRunner implements CommandLineRunner { public void run(String... args) throws Exception { boolean isExecute = true; while (isExecute) { - logger.info("프로그램 시작."); consoleView.showMenu(); MenuType menuType = null; try { diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java index e39e27b957..09d7e108e5 100644 --- a/src/main/java/com/prgrms/spring/controller/CustomerController.java +++ b/src/main/java/com/prgrms/spring/controller/CustomerController.java @@ -11,6 +11,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; +import javax.management.RuntimeErrorException; import java.util.ArrayList; import java.util.List; @@ -28,8 +29,8 @@ public void createCustomer() { if (customer == null) { consoleView.showErrorMsg(Error.CREATE_CUSTOMER_EXCEPTION); - logger.error("고객 등록 실패"); - return; + logger.error("고객 등록 실패 -> name : " + requestDto.getName() + ", email : " + requestDto.getEmail()); + throw new RuntimeException("고객 등록 실패"); } consoleView.showSuccessMsg(Success.CREATE_CUSTOMER_SUCCESS); } diff --git a/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java b/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java new file mode 100644 index 0000000000..8dad3a25b0 --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java @@ -0,0 +1,19 @@ +package com.prgrms.spring.controller.dto.request; + +import com.prgrms.spring.domain.voucher.VoucherType; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class VoucherCreateRequestDto { + private VoucherType voucherType; + private Long discount; + + public static VoucherCreateRequestDto of(VoucherType voucherType, Long discount) { + return new VoucherCreateRequestDto(voucherType,discount); + } +} diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java index 221cccb0be..8a5fe89cbf 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java @@ -1,5 +1,6 @@ package com.prgrms.spring.controller.voucher; +import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Error; @@ -24,16 +25,12 @@ public class VoucherController { private static final Logger logger = LoggerFactory.getLogger(VoucherController.class); public void createVoucher() { - - consoleView.showVoucherTypes(); - VoucherType type = VoucherType.matchType(consoleView.getVoucherType()); - consoleView.showVoucherPrompt(type); - Long discount = consoleView.getVoucherDiscount(); - Voucher voucher = voucherService.createVoucher(type, discount); + VoucherCreateRequestDto voucherCreateRequestDto = consoleView.getVoucherCreateRequestDto(); + Voucher voucher = voucherService.createVoucher(voucherCreateRequestDto); if (voucher == null) { consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); - logger.error("바우처 생성 실패"); - return; + logger.error("바우처 생성 실패 -> type: " + voucherCreateRequestDto.getVoucherType() + ", discount :" + voucherCreateRequestDto.getDiscount()); + throw new RuntimeException("바우처 생성 실패"); } consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); } diff --git a/src/main/java/com/prgrms/spring/domain/menu/MenuType.java b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java index d9b499a108..5d95a5a0cd 100644 --- a/src/main/java/com/prgrms/spring/domain/menu/MenuType.java +++ b/src/main/java/com/prgrms/spring/domain/menu/MenuType.java @@ -23,6 +23,6 @@ public static MenuType matchType(String type) { return Arrays.stream(values()) .filter(v -> type.equals(v.name)) .findFirst() - .orElseThrow(() -> new IllegalStateException(String.valueOf(Error.VALIDATION_WRONG_TYPE))); + .orElseThrow(() -> new IllegalArgumentException(String.valueOf(Error.VALIDATION_WRONG_TYPE))); } } diff --git a/src/main/java/com/prgrms/spring/io/ConsoleView.java b/src/main/java/com/prgrms/spring/io/ConsoleView.java index a4ff15273d..8f0415f885 100644 --- a/src/main/java/com/prgrms/spring/io/ConsoleView.java +++ b/src/main/java/com/prgrms/spring/io/ConsoleView.java @@ -1,13 +1,17 @@ package com.prgrms.spring.io; import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; +import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; +import com.prgrms.spring.domain.customer.Customer; import com.prgrms.spring.domain.menu.MenuType; +import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Error; import com.prgrms.spring.exception.Success; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; import java.util.Scanner; @@ -53,8 +57,10 @@ public void showVoucherPrompt(VoucherType voucherType) { } @Override - public void showAllVouchers(List vouchers) { - vouchers.forEach(System.out::println); + public void showAllVouchers(List vouchers) { + List outputList = new ArrayList<>(); + vouchers.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); + outputList.forEach(System.out::println); } @Override @@ -68,8 +74,10 @@ public void showSuccessMsg(Success success) { } @Override - public void showAllCustomers(List customers) { - customers.forEach(System.out::println); + public void showAllCustomers(List customers) { + List outputList = new ArrayList<>(); + customers.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); + outputList.forEach(System.out::println); } public CustomerCreateRequestDto getCustomerCreateRequestDto() { @@ -79,4 +87,12 @@ public CustomerCreateRequestDto getCustomerCreateRequestDto() { String email = scanner.nextLine(); return CustomerCreateRequestDto.of(name, email); } + + public VoucherCreateRequestDto getVoucherCreateRequestDto() { + showVoucherTypes(); + VoucherType type = VoucherType.matchType(getVoucherType()); + showVoucherPrompt(type); + Long discount = getVoucherDiscount(); + return VoucherCreateRequestDto.of(type, discount); + } } diff --git a/src/main/java/com/prgrms/spring/io/Output.java b/src/main/java/com/prgrms/spring/io/Output.java index 84d8e0a1e0..04eeab109b 100644 --- a/src/main/java/com/prgrms/spring/io/Output.java +++ b/src/main/java/com/prgrms/spring/io/Output.java @@ -1,5 +1,7 @@ package com.prgrms.spring.io; +import com.prgrms.spring.domain.customer.Customer; +import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Error; import com.prgrms.spring.exception.Success; @@ -10,8 +12,8 @@ public interface Output { void showMenu(); void showVoucherTypes(); void showVoucherPrompt(VoucherType voucherType); - void showAllVouchers(List vouchers); + void showAllVouchers(List vouchers); void showErrorMsg(Error error); void showSuccessMsg(Success success); - void showAllCustomers(List customers); + void showAllCustomers(List customers); } diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java index bbcf893e97..c209ddd89a 100644 --- a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java +++ b/src/main/java/com/prgrms/spring/service/customer/CustomerService.java @@ -11,7 +11,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.UUID; @@ -39,10 +38,7 @@ public Customer getCustomerById(UUID customerId) { } @Transactional(readOnly = true) - public List getAllCustomers() { - List customerList = customerRepository.findAll(); - List outputList = new ArrayList<>(); - customerList.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); - return outputList; + public List getAllCustomers() { + return customerRepository.findAll(); } } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index f743560635..842ddb1843 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -1,5 +1,6 @@ package com.prgrms.spring.service.voucher; +import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; import com.prgrms.spring.domain.voucher.FixedAmountVoucher; import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; import com.prgrms.spring.domain.voucher.Voucher; @@ -18,22 +19,19 @@ public class VoucherService { private final VoucherRepository voucherRepository; @Transactional - public Voucher createVoucher(VoucherType type, Long discount) { + public Voucher createVoucher(VoucherCreateRequestDto requestDto) { Voucher voucher = null; - if (type == VoucherType.FIXED_AMOUNT) { - voucher = FixedAmountVoucher.newInstance(UUID.randomUUID(), discount); - } else if (type == VoucherType.PERCENT_DISCOUNT) { - voucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), discount); + if (requestDto.getVoucherType() == VoucherType.FIXED_AMOUNT) { + voucher = FixedAmountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); + } else if (requestDto.getVoucherType() == VoucherType.PERCENT_DISCOUNT) { + voucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); } voucherRepository.insert(voucher); return voucher; } @Transactional(readOnly = true) - public List getAllVoucher() { - List voucherList = voucherRepository.findAll(); - List outputList = new ArrayList<>(); - voucherList.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); - return outputList; + public List getAllVoucher() { + return voucherRepository.findAll(); } } diff --git a/src/test/java/com/prgrms/spring/ApplicationTests.java b/src/test/java/com/prgrms/spring/ApplicationTests.java deleted file mode 100644 index 24a82bdfa1..0000000000 --- a/src/test/java/com/prgrms/spring/ApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.prgrms.spring; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class ApplicationTests { - - @Test - void contextLoads() { - } - -} From 92cd9d16fd6dd5cb79e9c935435947a74b3d2ffe Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 14:24:41 +0900 Subject: [PATCH 30/40] =?UTF-8?q?[Refactor]=20discount=20=EA=B0=92=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/spring/domain/voucher/FixedAmountVoucher.java | 6 +++++- .../spring/domain/voucher/PercentDiscountVoucher.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java index 6d0cd1ceb2..f166fbd36e 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/FixedAmountVoucher.java @@ -13,7 +13,7 @@ public class FixedAmountVoucher implements Voucher { private final String discountUnit = "$"; public static FixedAmountVoucher newInstance(UUID voucherId, long discount) { - if (discount <= 0) throw new IllegalArgumentException("유효하지 않은 할인 금액"); + chkDiscountValue(discount); return new FixedAmountVoucher(voucherId, discount); } @@ -36,4 +36,8 @@ public String getDiscountUnit() { public String getVoucherName() { return voucherName; } + + private static void chkDiscountValue(long discount) { + if (discount <= 0) throw new IllegalArgumentException("유효하지 않은 할인 금액"); + } } diff --git a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java index 26ee8c6bb8..5d2fc59d98 100644 --- a/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/prgrms/spring/domain/voucher/PercentDiscountVoucher.java @@ -13,7 +13,7 @@ public class PercentDiscountVoucher implements Voucher { private final String discountUnit = "%"; public static PercentDiscountVoucher newInstance(UUID voucherId, long discount) { - if (discount <= 0 || discount >= 100) throw new IllegalArgumentException("유효하지 않은 할인 금액"); + chkDiscountValue(discount); return new PercentDiscountVoucher(voucherId, discount); } @@ -36,4 +36,8 @@ public String getDiscountUnit() { public String getVoucherName() { return voucherName; } + + private static void chkDiscountValue(long discount) { + if (discount <= 0 || discount >= 100) throw new IllegalArgumentException("유효하지 않은 할인 금액"); + } } From c0896181d56e43d3adb7a40cb8801e8850f89b4d Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 13 Jul 2023 14:33:15 +0900 Subject: [PATCH 31/40] =?UTF-8?q?[Refactor]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=A1=9C=EA=B7=B8=20=EC=82=AD=EC=A1=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/com/prgrms/spring/VoucherRepositoryTest.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/java/com/prgrms/spring/VoucherRepositoryTest.java b/src/test/java/com/prgrms/spring/VoucherRepositoryTest.java index d059e61adc..7956bfc2fe 100644 --- a/src/test/java/com/prgrms/spring/VoucherRepositoryTest.java +++ b/src/test/java/com/prgrms/spring/VoucherRepositoryTest.java @@ -7,8 +7,6 @@ import com.prgrms.spring.repository.voucher.JdbcVoucherRepository; import com.zaxxer.hikari.HikariDataSource; import org.junit.jupiter.api.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; @@ -33,8 +31,6 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class VoucherRepositoryTest { - private static final Logger logger = LoggerFactory.getLogger(VoucherRepositoryTest.class); - @Configuration @ComponentScan( basePackages = {"com.prgrms.spring"} @@ -98,7 +94,7 @@ public void testInsert() { jdbcVoucherRepository.insert(newFixedAmountVoucher); jdbcVoucherRepository.insert(newPercentAmountVoucher); } catch (BadSqlGrammarException e) { - logger.error("Got BadSqlGrammarException error code -> {}", e.getSQLException().getErrorCode(), e); + throw new BadSqlGrammarException(e.getMessage(), e.getSql(), e.getSQLException()); } var retrievedVoucher = jdbcVoucherRepository.findById(newPercentAmountVoucher.getVoucherId()); From e509d5644f7d1b118c4620b544ec2acf357bea3d Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 20 Jul 2023 20:26:51 +0900 Subject: [PATCH 32/40] =?UTF-8?q?[Feat]=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 + .../java/com/prgrms/spring/AppRunner.java | 2 +- .../advice/ControllerExceptionAdvice.java | 80 +++++++++++++++++++ .../prgrms/spring/common/dto/ApiResponse.java | 34 ++++++++ .../{voucher => }/VoucherController.java | 6 +- .../controller/api/VoucherRestController.java | 34 ++++++++ .../dto/response/VoucherResponseDto.java | 18 +++++ .../com/prgrms/spring/exception/Error.java | 19 +++-- .../com/prgrms/spring/exception/Success.java | 11 ++- .../service/voucher/VoucherService.java | 10 ++- 10 files changed, 203 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java create mode 100644 src/main/java/com/prgrms/spring/common/dto/ApiResponse.java rename src/main/java/com/prgrms/spring/controller/{voucher => }/VoucherController.java (90%) create mode 100644 src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java create mode 100644 src/main/java/com/prgrms/spring/controller/dto/response/VoucherResponseDto.java diff --git a/pom.xml b/pom.xml index 78b3717547..89a763978c 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,10 @@ mysql-connector-java 8.0.25 + + org.springframework.boot + spring-boot-starter-web + diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index ae90102e46..71156021c7 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -1,7 +1,7 @@ package com.prgrms.spring; import com.prgrms.spring.controller.CustomerController; -import com.prgrms.spring.controller.voucher.VoucherController; +import com.prgrms.spring.controller.VoucherController; import com.prgrms.spring.domain.menu.MenuType; import com.prgrms.spring.exception.Error; import com.prgrms.spring.io.ConsoleView; diff --git a/src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java b/src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java new file mode 100644 index 0000000000..6d66e00cc4 --- /dev/null +++ b/src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java @@ -0,0 +1,80 @@ +package com.prgrms.spring.common.advice; + +import com.prgrms.spring.common.dto.ApiResponse; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.model.CustomException; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.validation.FieldError; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingRequestHeaderException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.Objects; + +@RestControllerAdvice +@Component +@RequiredArgsConstructor +public class ControllerExceptionAdvice { + + /** + * 400 BAD_REQUEST + */ + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MethodArgumentNotValidException.class) + protected ApiResponse handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) { + FieldError fieldError = Objects.requireNonNull(e.getFieldError()); + return ApiResponse.error(Error.VALIDATION_REQUEST_MISSING_EXCEPTION, String.format("%s. (%s)", fieldError.getDefaultMessage(), fieldError.getField())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingRequestHeaderException.class) + protected ApiResponse handleMissingRequestHeaderException(final MissingRequestHeaderException e) { + return ApiResponse.error(Error.VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION, String.format("%s. (%s)", Error.VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION.getMessage(), e.getHeaderName())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingServletRequestParameterException.class) + protected ApiResponse handleMissingRequestParameterException(final MissingServletRequestParameterException e) { + return ApiResponse.error(Error.VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION, String.format("%s. (%s)", Error.VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION.getMessage(), e.getParameterName())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(ConstraintViolationException.class) + protected ApiResponse handleRequestParameterNotValidException(final ConstraintViolationException e) { + return ApiResponse.error(Error.PAGE_REQUEST_VALIDATION_EXCEPTION, String.format("%s", e.getConstraintName())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + protected ApiResponse handleHttpRequestMethodNotSupportedException(final HttpRequestMethodNotSupportedException e) { + return ApiResponse.error(Error.REQUEST_METHOD_VALIDATION_EXCEPTION, e.getMessage()); + } + + /** + * 500 Internal Server Error + */ + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + protected ApiResponse handleException(final Exception error, final HttpServletRequest request) throws IOException { + return ApiResponse.error(Error.INTERNAL_SERVER_ERROR); + } + + /** + * custom error + */ + @ExceptionHandler(CustomException.class) + protected ResponseEntity handleSoptException(CustomException e) { + return ResponseEntity.status(e.getHttpStatus()) + .body(ApiResponse.error(e.getError(), e.getMessage())); + } +} diff --git a/src/main/java/com/prgrms/spring/common/dto/ApiResponse.java b/src/main/java/com/prgrms/spring/common/dto/ApiResponse.java new file mode 100644 index 0000000000..936382e2d7 --- /dev/null +++ b/src/main/java/com/prgrms/spring/common/dto/ApiResponse.java @@ -0,0 +1,34 @@ +package com.prgrms.spring.common.dto; + +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.Success; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class ApiResponse { + + private final int code; + private final String message; + private T data; + + public static ApiResponse success(Success success) { + return new ApiResponse<>(success.getHttpStatusCode(), success.getMessage()); + } + + public static ApiResponse success(Success success, T data) { + return new ApiResponse(success.getHttpStatusCode(), success.getMessage(), data); + } + + public static ApiResponse error(Error error) { + return new ApiResponse<>(error.getHttpStatusCode(), error.getMessage()); + } + + public static ApiResponse error(Error error, String message) { + return new ApiResponse<>(error.getHttpStatusCode(), message); + } +} diff --git a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/spring/controller/VoucherController.java similarity index 90% rename from src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java rename to src/main/java/com/prgrms/spring/controller/VoucherController.java index 8a5fe89cbf..4fd0a17a02 100644 --- a/src/main/java/com/prgrms/spring/controller/voucher/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/VoucherController.java @@ -1,8 +1,7 @@ -package com.prgrms.spring.controller.voucher; +package com.prgrms.spring.controller; import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; import com.prgrms.spring.domain.voucher.Voucher; -import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Error; import com.prgrms.spring.exception.Success; import com.prgrms.spring.io.ConsoleView; @@ -12,9 +11,6 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; -import java.util.ArrayList; -import java.util.List; - @Controller @AllArgsConstructor diff --git a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java new file mode 100644 index 0000000000..288edcce90 --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java @@ -0,0 +1,34 @@ +package com.prgrms.spring.controller.api; + +import com.prgrms.spring.common.dto.ApiResponse; +import com.prgrms.spring.controller.dto.response.VoucherResponseDto; +import com.prgrms.spring.exception.Success; +import com.prgrms.spring.service.voucher.VoucherService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/voucher") +public class VoucherRestController { + + private final VoucherService voucherService; + + // 1. 전체 조회 기능 + @GetMapping("") + @ResponseStatus(HttpStatus.OK) + public ApiResponse> getAllVoucher() { + return ApiResponse.success(Success.GET_VOUCHER_SUCCESS, voucherService.getAllVoucher()); + } + + // 2. 조건별 조회 기능 + + // 3. 바우처 추가기능 + + // 4. 바우처 삭제기능 + + // 5. 바우처 아이디로 조회 기능 +} diff --git a/src/main/java/com/prgrms/spring/controller/dto/response/VoucherResponseDto.java b/src/main/java/com/prgrms/spring/controller/dto/response/VoucherResponseDto.java new file mode 100644 index 0000000000..489c4a6e5f --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/dto/response/VoucherResponseDto.java @@ -0,0 +1,18 @@ +package com.prgrms.spring.controller.dto.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class VoucherResponseDto { + private String voucherName; + private String discount; + + public static VoucherResponseDto of(String voucherName, String discount) { + return new VoucherResponseDto(voucherName, discount); + } +} diff --git a/src/main/java/com/prgrms/spring/exception/Error.java b/src/main/java/com/prgrms/spring/exception/Error.java index 53c648233e..b432a1582f 100644 --- a/src/main/java/com/prgrms/spring/exception/Error.java +++ b/src/main/java/com/prgrms/spring/exception/Error.java @@ -3,16 +3,25 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; +import org.springframework.http.HttpStatus; @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum Error { - VALIDATION_WRONG_TYPE("잘못된 입력값입니다."), - CREATE_VOUCHER_EXCEPTION("바우처 등록에 실패하였습니다."), - CREATE_CUSTOMER_EXCEPTION("고객 등록에 실패하였습니다."), - NOT_FOUND_CUSTOMER_EXCEPTION("유저 조회 실패"), - NOT_FOUND_VOUCHER_EXCEPTION("바우처 조회 실패") + VALIDATION_WRONG_TYPE(HttpStatus.BAD_REQUEST, "잘못된 입력값입니다."), + CREATE_VOUCHER_EXCEPTION(HttpStatus.NOT_FOUND, "바우처 등록에 실패하였습니다."), + CREATE_CUSTOMER_EXCEPTION(HttpStatus.NOT_FOUND, "고객 등록에 실패하였습니다."), + NOT_FOUND_CUSTOMER_EXCEPTION(HttpStatus.NOT_FOUND, "유저 조회 실패"), + NOT_FOUND_VOUCHER_EXCEPTION(HttpStatus.NOT_FOUND, "바우처 조회 실패"), + VALIDATION_REQUEST_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청값이 입력되지 않았습니다."), + VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 헤더값이 입력되지 않았습니다."), + VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 파라미터값이 입력되지 않았습니다.") ; + private final HttpStatus httpStatus; private final String message; + + public int getHttpStatusCode() { + return httpStatus.value(); + } } diff --git a/src/main/java/com/prgrms/spring/exception/Success.java b/src/main/java/com/prgrms/spring/exception/Success.java index 1a0fa162a4..45f7790c28 100644 --- a/src/main/java/com/prgrms/spring/exception/Success.java +++ b/src/main/java/com/prgrms/spring/exception/Success.java @@ -3,13 +3,20 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; +import org.springframework.http.HttpStatus; @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum Success { - CREATE_VOUCHER_SUCCESS("바우처가 성공적으로 등록되었습니다."), - CREATE_CUSTOMER_SUCCESS("고객이 성공적으로 등록되었습니다."), + CREATE_VOUCHER_SUCCESS(HttpStatus.CREATED, "바우처가 성공적으로 등록되었습니다."), + CREATE_CUSTOMER_SUCCESS(HttpStatus.CREATED, "고객이 성공적으로 등록되었습니다."), + GET_VOUCHER_SUCCESS(HttpStatus.OK, "바우처 조회 성공") ; + private final HttpStatus httpStatus; private final String message; + + public int getHttpStatusCode() { + return httpStatus.value(); + } } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 842ddb1843..6d10524180 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -1,6 +1,7 @@ package com.prgrms.spring.service.voucher; import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; +import com.prgrms.spring.controller.dto.response.VoucherResponseDto; import com.prgrms.spring.domain.voucher.FixedAmountVoucher; import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; import com.prgrms.spring.domain.voucher.Voucher; @@ -11,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; @Service @AllArgsConstructor @@ -31,7 +33,11 @@ public Voucher createVoucher(VoucherCreateRequestDto requestDto) { } @Transactional(readOnly = true) - public List getAllVoucher() { - return voucherRepository.findAll(); + public List getAllVoucher() { + List vouchers = voucherRepository.findAll(); + return vouchers.stream().map(voucher -> VoucherResponseDto.of( + voucher.getVoucherName(), + voucher.getDiscount() + voucher.getDiscountUnit() + )).collect(Collectors.toList()); } } From 1468bb67e5d8d6481184c6763508f144695316bc Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 20 Jul 2023 21:28:15 +0900 Subject: [PATCH 33/40] =?UTF-8?q?[Feat]=20=EC=A1=B0=EA=B1=B4=EB=B3=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/VoucherRestController.java | 8 ++++++++ .../voucher/JdbcVoucherRepository.java | 7 +++++++ .../repository/voucher/VoucherRepository.java | 2 ++ .../spring/service/voucher/VoucherService.java | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java index 288edcce90..3a7cdef91b 100644 --- a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java +++ b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java @@ -1,7 +1,9 @@ package com.prgrms.spring.controller.api; +import com.google.protobuf.Api; import com.prgrms.spring.common.dto.ApiResponse; import com.prgrms.spring.controller.dto.response.VoucherResponseDto; +import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Success; import com.prgrms.spring.service.voucher.VoucherService; import lombok.RequiredArgsConstructor; @@ -25,6 +27,12 @@ public ApiResponse> getAllVoucher() { } // 2. 조건별 조회 기능 + @GetMapping("/search") + @ResponseStatus(HttpStatus.OK) + public ApiResponse> getSearchedVoucher(@RequestParam String type) { + VoucherType voucherType = VoucherType.valueOf(type); + return ApiResponse.success(Success.GET_VOUCHER_SUCCESS, voucherService.getSearchedVoucher(voucherType)); + } // 3. 바우처 추가기능 diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index 65ae7c3073..c67bc3b763 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -76,6 +76,13 @@ public List findAll() { return jdbcTemplate.query("select * from voucher", voucherRowMapper); } + @Override + public List findByDiscountUnit(String discountUnit) { + return jdbcTemplate.query("SELECT * FROM voucher WHERE discount_unit = :discountUnit", + Collections.singletonMap("discountUnit", discountUnit), + voucherRowMapper); + } + static UUID toUUID(byte[] bytes) { var byteBuffer = ByteBuffer.wrap(bytes); return new UUID(byteBuffer.getLong(), byteBuffer.getLong()); diff --git a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java index 76e47d0de1..5fba577500 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java @@ -13,4 +13,6 @@ public interface VoucherRepository { Voucher insert(Voucher voucher); List findAll(); + + List findByDiscountUnit(String discountUnit); } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 6d10524180..6a4bd7ede2 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -40,4 +40,22 @@ public List getAllVoucher() { voucher.getDiscount() + voucher.getDiscountUnit() )).collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public List getSearchedVoucher(VoucherType voucherType) { + String discountUnit = null; + switch (voucherType) { + case PERCENT_DISCOUNT: + discountUnit = "%"; + break; + case FIXED_AMOUNT: + discountUnit = "$"; + break; + } + List vouchers = voucherRepository.findByDiscountUnit(discountUnit); + return vouchers.stream().map(voucher -> VoucherResponseDto.of( + voucher.getVoucherName(), + voucher.getDiscount() + voucher.getDiscountUnit() + )).collect(Collectors.toList()); + } } From 0b9187ff7a52ea905b5449a1b19de1b98d8f8d2e Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 20 Jul 2023 21:33:02 +0900 Subject: [PATCH 34/40] =?UTF-8?q?[Feat]=20=EB=B0=94=EC=9A=B0=EC=B2=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/spring/controller/api/VoucherRestController.java | 6 ++++++ .../com/prgrms/spring/service/voucher/VoucherService.java | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java index 3a7cdef91b..278bc7ed4d 100644 --- a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java +++ b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java @@ -2,6 +2,7 @@ import com.google.protobuf.Api; import com.prgrms.spring.common.dto.ApiResponse; +import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; import com.prgrms.spring.controller.dto.response.VoucherResponseDto; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Success; @@ -35,6 +36,11 @@ public ApiResponse> getSearchedVoucher(@RequestParam St } // 3. 바우처 추가기능 + @PostMapping("/") + @ResponseStatus(HttpStatus.CREATED) + public ApiResponse createVoucher(@RequestBody VoucherCreateRequestDto requestDto) { + return ApiResponse.success(Success.CREATE_VOUCHER_SUCCESS, voucherService.createVoucher(requestDto)); + } // 4. 바우처 삭제기능 diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 6a4bd7ede2..c7e545ab06 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -21,7 +21,7 @@ public class VoucherService { private final VoucherRepository voucherRepository; @Transactional - public Voucher createVoucher(VoucherCreateRequestDto requestDto) { + public VoucherResponseDto createVoucher(VoucherCreateRequestDto requestDto) { Voucher voucher = null; if (requestDto.getVoucherType() == VoucherType.FIXED_AMOUNT) { voucher = FixedAmountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); @@ -29,7 +29,7 @@ public Voucher createVoucher(VoucherCreateRequestDto requestDto) { voucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); } voucherRepository.insert(voucher); - return voucher; + return VoucherResponseDto.of(voucher.getVoucherName(), voucher.getDiscount() + voucher.getDiscountUnit()); } @Transactional(readOnly = true) From 16b8f5abf994ee7a67a680da2c6677c5e7029a28 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 20 Jul 2023 21:44:21 +0900 Subject: [PATCH 35/40] =?UTF-8?q?[Feat]=20=EB=B0=94=EC=9A=B0=EC=B2=98=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/controller/api/VoucherRestController.java | 6 ++++++ src/main/java/com/prgrms/spring/exception/Success.java | 3 ++- .../spring/repository/voucher/JdbcVoucherRepository.java | 8 ++++++++ .../spring/repository/voucher/VoucherRepository.java | 2 ++ .../com/prgrms/spring/service/voucher/VoucherService.java | 5 +++++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java index 278bc7ed4d..7c815a6bb4 100644 --- a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java +++ b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java @@ -43,6 +43,12 @@ public ApiResponse createVoucher(@RequestBody VoucherCreateR } // 4. 바우처 삭제기능 + @DeleteMapping("/{voucherId}") + @ResponseStatus(HttpStatus.OK) + public ApiResponse deleteVoucher(@RequestHeader String voucherId) { + voucherService.deleteVoucher(voucherId); + return ApiResponse.success(Success.DELETE_VOUCHER_SUCCESS); + } // 5. 바우처 아이디로 조회 기능 } diff --git a/src/main/java/com/prgrms/spring/exception/Success.java b/src/main/java/com/prgrms/spring/exception/Success.java index 45f7790c28..43614954e6 100644 --- a/src/main/java/com/prgrms/spring/exception/Success.java +++ b/src/main/java/com/prgrms/spring/exception/Success.java @@ -10,7 +10,8 @@ public enum Success { CREATE_VOUCHER_SUCCESS(HttpStatus.CREATED, "바우처가 성공적으로 등록되었습니다."), CREATE_CUSTOMER_SUCCESS(HttpStatus.CREATED, "고객이 성공적으로 등록되었습니다."), - GET_VOUCHER_SUCCESS(HttpStatus.OK, "바우처 조회 성공") + GET_VOUCHER_SUCCESS(HttpStatus.OK, "바우처 조회 성공"), + DELETE_VOUCHER_SUCCESS(HttpStatus.OK, "바우처 삭제 성공"), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index c67bc3b763..f27b3959ac 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -83,6 +83,14 @@ public List findByDiscountUnit(String discountUnit) { voucherRowMapper); } + @Override + public List deleteVoucher(String voucherIdString) { + UUID voucherId = UUID.fromString(voucherIdString); + return jdbcTemplate.query("DELETE FROM voucher WHERE voucher_id = UUID_TO_BIN(:voucherId)", + Collections.singletonMap("voucherId", voucherId), + voucherRowMapper); + } + static UUID toUUID(byte[] bytes) { var byteBuffer = ByteBuffer.wrap(bytes); return new UUID(byteBuffer.getLong(), byteBuffer.getLong()); diff --git a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java index 5fba577500..074397d6f6 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java @@ -15,4 +15,6 @@ public interface VoucherRepository { List findAll(); List findByDiscountUnit(String discountUnit); + + List deleteVoucher(String voucherIdString); } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index c7e545ab06..ef9576f2fa 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -58,4 +58,9 @@ public List getSearchedVoucher(VoucherType voucherType) { voucher.getDiscount() + voucher.getDiscountUnit() )).collect(Collectors.toList()); } + + @Transactional + public void deleteVoucher(String voucherId) { + List deletedVouchers = voucherRepository.deleteVoucher(voucherId); + } } From 9bc8880e59559cd24cf14dd1c7a35f47d3293dc0 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 20 Jul 2023 21:59:07 +0900 Subject: [PATCH 36/40] =?UTF-8?q?[Feat]=20=EB=B0=94=EC=9A=B0=EC=B2=98=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EB=94=94=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/controller/api/VoucherRestController.java | 7 ++++++- .../prgrms/spring/service/voucher/VoucherService.java | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java index 7c815a6bb4..da672fc77d 100644 --- a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java +++ b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java @@ -45,10 +45,15 @@ public ApiResponse createVoucher(@RequestBody VoucherCreateR // 4. 바우처 삭제기능 @DeleteMapping("/{voucherId}") @ResponseStatus(HttpStatus.OK) - public ApiResponse deleteVoucher(@RequestHeader String voucherId) { + public ApiResponse deleteVoucher(@PathVariable String voucherId) { voucherService.deleteVoucher(voucherId); return ApiResponse.success(Success.DELETE_VOUCHER_SUCCESS); } // 5. 바우처 아이디로 조회 기능 + @GetMapping("/{voucherId}") + @ResponseStatus(HttpStatus.OK) + public ApiResponse getVoucherById(@PathVariable String voucherId) { + return ApiResponse.success(Success.GET_VOUCHER_SUCCESS, voucherService.getVoucherById(voucherId)); + } } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index ef9576f2fa..2d34e97ba9 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -6,6 +6,8 @@ import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; import com.prgrms.spring.domain.voucher.Voucher; import com.prgrms.spring.domain.voucher.VoucherType; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.model.NotFoundException; import com.prgrms.spring.repository.voucher.VoucherRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -63,4 +65,12 @@ public List getSearchedVoucher(VoucherType voucherType) { public void deleteVoucher(String voucherId) { List deletedVouchers = voucherRepository.deleteVoucher(voucherId); } + + @Transactional(readOnly = true) + public VoucherResponseDto getVoucherById(String voucherId) { + Voucher voucher = voucherRepository.findById(UUID.fromString(voucherId)) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_VOUCHER_EXCEPTION, Error.NOT_FOUND_VOUCHER_EXCEPTION.getMessage())); + return VoucherResponseDto.of(voucher.getVoucherName(), voucher.getDiscount() + voucher.getDiscountUnit()); + } + } From e95e709476424600c5b3f5b1f259dc2728c7e7ea Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 20 Jul 2023 22:54:08 +0900 Subject: [PATCH 37/40] =?UTF-8?q?[Feat]=20api=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/prgrms/spring/AppRunner.java | 114 +++++----- .../advice/ControllerExceptionAdvice.java | 12 -- .../spring/controller/CustomerController.java | 82 ++++---- .../spring/controller/VoucherController.java | 74 +++---- .../controller/api/VoucherRestController.java | 2 +- .../dto/request/VoucherCreateRequestDto.java | 4 +- .../com/prgrms/spring/exception/Error.java | 4 +- .../exception/model/CustomException.java | 4 + .../com/prgrms/spring/io/ConsoleView.java | 196 +++++++++--------- .../voucher/JdbcVoucherRepository.java | 11 +- .../voucher/MemoryVoucherRepository.java | 64 +++--- .../repository/voucher/VoucherRepository.java | 2 +- .../service/voucher/VoucherService.java | 8 +- .../resources/logFiles/log.2023-07-20.log | 0 14 files changed, 286 insertions(+), 291 deletions(-) create mode 100644 src/main/resources/logFiles/log.2023-07-20.log diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java index 71156021c7..efddd29589 100644 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ b/src/main/java/com/prgrms/spring/AppRunner.java @@ -1,57 +1,57 @@ -package com.prgrms.spring; - -import com.prgrms.spring.controller.CustomerController; -import com.prgrms.spring.controller.VoucherController; -import com.prgrms.spring.domain.menu.MenuType; -import com.prgrms.spring.exception.Error; -import com.prgrms.spring.io.ConsoleView; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - - -@AllArgsConstructor -@Component -public class AppRunner implements CommandLineRunner { - private final VoucherController voucherController; - private final CustomerController customerController; - - private final ConsoleView consoleView; - - private static final Logger logger = LoggerFactory.getLogger(AppRunner.class); - - @Override - public void run(String... args) throws Exception { - boolean isExecute = true; - while (isExecute) { - consoleView.showMenu(); - MenuType menuType = null; - try { - menuType = MenuType.matchType(consoleView.getMenu()); - } catch (IllegalStateException e) { - logger.error("input error!"); - consoleView.showErrorMsg(Error.VALIDATION_WRONG_TYPE); - continue; - } - switch (menuType) { - case EXIT: - isExecute = false; - break; - case CREATE_VOUCHER: - voucherController.createVoucher(); - break; - case LIST_VOUCHER: - voucherController.getAllVoucher(); - break; - case CREATE_CUSTOMER: - customerController.createCustomer(); - break; - case LIST_CUSTOMER: - customerController.getAllCustomers(); - break; - } - } - } -} +//package com.prgrms.spring; +// +//import com.prgrms.spring.controller.CustomerController; +//import com.prgrms.spring.controller.VoucherController; +//import com.prgrms.spring.domain.menu.MenuType; +//import com.prgrms.spring.exception.Error; +//import com.prgrms.spring.io.ConsoleView; +//import lombok.AllArgsConstructor; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.boot.CommandLineRunner; +//import org.springframework.stereotype.Component; +// +// +//@AllArgsConstructor +//@Component +//public class AppRunner implements CommandLineRunner { +// private final VoucherController voucherController; +// private final CustomerController customerController; +// +// private final ConsoleView consoleView; +// +// private static final Logger logger = LoggerFactory.getLogger(AppRunner.class); +// +// @Override +// public void run(String... args) throws Exception { +// boolean isExecute = true; +// while (isExecute) { +// consoleView.showMenu(); +// MenuType menuType = null; +// try { +// menuType = MenuType.matchType(consoleView.getMenu()); +// } catch (IllegalStateException e) { +// logger.error("input error!"); +// consoleView.showErrorMsg(Error.VALIDATION_WRONG_TYPE); +// continue; +// } +// switch (menuType) { +// case EXIT: +// isExecute = false; +// break; +// case CREATE_VOUCHER: +// voucherController.createVoucher(); +// break; +// case LIST_VOUCHER: +// voucherController.getAllVoucher(); +// break; +// case CREATE_CUSTOMER: +// customerController.createCustomer(); +// break; +// case LIST_CUSTOMER: +// customerController.getAllCustomers(); +// break; +// } +// } +// } +//} diff --git a/src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java b/src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java index 6d66e00cc4..12d7ca807a 100644 --- a/src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java +++ b/src/main/java/com/prgrms/spring/common/advice/ControllerExceptionAdvice.java @@ -48,18 +48,6 @@ protected ApiResponse handleMissingRequestParameterException(final MissingServle return ApiResponse.error(Error.VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION, String.format("%s. (%s)", Error.VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION.getMessage(), e.getParameterName())); } - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(ConstraintViolationException.class) - protected ApiResponse handleRequestParameterNotValidException(final ConstraintViolationException e) { - return ApiResponse.error(Error.PAGE_REQUEST_VALIDATION_EXCEPTION, String.format("%s", e.getConstraintName())); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - protected ApiResponse handleHttpRequestMethodNotSupportedException(final HttpRequestMethodNotSupportedException e) { - return ApiResponse.error(Error.REQUEST_METHOD_VALIDATION_EXCEPTION, e.getMessage()); - } - /** * 500 Internal Server Error */ diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java index 09d7e108e5..8da0bcf45c 100644 --- a/src/main/java/com/prgrms/spring/controller/CustomerController.java +++ b/src/main/java/com/prgrms/spring/controller/CustomerController.java @@ -1,41 +1,41 @@ -package com.prgrms.spring.controller; - -import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; -import com.prgrms.spring.domain.customer.Customer; -import com.prgrms.spring.exception.Error; -import com.prgrms.spring.exception.Success; -import com.prgrms.spring.io.ConsoleView; -import com.prgrms.spring.service.customer.CustomerService; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; - -import javax.management.RuntimeErrorException; -import java.util.ArrayList; -import java.util.List; - -@Controller -@AllArgsConstructor -public class CustomerController { - - private final CustomerService customerService; - private final ConsoleView consoleView; - private static final Logger logger = LoggerFactory.getLogger(CustomerController.class); - - public void createCustomer() { - CustomerCreateRequestDto requestDto = consoleView.getCustomerCreateRequestDto(); - Customer customer = customerService.createCustomer(requestDto); - - if (customer == null) { - consoleView.showErrorMsg(Error.CREATE_CUSTOMER_EXCEPTION); - logger.error("고객 등록 실패 -> name : " + requestDto.getName() + ", email : " + requestDto.getEmail()); - throw new RuntimeException("고객 등록 실패"); - } - consoleView.showSuccessMsg(Success.CREATE_CUSTOMER_SUCCESS); - } - - public void getAllCustomers() { - consoleView.showAllCustomers(customerService.getAllCustomers()); - } -} +//package com.prgrms.spring.controller; +// +//import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; +//import com.prgrms.spring.domain.customer.Customer; +//import com.prgrms.spring.exception.Error; +//import com.prgrms.spring.exception.Success; +//import com.prgrms.spring.io.ConsoleView; +//import com.prgrms.spring.service.customer.CustomerService; +//import lombok.AllArgsConstructor; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Controller; +// +//import javax.management.RuntimeErrorException; +//import java.util.ArrayList; +//import java.util.List; +// +//@Controller +//@AllArgsConstructor +//public class CustomerController { +// +// private final CustomerService customerService; +// private final ConsoleView consoleView; +// private static final Logger logger = LoggerFactory.getLogger(CustomerController.class); +// +// public void createCustomer() { +// CustomerCreateRequestDto requestDto = consoleView.getCustomerCreateRequestDto(); +// Customer customer = customerService.createCustomer(requestDto); +// +// if (customer == null) { +// consoleView.showErrorMsg(Error.CREATE_CUSTOMER_EXCEPTION); +// logger.error("고객 등록 실패 -> name : " + requestDto.getName() + ", email : " + requestDto.getEmail()); +// throw new RuntimeException("고객 등록 실패"); +// } +// consoleView.showSuccessMsg(Success.CREATE_CUSTOMER_SUCCESS); +// } +// +// public void getAllCustomers() { +// consoleView.showAllCustomers(customerService.getAllCustomers()); +// } +//} diff --git a/src/main/java/com/prgrms/spring/controller/VoucherController.java b/src/main/java/com/prgrms/spring/controller/VoucherController.java index 4fd0a17a02..01a3a34815 100644 --- a/src/main/java/com/prgrms/spring/controller/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/VoucherController.java @@ -1,37 +1,37 @@ -package com.prgrms.spring.controller; - -import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; -import com.prgrms.spring.domain.voucher.Voucher; -import com.prgrms.spring.exception.Error; -import com.prgrms.spring.exception.Success; -import com.prgrms.spring.io.ConsoleView; -import com.prgrms.spring.service.voucher.VoucherService; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Controller; - - -@Controller -@AllArgsConstructor -public class VoucherController { - - private final VoucherService voucherService; - private final ConsoleView consoleView; - private static final Logger logger = LoggerFactory.getLogger(VoucherController.class); - - public void createVoucher() { - VoucherCreateRequestDto voucherCreateRequestDto = consoleView.getVoucherCreateRequestDto(); - Voucher voucher = voucherService.createVoucher(voucherCreateRequestDto); - if (voucher == null) { - consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); - logger.error("바우처 생성 실패 -> type: " + voucherCreateRequestDto.getVoucherType() + ", discount :" + voucherCreateRequestDto.getDiscount()); - throw new RuntimeException("바우처 생성 실패"); - } - consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); - } - - public void getAllVoucher() { - consoleView.showAllVouchers(voucherService.getAllVoucher()); - } -} +//package com.prgrms.spring.controller; +// +//import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; +//import com.prgrms.spring.domain.voucher.Voucher; +//import com.prgrms.spring.exception.Error; +//import com.prgrms.spring.exception.Success; +//import com.prgrms.spring.io.ConsoleView; +//import com.prgrms.spring.service.voucher.VoucherService; +//import lombok.AllArgsConstructor; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Controller; +// +// +//@Controller +//@AllArgsConstructor +//public class VoucherController { +// +// private final VoucherService voucherService; +// private final ConsoleView consoleView; +// private static final Logger logger = LoggerFactory.getLogger(VoucherController.class); +// +// public void createVoucher() { +// VoucherCreateRequestDto voucherCreateRequestDto = consoleView.getVoucherCreateRequestDto(); +// Voucher voucher = voucherService.createVoucher(voucherCreateRequestDto); +// if (voucher == null) { +// consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); +// logger.error("바우처 생성 실패 -> type: " + voucherCreateRequestDto.getVoucherType() + ", discount :" + voucherCreateRequestDto.getDiscount()); +// throw new RuntimeException("바우처 생성 실패"); +// } +// consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); +// } +// +// public void getAllVoucher() { +// consoleView.showAllVouchers(voucherService.getAllVoucher()); +// } +//} diff --git a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java index da672fc77d..710b63e28f 100644 --- a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java +++ b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java @@ -36,7 +36,7 @@ public ApiResponse> getSearchedVoucher(@RequestParam St } // 3. 바우처 추가기능 - @PostMapping("/") + @PostMapping("") @ResponseStatus(HttpStatus.CREATED) public ApiResponse createVoucher(@RequestBody VoucherCreateRequestDto requestDto) { return ApiResponse.success(Success.CREATE_VOUCHER_SUCCESS, voucherService.createVoucher(requestDto)); diff --git a/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java b/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java index 8dad3a25b0..8b284f9159 100644 --- a/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java +++ b/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java @@ -10,10 +10,10 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class VoucherCreateRequestDto { - private VoucherType voucherType; + private String voucherType; private Long discount; - public static VoucherCreateRequestDto of(VoucherType voucherType, Long discount) { + public static VoucherCreateRequestDto of(String voucherType, Long discount) { return new VoucherCreateRequestDto(voucherType,discount); } } diff --git a/src/main/java/com/prgrms/spring/exception/Error.java b/src/main/java/com/prgrms/spring/exception/Error.java index b432a1582f..c563890dac 100644 --- a/src/main/java/com/prgrms/spring/exception/Error.java +++ b/src/main/java/com/prgrms/spring/exception/Error.java @@ -15,7 +15,9 @@ public enum Error { NOT_FOUND_VOUCHER_EXCEPTION(HttpStatus.NOT_FOUND, "바우처 조회 실패"), VALIDATION_REQUEST_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청값이 입력되지 않았습니다."), VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 헤더값이 입력되지 않았습니다."), - VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 파라미터값이 입력되지 않았습니다.") + VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 파라미터값이 입력되지 않았습니다."), + + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "알 수 없는 서버 에러가 발생했습니다") ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/prgrms/spring/exception/model/CustomException.java b/src/main/java/com/prgrms/spring/exception/model/CustomException.java index 5fcc927522..cb6e813375 100644 --- a/src/main/java/com/prgrms/spring/exception/model/CustomException.java +++ b/src/main/java/com/prgrms/spring/exception/model/CustomException.java @@ -12,5 +12,9 @@ public CustomException(Error error, String message) { super(message); this.error = error; } + + public int getHttpStatus() { + return error.getHttpStatusCode(); + } } diff --git a/src/main/java/com/prgrms/spring/io/ConsoleView.java b/src/main/java/com/prgrms/spring/io/ConsoleView.java index 8f0415f885..3af0b0d436 100644 --- a/src/main/java/com/prgrms/spring/io/ConsoleView.java +++ b/src/main/java/com/prgrms/spring/io/ConsoleView.java @@ -1,98 +1,98 @@ -package com.prgrms.spring.io; - -import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; -import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; -import com.prgrms.spring.domain.customer.Customer; -import com.prgrms.spring.domain.menu.MenuType; -import com.prgrms.spring.domain.voucher.Voucher; -import com.prgrms.spring.domain.voucher.VoucherType; -import com.prgrms.spring.exception.Error; -import com.prgrms.spring.exception.Success; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -@Component -@AllArgsConstructor -public class ConsoleView implements Input, Output { - private final Scanner scanner = new Scanner(System.in); - - @Override - public String getMenu() { - return scanner.nextLine(); - } - - @Override - public int getVoucherType() { - return Integer.parseInt(scanner.nextLine()); - } - - @Override - public Long getVoucherDiscount() { - return Long.parseLong(scanner.nextLine()); - } - - @Override - public void showMenu() { - System.out.println("=== Voucher Program ==="); - for (MenuType mt : MenuType.values()) { - System.out.println(String.format("Type **%s** to %s.", mt.getName(), mt.getExplain())); - } - } - - @Override - public void showVoucherTypes() { - System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); - for (VoucherType vt : VoucherType.values()) { - System.out.println(String.format("%s. %s", vt.getId(), vt.getName())); - } - } - - @Override - public void showVoucherPrompt(VoucherType voucherType) { - System.out.println(voucherType.getPromptMessage()); - } - - @Override - public void showAllVouchers(List vouchers) { - List outputList = new ArrayList<>(); - vouchers.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); - outputList.forEach(System.out::println); - } - - @Override - public void showErrorMsg(Error error) { - System.out.println(error.getMessage()); - } - - @Override - public void showSuccessMsg(Success success) { - System.out.println(success.getMessage()); - } - - @Override - public void showAllCustomers(List customers) { - List outputList = new ArrayList<>(); - customers.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); - outputList.forEach(System.out::println); - } - - public CustomerCreateRequestDto getCustomerCreateRequestDto() { - System.out.print("이름을 입력해주세요 : "); - String name = scanner.nextLine(); - System.out.print("이메일을 입력해주세요 : "); - String email = scanner.nextLine(); - return CustomerCreateRequestDto.of(name, email); - } - - public VoucherCreateRequestDto getVoucherCreateRequestDto() { - showVoucherTypes(); - VoucherType type = VoucherType.matchType(getVoucherType()); - showVoucherPrompt(type); - Long discount = getVoucherDiscount(); - return VoucherCreateRequestDto.of(type, discount); - } -} +//package com.prgrms.spring.io; +// +//import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; +//import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; +//import com.prgrms.spring.domain.customer.Customer; +//import com.prgrms.spring.domain.menu.MenuType; +//import com.prgrms.spring.domain.voucher.Voucher; +//import com.prgrms.spring.domain.voucher.VoucherType; +//import com.prgrms.spring.exception.Error; +//import com.prgrms.spring.exception.Success; +//import lombok.AllArgsConstructor; +//import org.springframework.stereotype.Component; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Scanner; +// +//@Component +//@AllArgsConstructor +//public class ConsoleView implements Input, Output { +// private final Scanner scanner = new Scanner(System.in); +// +// @Override +// public String getMenu() { +// return scanner.nextLine(); +// } +// +// @Override +// public int getVoucherType() { +// return Integer.parseInt(scanner.nextLine()); +// } +// +// @Override +// public Long getVoucherDiscount() { +// return Long.parseLong(scanner.nextLine()); +// } +// +// @Override +// public void showMenu() { +// System.out.println("=== Voucher Program ==="); +// for (MenuType mt : MenuType.values()) { +// System.out.println(String.format("Type **%s** to %s.", mt.getName(), mt.getExplain())); +// } +// } +// +// @Override +// public void showVoucherTypes() { +// System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); +// for (VoucherType vt : VoucherType.values()) { +// System.out.println(String.format("%s. %s", vt.getId(), vt.getName())); +// } +// } +// +// @Override +// public void showVoucherPrompt(VoucherType voucherType) { +// System.out.println(voucherType.getPromptMessage()); +// } +// +// @Override +// public void showAllVouchers(List vouchers) { +// List outputList = new ArrayList<>(); +// vouchers.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); +// outputList.forEach(System.out::println); +// } +// +// @Override +// public void showErrorMsg(Error error) { +// System.out.println(error.getMessage()); +// } +// +// @Override +// public void showSuccessMsg(Success success) { +// System.out.println(success.getMessage()); +// } +// +// @Override +// public void showAllCustomers(List customers) { +// List outputList = new ArrayList<>(); +// customers.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); +// outputList.forEach(System.out::println); +// } +// +// public CustomerCreateRequestDto getCustomerCreateRequestDto() { +// System.out.print("이름을 입력해주세요 : "); +// String name = scanner.nextLine(); +// System.out.print("이메일을 입력해주세요 : "); +// String email = scanner.nextLine(); +// return CustomerCreateRequestDto.of(name, email); +// } +// +// public VoucherCreateRequestDto getVoucherCreateRequestDto() { +// showVoucherTypes(); +// VoucherType type = VoucherType.matchType(getVoucherType()); +// showVoucherPrompt(type); +// Long discount = getVoucherDiscount(); +// return VoucherCreateRequestDto.of(type, discount); +// } +//} diff --git a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java index f27b3959ac..2fe91164c4 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/JdbcVoucherRepository.java @@ -3,6 +3,7 @@ import com.prgrms.spring.domain.voucher.FixedAmountVoucher; import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; import com.prgrms.spring.domain.voucher.Voucher; +import com.prgrms.spring.domain.voucher.VoucherType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import org.slf4j.Logger; @@ -78,17 +79,15 @@ public List findAll() { @Override public List findByDiscountUnit(String discountUnit) { - return jdbcTemplate.query("SELECT * FROM voucher WHERE discount_unit = :discountUnit", + return jdbcTemplate.query("SELECT * FROM voucher WHERE discount_unit = :discountUnit", Collections.singletonMap("discountUnit", discountUnit), voucherRowMapper); } @Override - public List deleteVoucher(String voucherIdString) { - UUID voucherId = UUID.fromString(voucherIdString); - return jdbcTemplate.query("DELETE FROM voucher WHERE voucher_id = UUID_TO_BIN(:voucherId)", - Collections.singletonMap("voucherId", voucherId), - voucherRowMapper); + public void deleteVoucher(Voucher voucher) { + jdbcTemplate.update("DELETE FROM voucher WHERE voucher_id = UUID_TO_BIN(:voucherId)", + toParamMap(voucher)); } static UUID toUUID(byte[] bytes) { diff --git a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java index dae63441ef..0d70c8771c 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/MemoryVoucherRepository.java @@ -1,32 +1,32 @@ -package com.prgrms.spring.repository.voucher; - -import com.prgrms.spring.domain.voucher.Voucher; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -@Repository -@Profile("local") -public class MemoryVoucherRepository implements VoucherRepository { - - private final Map storage = new ConcurrentHashMap<>(); - - @Override - public Optional findById(UUID voucherId) { - return Optional.ofNullable(storage.get(voucherId)); - } - - @Override - public Voucher insert(Voucher voucher) { - storage.put(voucher.getVoucherId(), voucher); - return voucher; - } - - @Override - public List findAll() { -// return new ConcurrentHashMap<>(storage); - return null; - } -} +//package com.prgrms.spring.repository.voucher; +// +//import com.prgrms.spring.domain.voucher.Voucher; +//import org.springframework.context.annotation.Profile; +//import org.springframework.stereotype.Repository; +// +//import java.util.*; +//import java.util.concurrent.ConcurrentHashMap; +// +//@Repository +//@Profile("local") +//public class MemoryVoucherRepository implements VoucherRepository { +// +// private final Map storage = new ConcurrentHashMap<>(); +// +// @Override +// public Optional findById(UUID voucherId) { +// return Optional.ofNullable(storage.get(voucherId)); +// } +// +// @Override +// public Voucher insert(Voucher voucher) { +// storage.put(voucher.getVoucherId(), voucher); +// return voucher; +// } +// +// @Override +// public List findAll() { +//// return new ConcurrentHashMap<>(storage); +// return null; +// } +//} diff --git a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java index 074397d6f6..ffefd88a27 100644 --- a/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java +++ b/src/main/java/com/prgrms/spring/repository/voucher/VoucherRepository.java @@ -16,5 +16,5 @@ public interface VoucherRepository { List findByDiscountUnit(String discountUnit); - List deleteVoucher(String voucherIdString); + void deleteVoucher(Voucher voucher); } diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java index 2d34e97ba9..fd1df0b986 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java @@ -25,9 +25,9 @@ public class VoucherService { @Transactional public VoucherResponseDto createVoucher(VoucherCreateRequestDto requestDto) { Voucher voucher = null; - if (requestDto.getVoucherType() == VoucherType.FIXED_AMOUNT) { + if (VoucherType.valueOf(requestDto.getVoucherType()) == VoucherType.FIXED_AMOUNT) { voucher = FixedAmountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); - } else if (requestDto.getVoucherType() == VoucherType.PERCENT_DISCOUNT) { + } else if (VoucherType.valueOf(requestDto.getVoucherType()) == VoucherType.PERCENT_DISCOUNT) { voucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); } voucherRepository.insert(voucher); @@ -63,7 +63,9 @@ public List getSearchedVoucher(VoucherType voucherType) { @Transactional public void deleteVoucher(String voucherId) { - List deletedVouchers = voucherRepository.deleteVoucher(voucherId); + Voucher voucher = voucherRepository.findById(UUID.fromString(voucherId)) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_VOUCHER_EXCEPTION, Error.NOT_FOUND_VOUCHER_EXCEPTION.getMessage())); + voucherRepository.deleteVoucher(voucher); } @Transactional(readOnly = true) diff --git a/src/main/resources/logFiles/log.2023-07-20.log b/src/main/resources/logFiles/log.2023-07-20.log new file mode 100644 index 0000000000..e69de29bb2 From 52f9066687904f53a84e971ddd94d3176ae6b93f Mon Sep 17 00:00:00 2001 From: Sunny Date: Sun, 23 Jul 2023 16:11:14 +0900 Subject: [PATCH 38/40] =?UTF-8?q?[Feat]=20view=20=EA=B4=80=EB=A0=A8=20api,?= =?UTF-8?q?=20view=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 + .../spring/controller/CustomerController.java | 2 +- .../spring/controller/VoucherController.java | 90 +++++++++++-------- .../controller/VoucherControllerOld.java | 37 ++++++++ .../controller/api/VoucherRestController.java | 3 +- .../dto/request/VoucherCreateRequestDto.java | 11 +-- .../{customer => }/CustomerService.java | 2 +- .../service/{voucher => }/VoucherService.java | 2 +- .../spring/service/VoucherServiceForView.java | 54 +++++++++++ .../resources/logFiles/log.2023-07-23.log | 0 src/main/resources/templates/new-voucher.html | 30 +++++++ .../resources/templates/voucher-detail.html | 37 ++++++++ .../resources/templates/voucher-list.html | 41 +++++++++ 13 files changed, 262 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java rename src/main/java/com/prgrms/spring/service/{customer => }/CustomerService.java (97%) rename src/main/java/com/prgrms/spring/service/{voucher => }/VoucherService.java (98%) create mode 100644 src/main/java/com/prgrms/spring/service/VoucherServiceForView.java create mode 100644 src/main/resources/logFiles/log.2023-07-23.log create mode 100644 src/main/resources/templates/new-voucher.html create mode 100644 src/main/resources/templates/voucher-detail.html create mode 100644 src/main/resources/templates/voucher-list.html diff --git a/pom.xml b/pom.xml index 89a763978c..cdb83069ed 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-thymeleaf + diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java index 8da0bcf45c..5dff28e58c 100644 --- a/src/main/java/com/prgrms/spring/controller/CustomerController.java +++ b/src/main/java/com/prgrms/spring/controller/CustomerController.java @@ -5,7 +5,7 @@ //import com.prgrms.spring.exception.Error; //import com.prgrms.spring.exception.Success; //import com.prgrms.spring.io.ConsoleView; -//import com.prgrms.spring.service.customer.CustomerService; +//import com.prgrms.spring.service.CustomerService; //import lombok.AllArgsConstructor; //import org.slf4j.Logger; //import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/prgrms/spring/controller/VoucherController.java b/src/main/java/com/prgrms/spring/controller/VoucherController.java index 01a3a34815..aefe6c0b8c 100644 --- a/src/main/java/com/prgrms/spring/controller/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/VoucherController.java @@ -1,37 +1,53 @@ -//package com.prgrms.spring.controller; -// -//import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; -//import com.prgrms.spring.domain.voucher.Voucher; -//import com.prgrms.spring.exception.Error; -//import com.prgrms.spring.exception.Success; -//import com.prgrms.spring.io.ConsoleView; -//import com.prgrms.spring.service.voucher.VoucherService; -//import lombok.AllArgsConstructor; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.stereotype.Controller; -// -// -//@Controller -//@AllArgsConstructor -//public class VoucherController { -// -// private final VoucherService voucherService; -// private final ConsoleView consoleView; -// private static final Logger logger = LoggerFactory.getLogger(VoucherController.class); -// -// public void createVoucher() { -// VoucherCreateRequestDto voucherCreateRequestDto = consoleView.getVoucherCreateRequestDto(); -// Voucher voucher = voucherService.createVoucher(voucherCreateRequestDto); -// if (voucher == null) { -// consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); -// logger.error("바우처 생성 실패 -> type: " + voucherCreateRequestDto.getVoucherType() + ", discount :" + voucherCreateRequestDto.getDiscount()); -// throw new RuntimeException("바우처 생성 실패"); -// } -// consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); -// } -// -// public void getAllVoucher() { -// consoleView.showAllVouchers(voucherService.getAllVoucher()); -// } -//} +package com.prgrms.spring.controller; + +import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; +import com.prgrms.spring.domain.voucher.Voucher; +import com.prgrms.spring.service.VoucherService; +import com.prgrms.spring.service.VoucherServiceForView; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +@RequestMapping("/voucher") +public class VoucherController { + + private final VoucherServiceForView voucherServiceForView; + + @GetMapping("") + public String voucherPage(Model model) { + List vouchers = voucherServiceForView.getAllVoucher(); + model.addAttribute("vouchers", vouchers); + return "voucher-list"; + } + + @GetMapping("/new") + public String newVoucherPage() { + return "new-voucher"; + } + + @PostMapping("") + public String newVoucher(VoucherCreateRequestDto requestDto) { + System.out.println(requestDto.getVoucherType()); + System.out.println(requestDto.getDiscount()); + voucherServiceForView.createVoucher(requestDto); + return "redirect:/voucher"; + } + + @GetMapping("/{voucherId}") + public String voucherDetailPage(Model model, @PathVariable String voucherId) { + Voucher voucher = voucherServiceForView.getVoucherById(voucherId); + model.addAttribute("voucher", voucher); + return "voucher-detail"; + } + + @PostMapping("/{voucherId}") + public String deleteVoucher(@PathVariable String voucherId) { + voucherServiceForView.deleteVoucher(voucherId); + return "redirect:/voucher"; + } +} diff --git a/src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java b/src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java new file mode 100644 index 0000000000..41bef7cf78 --- /dev/null +++ b/src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java @@ -0,0 +1,37 @@ +//package com.prgrms.spring.controller; +// +//import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; +//import com.prgrms.spring.domain.voucher.Voucher; +//import com.prgrms.spring.exception.Error; +//import com.prgrms.spring.exception.Success; +//import com.prgrms.spring.io.ConsoleView; +//import com.prgrms.spring.service.VoucherService; +//import lombok.AllArgsConstructor; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Controller; +// +// +//@Controller +//@AllArgsConstructor +//public class VoucherController { +// +// private final VoucherService voucherService; +// private final ConsoleView consoleView; +// private static final Logger logger = LoggerFactory.getLogger(VoucherController.class); +// +// public void createVoucher() { +// VoucherCreateRequestDto voucherCreateRequestDto = consoleView.getVoucherCreateRequestDto(); +// Voucher voucher = voucherService.createVoucher(voucherCreateRequestDto); +// if (voucher == null) { +// consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); +// logger.error("바우처 생성 실패 -> type: " + voucherCreateRequestDto.getVoucherType() + ", discount :" + voucherCreateRequestDto.getDiscount()); +// throw new RuntimeException("바우처 생성 실패"); +// } +// consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); +// } +// +// public void getAllVoucher() { +// consoleView.showAllVouchers(voucherService.getAllVoucher()); +// } +//} diff --git a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java index 710b63e28f..4c03a8a7f7 100644 --- a/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java +++ b/src/main/java/com/prgrms/spring/controller/api/VoucherRestController.java @@ -1,12 +1,11 @@ package com.prgrms.spring.controller.api; -import com.google.protobuf.Api; import com.prgrms.spring.common.dto.ApiResponse; import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; import com.prgrms.spring.controller.dto.response.VoucherResponseDto; import com.prgrms.spring.domain.voucher.VoucherType; import com.prgrms.spring.exception.Success; -import com.prgrms.spring.service.voucher.VoucherService; +import com.prgrms.spring.service.VoucherService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java b/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java index 8b284f9159..8165d7ac5b 100644 --- a/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java +++ b/src/main/java/com/prgrms/spring/controller/dto/request/VoucherCreateRequestDto.java @@ -1,19 +1,12 @@ package com.prgrms.spring.controller.dto.request; -import com.prgrms.spring.domain.voucher.VoucherType; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) +@Setter public class VoucherCreateRequestDto { private String voucherType; private Long discount; - - public static VoucherCreateRequestDto of(String voucherType, Long discount) { - return new VoucherCreateRequestDto(voucherType,discount); - } } diff --git a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java b/src/main/java/com/prgrms/spring/service/CustomerService.java similarity index 97% rename from src/main/java/com/prgrms/spring/service/customer/CustomerService.java rename to src/main/java/com/prgrms/spring/service/CustomerService.java index c209ddd89a..311e05d0d5 100644 --- a/src/main/java/com/prgrms/spring/service/customer/CustomerService.java +++ b/src/main/java/com/prgrms/spring/service/CustomerService.java @@ -1,4 +1,4 @@ -package com.prgrms.spring.service.customer; +package com.prgrms.spring.service; import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; import com.prgrms.spring.domain.customer.Customer; diff --git a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java b/src/main/java/com/prgrms/spring/service/VoucherService.java similarity index 98% rename from src/main/java/com/prgrms/spring/service/voucher/VoucherService.java rename to src/main/java/com/prgrms/spring/service/VoucherService.java index fd1df0b986..72f86caa20 100644 --- a/src/main/java/com/prgrms/spring/service/voucher/VoucherService.java +++ b/src/main/java/com/prgrms/spring/service/VoucherService.java @@ -1,4 +1,4 @@ -package com.prgrms.spring.service.voucher; +package com.prgrms.spring.service; import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; import com.prgrms.spring.controller.dto.response.VoucherResponseDto; diff --git a/src/main/java/com/prgrms/spring/service/VoucherServiceForView.java b/src/main/java/com/prgrms/spring/service/VoucherServiceForView.java new file mode 100644 index 0000000000..76144abde9 --- /dev/null +++ b/src/main/java/com/prgrms/spring/service/VoucherServiceForView.java @@ -0,0 +1,54 @@ +package com.prgrms.spring.service; + + +import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; +import com.prgrms.spring.controller.dto.response.VoucherResponseDto; +import com.prgrms.spring.domain.voucher.FixedAmountVoucher; +import com.prgrms.spring.domain.voucher.PercentDiscountVoucher; +import com.prgrms.spring.domain.voucher.Voucher; +import com.prgrms.spring.domain.voucher.VoucherType; +import com.prgrms.spring.exception.Error; +import com.prgrms.spring.exception.model.NotFoundException; +import com.prgrms.spring.repository.voucher.VoucherRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.UUID; + +@Service +@AllArgsConstructor +public class VoucherServiceForView { + + private final VoucherRepository voucherRepository; + + @Transactional(readOnly = true) + public List getAllVoucher() { + return voucherRepository.findAll(); + } + + @Transactional + public void createVoucher(VoucherCreateRequestDto requestDto) { + Voucher voucher = null; + if (VoucherType.valueOf(requestDto.getVoucherType()) == VoucherType.FIXED_AMOUNT) { + voucher = FixedAmountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); + } else if (VoucherType.valueOf(requestDto.getVoucherType()) == VoucherType.PERCENT_DISCOUNT) { + voucher = PercentDiscountVoucher.newInstance(UUID.randomUUID(), requestDto.getDiscount()); + } + voucherRepository.insert(voucher); + } + + @Transactional + public void deleteVoucher(String voucherId) { + Voucher voucher = voucherRepository.findById(UUID.fromString(voucherId)) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_VOUCHER_EXCEPTION, Error.NOT_FOUND_VOUCHER_EXCEPTION.getMessage())); + voucherRepository.deleteVoucher(voucher); + } + + @Transactional(readOnly = true) + public Voucher getVoucherById(String voucherId) { + return voucherRepository.findById(UUID.fromString(voucherId)) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_VOUCHER_EXCEPTION, Error.NOT_FOUND_VOUCHER_EXCEPTION.getMessage())); + } +} diff --git a/src/main/resources/logFiles/log.2023-07-23.log b/src/main/resources/logFiles/log.2023-07-23.log new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/resources/templates/new-voucher.html b/src/main/resources/templates/new-voucher.html new file mode 100644 index 0000000000..c03899922a --- /dev/null +++ b/src/main/resources/templates/new-voucher.html @@ -0,0 +1,30 @@ + + + + + + + + New Voucher + + +

Add New Voucher

+

Voucher Management

+
+
+ +
+
+ + +
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/voucher-detail.html b/src/main/resources/templates/voucher-detail.html new file mode 100644 index 0000000000..312ad8e014 --- /dev/null +++ b/src/main/resources/templates/voucher-detail.html @@ -0,0 +1,37 @@ + + + + + + + + Voucher Detail + + +

Voucher Detail Page

+Show All Voucher + + + + + + + + + + + + + + + + + +
VoucherIdVoucherTypeDiscountDiscountUnit
+
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/voucher-list.html b/src/main/resources/templates/voucher-list.html new file mode 100644 index 0000000000..80dadd1944 --- /dev/null +++ b/src/main/resources/templates/voucher-list.html @@ -0,0 +1,41 @@ + + + + + + + + + + + Voucher List + + +

Voucher List

+

Voucher Management

+ + + + + + + + + + + + + + + + + + +
IdVoucher TypeDiscountDiscount Unit
+ +
+ + From 2e83dc5a6c8498eb433fe19ecfb8ce345d427051 Mon Sep 17 00:00:00 2001 From: Sunny Date: Sun, 23 Jul 2023 23:30:27 +0900 Subject: [PATCH 39/40] =?UTF-8?q?[Refactor]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .../java/com/prgrms/spring/AppRunner.java | 57 ----------- .../spring/controller/CustomerController.java | 41 -------- .../controller/VoucherControllerOld.java | 37 ------- .../com/prgrms/spring/io/ConsoleView.java | 98 ------------------- src/main/java/com/prgrms/spring/io/Input.java | 7 -- .../java/com/prgrms/spring/io/Output.java | 19 ---- .../spring/service/CustomerService.java | 44 --------- 8 files changed, 1 insertion(+), 304 deletions(-) delete mode 100644 src/main/java/com/prgrms/spring/AppRunner.java delete mode 100644 src/main/java/com/prgrms/spring/controller/CustomerController.java delete mode 100644 src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java delete mode 100644 src/main/java/com/prgrms/spring/io/ConsoleView.java delete mode 100644 src/main/java/com/prgrms/spring/io/Input.java delete mode 100644 src/main/java/com/prgrms/spring/io/Output.java delete mode 100644 src/main/java/com/prgrms/spring/service/CustomerService.java diff --git a/.gitignore b/.gitignore index ecee04789b..afcc560366 100644 --- a/.gitignore +++ b/.gitignore @@ -65,4 +65,4 @@ buildNumber.properties # JDT-specific (Eclipse Java Development Tools) .classpath -# End of https://www.toptal.com/developers/gitignore/api/maven \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/maven diff --git a/src/main/java/com/prgrms/spring/AppRunner.java b/src/main/java/com/prgrms/spring/AppRunner.java deleted file mode 100644 index efddd29589..0000000000 --- a/src/main/java/com/prgrms/spring/AppRunner.java +++ /dev/null @@ -1,57 +0,0 @@ -//package com.prgrms.spring; -// -//import com.prgrms.spring.controller.CustomerController; -//import com.prgrms.spring.controller.VoucherController; -//import com.prgrms.spring.domain.menu.MenuType; -//import com.prgrms.spring.exception.Error; -//import com.prgrms.spring.io.ConsoleView; -//import lombok.AllArgsConstructor; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.boot.CommandLineRunner; -//import org.springframework.stereotype.Component; -// -// -//@AllArgsConstructor -//@Component -//public class AppRunner implements CommandLineRunner { -// private final VoucherController voucherController; -// private final CustomerController customerController; -// -// private final ConsoleView consoleView; -// -// private static final Logger logger = LoggerFactory.getLogger(AppRunner.class); -// -// @Override -// public void run(String... args) throws Exception { -// boolean isExecute = true; -// while (isExecute) { -// consoleView.showMenu(); -// MenuType menuType = null; -// try { -// menuType = MenuType.matchType(consoleView.getMenu()); -// } catch (IllegalStateException e) { -// logger.error("input error!"); -// consoleView.showErrorMsg(Error.VALIDATION_WRONG_TYPE); -// continue; -// } -// switch (menuType) { -// case EXIT: -// isExecute = false; -// break; -// case CREATE_VOUCHER: -// voucherController.createVoucher(); -// break; -// case LIST_VOUCHER: -// voucherController.getAllVoucher(); -// break; -// case CREATE_CUSTOMER: -// customerController.createCustomer(); -// break; -// case LIST_CUSTOMER: -// customerController.getAllCustomers(); -// break; -// } -// } -// } -//} diff --git a/src/main/java/com/prgrms/spring/controller/CustomerController.java b/src/main/java/com/prgrms/spring/controller/CustomerController.java deleted file mode 100644 index 5dff28e58c..0000000000 --- a/src/main/java/com/prgrms/spring/controller/CustomerController.java +++ /dev/null @@ -1,41 +0,0 @@ -//package com.prgrms.spring.controller; -// -//import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; -//import com.prgrms.spring.domain.customer.Customer; -//import com.prgrms.spring.exception.Error; -//import com.prgrms.spring.exception.Success; -//import com.prgrms.spring.io.ConsoleView; -//import com.prgrms.spring.service.CustomerService; -//import lombok.AllArgsConstructor; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.stereotype.Controller; -// -//import javax.management.RuntimeErrorException; -//import java.util.ArrayList; -//import java.util.List; -// -//@Controller -//@AllArgsConstructor -//public class CustomerController { -// -// private final CustomerService customerService; -// private final ConsoleView consoleView; -// private static final Logger logger = LoggerFactory.getLogger(CustomerController.class); -// -// public void createCustomer() { -// CustomerCreateRequestDto requestDto = consoleView.getCustomerCreateRequestDto(); -// Customer customer = customerService.createCustomer(requestDto); -// -// if (customer == null) { -// consoleView.showErrorMsg(Error.CREATE_CUSTOMER_EXCEPTION); -// logger.error("고객 등록 실패 -> name : " + requestDto.getName() + ", email : " + requestDto.getEmail()); -// throw new RuntimeException("고객 등록 실패"); -// } -// consoleView.showSuccessMsg(Success.CREATE_CUSTOMER_SUCCESS); -// } -// -// public void getAllCustomers() { -// consoleView.showAllCustomers(customerService.getAllCustomers()); -// } -//} diff --git a/src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java b/src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java deleted file mode 100644 index 41bef7cf78..0000000000 --- a/src/main/java/com/prgrms/spring/controller/VoucherControllerOld.java +++ /dev/null @@ -1,37 +0,0 @@ -//package com.prgrms.spring.controller; -// -//import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; -//import com.prgrms.spring.domain.voucher.Voucher; -//import com.prgrms.spring.exception.Error; -//import com.prgrms.spring.exception.Success; -//import com.prgrms.spring.io.ConsoleView; -//import com.prgrms.spring.service.VoucherService; -//import lombok.AllArgsConstructor; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.stereotype.Controller; -// -// -//@Controller -//@AllArgsConstructor -//public class VoucherController { -// -// private final VoucherService voucherService; -// private final ConsoleView consoleView; -// private static final Logger logger = LoggerFactory.getLogger(VoucherController.class); -// -// public void createVoucher() { -// VoucherCreateRequestDto voucherCreateRequestDto = consoleView.getVoucherCreateRequestDto(); -// Voucher voucher = voucherService.createVoucher(voucherCreateRequestDto); -// if (voucher == null) { -// consoleView.showErrorMsg(Error.CREATE_VOUCHER_EXCEPTION); -// logger.error("바우처 생성 실패 -> type: " + voucherCreateRequestDto.getVoucherType() + ", discount :" + voucherCreateRequestDto.getDiscount()); -// throw new RuntimeException("바우처 생성 실패"); -// } -// consoleView.showSuccessMsg(Success.CREATE_VOUCHER_SUCCESS); -// } -// -// public void getAllVoucher() { -// consoleView.showAllVouchers(voucherService.getAllVoucher()); -// } -//} diff --git a/src/main/java/com/prgrms/spring/io/ConsoleView.java b/src/main/java/com/prgrms/spring/io/ConsoleView.java deleted file mode 100644 index 3af0b0d436..0000000000 --- a/src/main/java/com/prgrms/spring/io/ConsoleView.java +++ /dev/null @@ -1,98 +0,0 @@ -//package com.prgrms.spring.io; -// -//import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; -//import com.prgrms.spring.controller.dto.request.VoucherCreateRequestDto; -//import com.prgrms.spring.domain.customer.Customer; -//import com.prgrms.spring.domain.menu.MenuType; -//import com.prgrms.spring.domain.voucher.Voucher; -//import com.prgrms.spring.domain.voucher.VoucherType; -//import com.prgrms.spring.exception.Error; -//import com.prgrms.spring.exception.Success; -//import lombok.AllArgsConstructor; -//import org.springframework.stereotype.Component; -// -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Scanner; -// -//@Component -//@AllArgsConstructor -//public class ConsoleView implements Input, Output { -// private final Scanner scanner = new Scanner(System.in); -// -// @Override -// public String getMenu() { -// return scanner.nextLine(); -// } -// -// @Override -// public int getVoucherType() { -// return Integer.parseInt(scanner.nextLine()); -// } -// -// @Override -// public Long getVoucherDiscount() { -// return Long.parseLong(scanner.nextLine()); -// } -// -// @Override -// public void showMenu() { -// System.out.println("=== Voucher Program ==="); -// for (MenuType mt : MenuType.values()) { -// System.out.println(String.format("Type **%s** to %s.", mt.getName(), mt.getExplain())); -// } -// } -// -// @Override -// public void showVoucherTypes() { -// System.out.println("생성하고 싶은 바우처 타입을 숫자로 선택해주세요."); -// for (VoucherType vt : VoucherType.values()) { -// System.out.println(String.format("%s. %s", vt.getId(), vt.getName())); -// } -// } -// -// @Override -// public void showVoucherPrompt(VoucherType voucherType) { -// System.out.println(voucherType.getPromptMessage()); -// } -// -// @Override -// public void showAllVouchers(List vouchers) { -// List outputList = new ArrayList<>(); -// vouchers.forEach(voucher -> outputList.add(String.format("%s : %d %s", voucher.getVoucherName(), voucher.getDiscount(), voucher.getDiscountUnit()))); -// outputList.forEach(System.out::println); -// } -// -// @Override -// public void showErrorMsg(Error error) { -// System.out.println(error.getMessage()); -// } -// -// @Override -// public void showSuccessMsg(Success success) { -// System.out.println(success.getMessage()); -// } -// -// @Override -// public void showAllCustomers(List customers) { -// List outputList = new ArrayList<>(); -// customers.forEach(customer -> outputList.add(String.format("Name : %s \nEmail : %s\n", customer.getName(), customer.getEmail()))); -// outputList.forEach(System.out::println); -// } -// -// public CustomerCreateRequestDto getCustomerCreateRequestDto() { -// System.out.print("이름을 입력해주세요 : "); -// String name = scanner.nextLine(); -// System.out.print("이메일을 입력해주세요 : "); -// String email = scanner.nextLine(); -// return CustomerCreateRequestDto.of(name, email); -// } -// -// public VoucherCreateRequestDto getVoucherCreateRequestDto() { -// showVoucherTypes(); -// VoucherType type = VoucherType.matchType(getVoucherType()); -// showVoucherPrompt(type); -// Long discount = getVoucherDiscount(); -// return VoucherCreateRequestDto.of(type, discount); -// } -//} diff --git a/src/main/java/com/prgrms/spring/io/Input.java b/src/main/java/com/prgrms/spring/io/Input.java deleted file mode 100644 index 88f12164b4..0000000000 --- a/src/main/java/com/prgrms/spring/io/Input.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.prgrms.spring.io; - -public interface Input { - String getMenu(); - int getVoucherType(); - Long getVoucherDiscount(); -} diff --git a/src/main/java/com/prgrms/spring/io/Output.java b/src/main/java/com/prgrms/spring/io/Output.java deleted file mode 100644 index 04eeab109b..0000000000 --- a/src/main/java/com/prgrms/spring/io/Output.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.prgrms.spring.io; - -import com.prgrms.spring.domain.customer.Customer; -import com.prgrms.spring.domain.voucher.Voucher; -import com.prgrms.spring.domain.voucher.VoucherType; -import com.prgrms.spring.exception.Error; -import com.prgrms.spring.exception.Success; - -import java.util.List; - -public interface Output { - void showMenu(); - void showVoucherTypes(); - void showVoucherPrompt(VoucherType voucherType); - void showAllVouchers(List vouchers); - void showErrorMsg(Error error); - void showSuccessMsg(Success success); - void showAllCustomers(List customers); -} diff --git a/src/main/java/com/prgrms/spring/service/CustomerService.java b/src/main/java/com/prgrms/spring/service/CustomerService.java deleted file mode 100644 index 311e05d0d5..0000000000 --- a/src/main/java/com/prgrms/spring/service/CustomerService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.prgrms.spring.service; - -import com.prgrms.spring.controller.dto.request.CustomerCreateRequestDto; -import com.prgrms.spring.domain.customer.Customer; -import com.prgrms.spring.exception.Error; -import com.prgrms.spring.exception.model.NotFoundException; -import com.prgrms.spring.repository.customer.CustomerRepository; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Service -@AllArgsConstructor -public class CustomerService { - - private final CustomerRepository customerRepository; - - @Transactional - public Customer createCustomer(CustomerCreateRequestDto customerCreateRequestDto) { - Customer newCustomer = Customer.newInstance( - UUID.randomUUID(), - customerCreateRequestDto.getName(), - customerCreateRequestDto.getEmail(), - LocalDateTime.now()); - customerRepository.insert(newCustomer); - return newCustomer; - } - - @Transactional(readOnly = true) - public Customer getCustomerById(UUID customerId) { - return customerRepository.findById(customerId) - .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_CUSTOMER_EXCEPTION, Error.NOT_FOUND_CUSTOMER_EXCEPTION.getMessage())); - } - - @Transactional(readOnly = true) - public List getAllCustomers() { - return customerRepository.findAll(); - } -} From 5fcb8eb9c23005b37f82bd86026305c7a0248054 Mon Sep 17 00:00:00 2001 From: Sunny Date: Sun, 23 Jul 2023 23:41:32 +0900 Subject: [PATCH 40/40] =?UTF-8?q?[Refactor]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/prgrms/spring/controller/VoucherController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/prgrms/spring/controller/VoucherController.java b/src/main/java/com/prgrms/spring/controller/VoucherController.java index aefe6c0b8c..e49a025237 100644 --- a/src/main/java/com/prgrms/spring/controller/VoucherController.java +++ b/src/main/java/com/prgrms/spring/controller/VoucherController.java @@ -32,8 +32,6 @@ public String newVoucherPage() { @PostMapping("") public String newVoucher(VoucherCreateRequestDto requestDto) { - System.out.println(requestDto.getVoucherType()); - System.out.println(requestDto.getDiscount()); voucherServiceForView.createVoucher(requestDto); return "redirect:/voucher"; }