diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..00a51af
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,6 @@
+#
+# https://help.github.com/articles/dealing-with-line-endings/
+#
+# These are explicitly windows files and should use crlf
+*.bat           text eol=crlf
+
diff --git a/.gitignore b/.gitignore
index ae6b01b..48a228e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,9 @@
 bin
 lib
 out
+
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 521c4f0..14d6baf 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="FrameworkDetectionExcludesConfiguration">
+    <file type="web" url="file://$PROJECT_DIR$" />
+  </component>
   <component name="PWA">
     <option name="enabled" value="true" />
     <option name="wasEnabledAtLeastOnce" value="true" />
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index 2fbbd78..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/DesignPattern.iml" filepath="$PROJECT_DIR$/DesignPattern.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb
index e69de29..e22a0a2 100644
--- a/.idea/sonarlint/issuestore/index.pb
+++ b/.idea/sonarlint/issuestore/index.pb
@@ -0,0 +1,21 @@
+
+Q
+!src/iterator/IteratorPattern.java,0\7\07bc9a15323cca11c8dbd4238eb19579d9bd4948
+R
+"src/iterator/menu/vo/MenuItem.java,0\c\0c257d37ba31d5223bbeb467a3fbdbc9d49aecf5
+O
+src/iterator/iter/Iterator.java,7\2\72b16d9852d4016d27a738be7281357b6f533872
+W
+'src/iterator/menu/PancakeHouseMenu.java,9\8\982da34acb6ad1dc9ebac28a92134e41592befe2
+]
+-src/iterator/iter/impl/DinerMenuIterator.java,0\8\087a6277253a7e46f2287e41731d7b518bb2d2df
+`
+0src/iterator/iter/impl/PancakeHouseIterator.java,7\7\77e61783d7b8e6c2155216424ed5848305e1baa8
+O
+src/iterator/menu/Waitress.java,3\8\388a26faf5fd430296f4b249a87707bfb81e1b77
+K
+src/iterator/menu/Menu.java,1\3\13158a4fe110710e1a8fdc109b2d156d071ab53d
+P
+ src/iterator/menu/DinerMenu.java,9\d\9da2e887010ce1fecba6f992a6a1ead8be38630c
+?
+settings.gradle,0\5\05efc8b1657769a27696d478ded1e95f38737233
\ No newline at end of file
diff --git a/DesignPattern.iml b/DesignPattern.iml
deleted file mode 100644
index 655a191..0000000
--- a/DesignPattern.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
-      <excludeFolder url="file://$MODULE_DIR$/.idea" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..44eacac
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,26 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * This is a general purpose Gradle build.
+ * Learn more about Gradle by exploring our samples at https://docs.gradle.org/7.4.2/samples
+ */
+
+plugins {
+    id 'application'
+}
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    //lombok
+    implementation 'org.projectlombok:lombok:1.18.22'
+    annotationProcessor 'org.projectlombok:lombok:1.18.26'
+    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
+    testAnnotationProcessor 'org.projectlombok:lombok:1.18.26'
+
+    //logback
+    implementation 'ch.qos.logback:logback-classic:1.4.1'
+    implementation 'org.slf4j:slf4j-api:1.7.25'
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..41d9927
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..aa991fc
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..1b6c787
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,234 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+APP_NAME="Gradle"
+APP_BASE_NAME=${0##*/}
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD=$JAVA_HOME/jre/sh/java
+    else
+        JAVACMD=$JAVA_HOME/bin/java
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD=java
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+# Collect all arguments for the java command;
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+#     shell script including quotes and variable substitutions, so put them in
+#     double quotes to make sure that they get re-expanded; and
+#   * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..4b63c99
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,10 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ *
+ * The settings file is used to specify which projects to include in your build.
+ *
+ * Detailed information about configuring a multi-project build in Gradle can be found
+ * in the user manual at https://docs.gradle.org/7.4.2/userguide/multi_project_builds.html
+ */
+
+rootProject.name = 'DesignPattern'
diff --git a/src/factory/ingredient/factory/PizzaIngredientFactory.java b/src/factory/ingredient/factory/PizzaIngredientFactory.java
deleted file mode 100644
index 30dc528..0000000
--- a/src/factory/ingredient/factory/PizzaIngredientFactory.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package factory.ingredient.factory;
-
-import factory.ingredient.ingredients.*;
-import factory.ingredient.ingredients.Pepperoni;
-import factory.ingredient.ingredients.Sauce;
-import factory.ingredient.ingredients.Veggies;
-
-public interface PizzaIngredientFactory {
-    Dough createDough();
-    Sauce createSauce();
-    Cheese createCheese();
-    Veggies[] createVeggies();
-    Pepperoni createPepperoni();
-    Clams createClam();
-}
diff --git a/src/factory/ingredient/ingredients/impl/BlackOlives.java b/src/factory/ingredient/ingredients/impl/BlackOlives.java
deleted file mode 100644
index 29d622c..0000000
--- a/src/factory/ingredient/ingredients/impl/BlackOlives.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Veggies;
-
-public class BlackOlives implements Veggies {
-
-	public String toString() {
-		return "Black Olives";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/Eggplant.java b/src/factory/ingredient/ingredients/impl/Eggplant.java
deleted file mode 100644
index 20a7823..0000000
--- a/src/factory/ingredient/ingredients/impl/Eggplant.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Veggies;
-
-public class Eggplant implements Veggies {
-
-	public String toString() {
-		return "Eggplant";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/Garlic.java b/src/factory/ingredient/ingredients/impl/Garlic.java
deleted file mode 100644
index 42ea2d1..0000000
--- a/src/factory/ingredient/ingredients/impl/Garlic.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Veggies;
-
-public class Garlic implements Veggies {
-
-	public String toString() {
-		return "Garlic";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/MarinaraSauce.java b/src/factory/ingredient/ingredients/impl/MarinaraSauce.java
deleted file mode 100644
index 715f25e..0000000
--- a/src/factory/ingredient/ingredients/impl/MarinaraSauce.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Sauce;
-
-public class MarinaraSauce implements Sauce {
-	public String toString() {
-		return "Marinara Sauce";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/Mushroom.java b/src/factory/ingredient/ingredients/impl/Mushroom.java
deleted file mode 100644
index 3aa5105..0000000
--- a/src/factory/ingredient/ingredients/impl/Mushroom.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Veggies;
-
-public class Mushroom implements Veggies {
-
-	public String toString() {
-		return "Mushrooms";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/Onion.java b/src/factory/ingredient/ingredients/impl/Onion.java
deleted file mode 100644
index 0dc6c90..0000000
--- a/src/factory/ingredient/ingredients/impl/Onion.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Veggies;
-
-public class Onion implements Veggies {
-
-	public String toString() {
-		return "Onion";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/RedPepper.java b/src/factory/ingredient/ingredients/impl/RedPepper.java
deleted file mode 100644
index e9a9d8e..0000000
--- a/src/factory/ingredient/ingredients/impl/RedPepper.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Veggies;
-
-public class RedPepper implements Veggies {
-
-	public String toString() {
-		return "Red Pepper";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/ReggianoCheese.java b/src/factory/ingredient/ingredients/impl/ReggianoCheese.java
deleted file mode 100644
index 0d1c054..0000000
--- a/src/factory/ingredient/ingredients/impl/ReggianoCheese.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Cheese;
-
-public class ReggianoCheese implements Cheese {
-
-	public String toString() {
-		return "Reggiano Cheese";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/Spinach.java b/src/factory/ingredient/ingredients/impl/Spinach.java
deleted file mode 100644
index 392cda2..0000000
--- a/src/factory/ingredient/ingredients/impl/Spinach.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Veggies;
-
-public class Spinach implements Veggies {
-
-	public String toString() {
-		return "Spinach";
-	}
-}
diff --git a/src/factory/ingredient/ingredients/impl/ThinCrustDough.java b/src/factory/ingredient/ingredients/impl/ThinCrustDough.java
deleted file mode 100644
index 5afcfca..0000000
--- a/src/factory/ingredient/ingredients/impl/ThinCrustDough.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package factory.ingredient.ingredients.impl;
-
-import factory.ingredient.ingredients.Dough;
-
-public class ThinCrustDough implements Dough {
-	public String toString() {
-		return "Thin Crust Dough";
-	}
-}
diff --git a/src/adapter_facade/AdapterPattern.java b/src/main/java/com/design/adapter_facade/AdapterPattern.java
similarity index 64%
rename from src/adapter_facade/AdapterPattern.java
rename to src/main/java/com/design/adapter_facade/AdapterPattern.java
index dc842bd..583ea04 100644
--- a/src/adapter_facade/AdapterPattern.java
+++ b/src/main/java/com/design/adapter_facade/AdapterPattern.java
@@ -1,10 +1,10 @@
-package adapter_facade;
+package com.design.adapter_facade;
 
-import adapter_facade.adapter.Duck;
-import adapter_facade.adapter.Turkey;
-import adapter_facade.adapter.TurkeyAdapter;
-import adapter_facade.adapter.impl.MallardDuck;
-import adapter_facade.adapter.impl.WildTurkey;
+import com.design.adapter_facade.adapter.Duck;
+import com.design.adapter_facade.adapter.Turkey;
+import com.design.adapter_facade.adapter.TurkeyAdapter;
+import com.design.adapter_facade.adapter.impl.MallardDuck;
+import com.design.adapter_facade.adapter.impl.WildTurkey;
 
 
 /**
diff --git a/src/adapter_facade/FacadePattern.java b/src/main/java/com/design/adapter_facade/FacadePattern.java
similarity index 84%
rename from src/adapter_facade/FacadePattern.java
rename to src/main/java/com/design/adapter_facade/FacadePattern.java
index 99ed4ab..b893a07 100644
--- a/src/adapter_facade/FacadePattern.java
+++ b/src/main/java/com/design/adapter_facade/FacadePattern.java
@@ -1,7 +1,7 @@
-package adapter_facade;
+package com.design.adapter_facade;
 
-import adapter_facade.facade.HomeTheaterFacade;
-import adapter_facade.facade.clazz.*;
+import com.design.adapter_facade.facade.HomeTheaterFacade;
+import com.design.adapter_facade.facade.clazz.*;
 
 public class FacadePattern {
     public static void main(String[] args) {
diff --git a/src/adapter_facade/adapter/Duck.java b/src/main/java/com/design/adapter_facade/adapter/Duck.java
similarity index 59%
rename from src/adapter_facade/adapter/Duck.java
rename to src/main/java/com/design/adapter_facade/adapter/Duck.java
index 8f3cf38..18e5d21 100644
--- a/src/adapter_facade/adapter/Duck.java
+++ b/src/main/java/com/design/adapter_facade/adapter/Duck.java
@@ -1,4 +1,4 @@
-package adapter_facade.adapter;
+package com.design.adapter_facade.adapter;
 
 public interface Duck {
     void quack();
diff --git a/src/adapter_facade/adapter/Turkey.java b/src/main/java/com/design/adapter_facade/adapter/Turkey.java
similarity index 60%
rename from src/adapter_facade/adapter/Turkey.java
rename to src/main/java/com/design/adapter_facade/adapter/Turkey.java
index 2f4e331..2b143f8 100644
--- a/src/adapter_facade/adapter/Turkey.java
+++ b/src/main/java/com/design/adapter_facade/adapter/Turkey.java
@@ -1,4 +1,4 @@
-package adapter_facade.adapter;
+package com.design.adapter_facade.adapter;
 
 public interface Turkey {
     void gobble();
diff --git a/src/adapter_facade/adapter/TurkeyAdapter.java b/src/main/java/com/design/adapter_facade/adapter/TurkeyAdapter.java
similarity index 93%
rename from src/adapter_facade/adapter/TurkeyAdapter.java
rename to src/main/java/com/design/adapter_facade/adapter/TurkeyAdapter.java
index 3a04a54..0bd60a7 100644
--- a/src/adapter_facade/adapter/TurkeyAdapter.java
+++ b/src/main/java/com/design/adapter_facade/adapter/TurkeyAdapter.java
@@ -1,4 +1,4 @@
-package adapter_facade.adapter;
+package com.design.adapter_facade.adapter;
 
 /**
  * Duck 객체 대신 Turkey 객체를 사용하기 위해 적용할 어댑터
diff --git a/src/adapter_facade/adapter/impl/MallardDuck.java b/src/main/java/com/design/adapter_facade/adapter/impl/MallardDuck.java
similarity index 69%
rename from src/adapter_facade/adapter/impl/MallardDuck.java
rename to src/main/java/com/design/adapter_facade/adapter/impl/MallardDuck.java
index 7c78872..afb2590 100644
--- a/src/adapter_facade/adapter/impl/MallardDuck.java
+++ b/src/main/java/com/design/adapter_facade/adapter/impl/MallardDuck.java
@@ -1,6 +1,6 @@
-package adapter_facade.adapter.impl;
+package com.design.adapter_facade.adapter.impl;
 
-import adapter_facade.adapter.Duck;
+import com.design.adapter_facade.adapter.Duck;
 
 public class MallardDuck implements Duck {
     @Override
diff --git a/src/adapter_facade/adapter/impl/WildTurkey.java b/src/main/java/com/design/adapter_facade/adapter/impl/WildTurkey.java
similarity index 70%
rename from src/adapter_facade/adapter/impl/WildTurkey.java
rename to src/main/java/com/design/adapter_facade/adapter/impl/WildTurkey.java
index 3356991..ba6b9cf 100644
--- a/src/adapter_facade/adapter/impl/WildTurkey.java
+++ b/src/main/java/com/design/adapter_facade/adapter/impl/WildTurkey.java
@@ -1,6 +1,6 @@
-package adapter_facade.adapter.impl;
+package com.design.adapter_facade.adapter.impl;
 
-import adapter_facade.adapter.Turkey;
+import com.design.adapter_facade.adapter.Turkey;
 
 public class WildTurkey implements Turkey {
     @Override
diff --git a/src/adapter_facade/facade/HomeTheaterFacade.java b/src/main/java/com/design/adapter_facade/facade/HomeTheaterFacade.java
similarity index 95%
rename from src/adapter_facade/facade/HomeTheaterFacade.java
rename to src/main/java/com/design/adapter_facade/facade/HomeTheaterFacade.java
index cc147a3..e472578 100644
--- a/src/adapter_facade/facade/HomeTheaterFacade.java
+++ b/src/main/java/com/design/adapter_facade/facade/HomeTheaterFacade.java
@@ -1,6 +1,6 @@
-package adapter_facade.facade;
+package com.design.adapter_facade.facade;
 
-import adapter_facade.facade.clazz.*;
+import com.design.adapter_facade.facade.clazz.*;
 
 /**
  * 퍼사드 패턴은 여러 서브시스템의 구성요소들을 합쳐서 통합 인터페이스(watchMovie, endMovie)를 만든다
diff --git a/src/adapter_facade/facade/clazz/Amplifier.java b/src/main/java/com/design/adapter_facade/facade/clazz/Amplifier.java
similarity index 95%
rename from src/adapter_facade/facade/clazz/Amplifier.java
rename to src/main/java/com/design/adapter_facade/facade/clazz/Amplifier.java
index cdb2d19..585795a 100644
--- a/src/adapter_facade/facade/clazz/Amplifier.java
+++ b/src/main/java/com/design/adapter_facade/facade/clazz/Amplifier.java
@@ -1,4 +1,4 @@
-package adapter_facade.facade.clazz;
+package com.design.adapter_facade.facade.clazz;
 
 public class Amplifier {
     String description;
diff --git a/src/adapter_facade/facade/clazz/PopcornPopper.java b/src/main/java/com/design/adapter_facade/facade/clazz/PopcornPopper.java
similarity index 90%
rename from src/adapter_facade/facade/clazz/PopcornPopper.java
rename to src/main/java/com/design/adapter_facade/facade/clazz/PopcornPopper.java
index 4de2bce..a2f7900 100644
--- a/src/adapter_facade/facade/clazz/PopcornPopper.java
+++ b/src/main/java/com/design/adapter_facade/facade/clazz/PopcornPopper.java
@@ -1,4 +1,4 @@
-package adapter_facade.facade.clazz;
+package com.design.adapter_facade.facade.clazz;
 
 public class PopcornPopper {
     String description;
diff --git a/src/adapter_facade/facade/clazz/Projector.java b/src/main/java/com/design/adapter_facade/facade/clazz/Projector.java
similarity index 93%
rename from src/adapter_facade/facade/clazz/Projector.java
rename to src/main/java/com/design/adapter_facade/facade/clazz/Projector.java
index 91685b4..54e9fad 100644
--- a/src/adapter_facade/facade/clazz/Projector.java
+++ b/src/main/java/com/design/adapter_facade/facade/clazz/Projector.java
@@ -1,4 +1,4 @@
-package adapter_facade.facade.clazz;
+package com.design.adapter_facade.facade.clazz;
 
 public class Projector {
     String description;
diff --git a/src/adapter_facade/facade/clazz/Screen.java b/src/main/java/com/design/adapter_facade/facade/clazz/Screen.java
similarity index 88%
rename from src/adapter_facade/facade/clazz/Screen.java
rename to src/main/java/com/design/adapter_facade/facade/clazz/Screen.java
index c96b15b..e4af623 100644
--- a/src/adapter_facade/facade/clazz/Screen.java
+++ b/src/main/java/com/design/adapter_facade/facade/clazz/Screen.java
@@ -1,4 +1,4 @@
-package adapter_facade.facade.clazz;
+package com.design.adapter_facade.facade.clazz;
 
 public class Screen {
     String description;
diff --git a/src/adapter_facade/facade/clazz/StreamingPlayer.java b/src/main/java/com/design/adapter_facade/facade/clazz/StreamingPlayer.java
similarity index 96%
rename from src/adapter_facade/facade/clazz/StreamingPlayer.java
rename to src/main/java/com/design/adapter_facade/facade/clazz/StreamingPlayer.java
index 5a0af2c..aa70650 100644
--- a/src/adapter_facade/facade/clazz/StreamingPlayer.java
+++ b/src/main/java/com/design/adapter_facade/facade/clazz/StreamingPlayer.java
@@ -1,4 +1,4 @@
-package adapter_facade.facade.clazz;
+package com.design.adapter_facade.facade.clazz;
 
 public class StreamingPlayer {
     String description;
diff --git a/src/adapter_facade/facade/clazz/TheaterLights.java b/src/main/java/com/design/adapter_facade/facade/clazz/TheaterLights.java
similarity index 91%
rename from src/adapter_facade/facade/clazz/TheaterLights.java
rename to src/main/java/com/design/adapter_facade/facade/clazz/TheaterLights.java
index a7a4b01..71b404e 100644
--- a/src/adapter_facade/facade/clazz/TheaterLights.java
+++ b/src/main/java/com/design/adapter_facade/facade/clazz/TheaterLights.java
@@ -1,4 +1,4 @@
-package adapter_facade.facade.clazz;
+package com.design.adapter_facade.facade.clazz;
 
 public class TheaterLights {
     String description;
diff --git a/src/adapter_facade/facade/clazz/Tuner.java b/src/main/java/com/design/adapter_facade/facade/clazz/Tuner.java
similarity index 94%
rename from src/adapter_facade/facade/clazz/Tuner.java
rename to src/main/java/com/design/adapter_facade/facade/clazz/Tuner.java
index 8cd4e86..aedf1bf 100644
--- a/src/adapter_facade/facade/clazz/Tuner.java
+++ b/src/main/java/com/design/adapter_facade/facade/clazz/Tuner.java
@@ -1,4 +1,4 @@
-package adapter_facade.facade.clazz;
+package com.design.adapter_facade.facade.clazz;
 
 public class Tuner {
     String description;
diff --git "a/src/adapter_facade/\354\226\264\353\214\221\355\204\260 & \355\215\274\354\202\254\353\223\234 \355\214\250\355\204\264.md" "b/src/main/java/com/design/adapter_facade/\354\226\264\353\214\221\355\204\260 & \355\215\274\354\202\254\353\223\234 \355\214\250\355\204\264.md"
similarity index 100%
rename from "src/adapter_facade/\354\226\264\353\214\221\355\204\260 & \355\215\274\354\202\254\353\223\234 \355\214\250\355\204\264.md"
rename to "src/main/java/com/design/adapter_facade/\354\226\264\353\214\221\355\204\260 & \355\215\274\354\202\254\353\223\234 \355\214\250\355\204\264.md"
diff --git a/src/command/CommandPattern.java b/src/main/java/com/design/command/CommandPattern.java
similarity index 100%
rename from src/command/CommandPattern.java
rename to src/main/java/com/design/command/CommandPattern.java
diff --git a/src/command/command/Command.java b/src/main/java/com/design/command/command/Command.java
similarity index 100%
rename from src/command/command/Command.java
rename to src/main/java/com/design/command/command/Command.java
diff --git a/src/command/command/impl/GarageDoorDownCommand.java b/src/main/java/com/design/command/command/impl/GarageDoorDownCommand.java
similarity index 100%
rename from src/command/command/impl/GarageDoorDownCommand.java
rename to src/main/java/com/design/command/command/impl/GarageDoorDownCommand.java
diff --git a/src/command/command/impl/GarageDoorUpCommand.java b/src/main/java/com/design/command/command/impl/GarageDoorUpCommand.java
similarity index 100%
rename from src/command/command/impl/GarageDoorUpCommand.java
rename to src/main/java/com/design/command/command/impl/GarageDoorUpCommand.java
diff --git a/src/command/command/impl/LightOffCommand.java b/src/main/java/com/design/command/command/impl/LightOffCommand.java
similarity index 100%
rename from src/command/command/impl/LightOffCommand.java
rename to src/main/java/com/design/command/command/impl/LightOffCommand.java
diff --git a/src/command/command/impl/LightOnCommand.java b/src/main/java/com/design/command/command/impl/LightOnCommand.java
similarity index 100%
rename from src/command/command/impl/LightOnCommand.java
rename to src/main/java/com/design/command/command/impl/LightOnCommand.java
diff --git a/src/command/command/impl/NoCommand.java b/src/main/java/com/design/command/command/impl/NoCommand.java
similarity index 100%
rename from src/command/command/impl/NoCommand.java
rename to src/main/java/com/design/command/command/impl/NoCommand.java
diff --git a/src/command/command/impl/StereoOffCommand.java b/src/main/java/com/design/command/command/impl/StereoOffCommand.java
similarity index 100%
rename from src/command/command/impl/StereoOffCommand.java
rename to src/main/java/com/design/command/command/impl/StereoOffCommand.java
diff --git a/src/command/command/impl/StereoOnWithCDCommand.java b/src/main/java/com/design/command/command/impl/StereoOnWithCDCommand.java
similarity index 100%
rename from src/command/command/impl/StereoOnWithCDCommand.java
rename to src/main/java/com/design/command/command/impl/StereoOnWithCDCommand.java
diff --git a/src/command/invoker/RemoteControl.java b/src/main/java/com/design/command/invoker/RemoteControl.java
similarity index 100%
rename from src/command/invoker/RemoteControl.java
rename to src/main/java/com/design/command/invoker/RemoteControl.java
diff --git a/src/command/invoker/RemoteControlWithUndo.java b/src/main/java/com/design/command/invoker/RemoteControlWithUndo.java
similarity index 100%
rename from src/command/invoker/RemoteControlWithUndo.java
rename to src/main/java/com/design/command/invoker/RemoteControlWithUndo.java
diff --git a/src/command/invoker/SimpleRemoteControl.java b/src/main/java/com/design/command/invoker/SimpleRemoteControl.java
similarity index 100%
rename from src/command/invoker/SimpleRemoteControl.java
rename to src/main/java/com/design/command/invoker/SimpleRemoteControl.java
diff --git a/src/command/receiver/GarageDoor.java b/src/main/java/com/design/command/receiver/GarageDoor.java
similarity index 100%
rename from src/command/receiver/GarageDoor.java
rename to src/main/java/com/design/command/receiver/GarageDoor.java
diff --git a/src/command/receiver/Light.java b/src/main/java/com/design/command/receiver/Light.java
similarity index 100%
rename from src/command/receiver/Light.java
rename to src/main/java/com/design/command/receiver/Light.java
diff --git a/src/command/receiver/Stereo.java b/src/main/java/com/design/command/receiver/Stereo.java
similarity index 100%
rename from src/command/receiver/Stereo.java
rename to src/main/java/com/design/command/receiver/Stereo.java
diff --git "a/src/command/\354\273\244\353\247\250\353\223\234 \355\214\250\355\204\264.md" "b/src/main/java/com/design/command/\354\273\244\353\247\250\353\223\234 \355\214\250\355\204\264.md"
similarity index 93%
rename from "src/command/\354\273\244\353\247\250\353\223\234 \355\214\250\355\204\264.md"
rename to "src/main/java/com/design/command/\354\273\244\353\247\250\353\223\234 \355\214\250\355\204\264.md"
index 02eb9e8..037123d 100644
--- "a/src/command/\354\273\244\353\247\250\353\223\234 \355\214\250\355\204\264.md"	
+++ "b/src/main/java/com/design/command/\354\273\244\353\247\250\353\223\234 \355\214\250\355\204\264.md"	
@@ -6,9 +6,9 @@
 
 > 구체적인 커맨드 패턴의 예시
 
-![img.png](../../img/command/img.png)
+![img.png](../../../../img/command/img.png)
 
-![img.png](../../img/command/img2.png)
+![img.png](../../../../img/command/img2.png)
 
 1. createCommandObject() : 클라이언트가 리시버에 전달할 일련의 행동으로 구성된 커맨드 객체를 생성</br>execute() : 커맨드 객체의 유일한 execute() 메소드로 행동을 캡슐화하여
    리시버의 특정 행동을 처리
@@ -30,7 +30,7 @@
 
 - 작업 큐에 쌓인 여러 작업(커맨드 객체)들의 execute() 메소드를 호출
 
-![img.png](../../img/command/img3.png)
+![img.png](../../../../img/command/img3.png)
 
 애플리케이션이 비정상 종료되었을 때, 이전의 행동을 복구하는데에 커맨드 패턴을 활용할 수 있다
 
diff --git a/src/composite/CompositePattern.java b/src/main/java/com/design/composite/CompositePattern.java
similarity index 92%
rename from src/composite/CompositePattern.java
rename to src/main/java/com/design/composite/CompositePattern.java
index a5e5168..63ecc10 100644
--- a/src/composite/CompositePattern.java
+++ b/src/main/java/com/design/composite/CompositePattern.java
@@ -1,8 +1,8 @@
-package composite;
+package com.design.composite;
 
-import composite.menu.Menu;
-import composite.menu.MenuComponent;
-import composite.menu.MenuItem;
+import com.design.composite.menu.Menu;
+import com.design.composite.menu.MenuComponent;
+import com.design.composite.menu.MenuItem;
 
 public class CompositePattern {
     public static void main(String[] args) {
diff --git a/src/composite/Waitress.java b/src/main/java/com/design/composite/Waitress.java
similarity index 76%
rename from src/composite/Waitress.java
rename to src/main/java/com/design/composite/Waitress.java
index bc862b3..2155062 100644
--- a/src/composite/Waitress.java
+++ b/src/main/java/com/design/composite/Waitress.java
@@ -1,7 +1,7 @@
-package composite;
+package com.design.composite;
 
 
-import composite.menu.MenuComponent;
+import com.design.composite.menu.MenuComponent;
 
 public class Waitress {
     private final MenuComponent allMenus; // 트리의 최상위 노드
diff --git a/src/composite/menu/Menu.java b/src/main/java/com/design/composite/menu/Menu.java
similarity index 97%
rename from src/composite/menu/Menu.java
rename to src/main/java/com/design/composite/menu/Menu.java
index f7bced6..9b2de0e 100644
--- a/src/composite/menu/Menu.java
+++ b/src/main/java/com/design/composite/menu/Menu.java
@@ -1,4 +1,4 @@
-package composite.menu;
+package com.design.composite.menu;
 
 
 import java.util.ArrayList;
diff --git a/src/composite/menu/MenuComponent.java b/src/main/java/com/design/composite/menu/MenuComponent.java
similarity index 95%
rename from src/composite/menu/MenuComponent.java
rename to src/main/java/com/design/composite/menu/MenuComponent.java
index efe3b7b..7c043f6 100644
--- a/src/composite/menu/MenuComponent.java
+++ b/src/main/java/com/design/composite/menu/MenuComponent.java
@@ -1,4 +1,4 @@
-package composite.menu;
+package com.design.composite.menu;
 
 public abstract class MenuComponent {
     public void add(MenuComponent menuComponent) {
diff --git a/src/composite/menu/MenuItem.java b/src/main/java/com/design/composite/menu/MenuItem.java
similarity index 96%
rename from src/composite/menu/MenuItem.java
rename to src/main/java/com/design/composite/menu/MenuItem.java
index 5aa54be..f56795a 100644
--- a/src/composite/menu/MenuItem.java
+++ b/src/main/java/com/design/composite/menu/MenuItem.java
@@ -1,4 +1,4 @@
-package composite.menu;
+package com.design.composite.menu;
 
 public class MenuItem extends MenuComponent {
     private final String name;
diff --git a/src/decorator/DecoratorPattern.java b/src/main/java/com/design/decorator/DecoratorPattern.java
similarity index 100%
rename from src/decorator/DecoratorPattern.java
rename to src/main/java/com/design/decorator/DecoratorPattern.java
diff --git a/src/decorator/beverage/DarkRoast.java b/src/main/java/com/design/decorator/beverage/DarkRoast.java
similarity index 100%
rename from src/decorator/beverage/DarkRoast.java
rename to src/main/java/com/design/decorator/beverage/DarkRoast.java
diff --git a/src/decorator/beverage/Decaf.java b/src/main/java/com/design/decorator/beverage/Decaf.java
similarity index 100%
rename from src/decorator/beverage/Decaf.java
rename to src/main/java/com/design/decorator/beverage/Decaf.java
diff --git a/src/decorator/beverage/Espresso.java b/src/main/java/com/design/decorator/beverage/Espresso.java
similarity index 100%
rename from src/decorator/beverage/Espresso.java
rename to src/main/java/com/design/decorator/beverage/Espresso.java
diff --git a/src/decorator/beverage/HouseBlend.java b/src/main/java/com/design/decorator/beverage/HouseBlend.java
similarity index 100%
rename from src/decorator/beverage/HouseBlend.java
rename to src/main/java/com/design/decorator/beverage/HouseBlend.java
diff --git a/src/decorator/beverage/base/Beverage.java b/src/main/java/com/design/decorator/beverage/base/Beverage.java
similarity index 100%
rename from src/decorator/beverage/base/Beverage.java
rename to src/main/java/com/design/decorator/beverage/base/Beverage.java
diff --git a/src/decorator/beverage/enums/Size.java b/src/main/java/com/design/decorator/beverage/enums/Size.java
similarity index 100%
rename from src/decorator/beverage/enums/Size.java
rename to src/main/java/com/design/decorator/beverage/enums/Size.java
diff --git a/src/decorator/decorator/Mocha.java b/src/main/java/com/design/decorator/decorator/Mocha.java
similarity index 100%
rename from src/decorator/decorator/Mocha.java
rename to src/main/java/com/design/decorator/decorator/Mocha.java
diff --git a/src/decorator/decorator/Soy.java b/src/main/java/com/design/decorator/decorator/Soy.java
similarity index 100%
rename from src/decorator/decorator/Soy.java
rename to src/main/java/com/design/decorator/decorator/Soy.java
diff --git a/src/decorator/decorator/Whip.java b/src/main/java/com/design/decorator/decorator/Whip.java
similarity index 100%
rename from src/decorator/decorator/Whip.java
rename to src/main/java/com/design/decorator/decorator/Whip.java
diff --git a/src/decorator/decorator/base/CondimentDecorator.java b/src/main/java/com/design/decorator/decorator/base/CondimentDecorator.java
similarity index 100%
rename from src/decorator/decorator/base/CondimentDecorator.java
rename to src/main/java/com/design/decorator/decorator/base/CondimentDecorator.java
diff --git "a/src/decorator/\353\215\260\354\275\224\353\240\210\354\235\264\355\204\260\355\214\250\355\204\264.md" "b/src/main/java/com/design/decorator/\353\215\260\354\275\224\353\240\210\354\235\264\355\204\260\355\214\250\355\204\264.md"
similarity index 93%
rename from "src/decorator/\353\215\260\354\275\224\353\240\210\354\235\264\355\204\260\355\214\250\355\204\264.md"
rename to "src/main/java/com/design/decorator/\353\215\260\354\275\224\353\240\210\354\235\264\355\204\260\355\214\250\355\204\264.md"
index 23bddb0..e3fdd13 100644
--- "a/src/decorator/\353\215\260\354\275\224\353\240\210\354\235\264\355\204\260\355\214\250\355\204\264.md"
+++ "b/src/main/java/com/design/decorator/\353\215\260\354\275\224\353\240\210\354\235\264\355\204\260\355\214\250\355\204\264.md"
@@ -19,8 +19,8 @@
 
 # 데코레이터 패턴
 
-![img.png](../../img/decorator/img.png)
-![img.png](../../img/decorator/img2.png)
+![img.png](../../../../img/decorator/img.png)
+![img.png](../../../../img/decorator/img2.png)
 
 > 객체에 추가 요소를 동적으로 더할 수 있는 패턴으로, 서브클래스를 만들 때보다 유연하게 기능읗 확장할 수 있는 특징이 있다.
 
@@ -42,4 +42,4 @@
 
 ## 데코레이터 패턴의 예시 : 자바 I/O
 
-![img.png](../../img/decorator/img3.png)
+![img.png](../../../../img/decorator/img3.png)
diff --git a/src/factory/FactoryPattern.java b/src/main/java/com/design/factory/FactoryPattern.java
similarity index 72%
rename from src/factory/FactoryPattern.java
rename to src/main/java/com/design/factory/FactoryPattern.java
index e733090..47257f0 100644
--- a/src/factory/FactoryPattern.java
+++ b/src/main/java/com/design/factory/FactoryPattern.java
@@ -1,8 +1,8 @@
-package factory;
+package com.design.factory;
 
-import factory.pizza.Pizza;
-import factory.pizzastore.impl.ChicagoPizzaStore;
-import factory.pizzastore.impl.NYPizzaStore;
+import com.design.factory.pizza.Pizza;
+import com.design.factory.pizzastore.impl.ChicagoPizzaStore;
+import com.design.factory.pizzastore.impl.NYPizzaStore;
 
 public class FactoryPattern {
     public static void main(String[] args) {
diff --git a/src/main/java/com/design/factory/ingredient/factory/PizzaIngredientFactory.java b/src/main/java/com/design/factory/ingredient/factory/PizzaIngredientFactory.java
new file mode 100644
index 0000000..e556dfa
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/factory/PizzaIngredientFactory.java
@@ -0,0 +1,12 @@
+package com.design.factory.ingredient.factory;
+
+import com.design.factory.ingredient.ingredients.*;
+
+public interface PizzaIngredientFactory {
+    Dough createDough();
+    Sauce createSauce();
+    Cheese createCheese();
+    Veggies[] createVeggies();
+    Pepperoni createPepperoni();
+    Clams createClam();
+}
diff --git a/src/factory/ingredient/factory/impl/ChicagoPizzaIngredientFactory.java b/src/main/java/com/design/factory/ingredient/factory/impl/ChicagoPizzaIngredientFactory.java
similarity index 71%
rename from src/factory/ingredient/factory/impl/ChicagoPizzaIngredientFactory.java
rename to src/main/java/com/design/factory/ingredient/factory/impl/ChicagoPizzaIngredientFactory.java
index db79304..01f5b3e 100644
--- a/src/factory/ingredient/factory/impl/ChicagoPizzaIngredientFactory.java
+++ b/src/main/java/com/design/factory/ingredient/factory/impl/ChicagoPizzaIngredientFactory.java
@@ -1,8 +1,8 @@
-package factory.ingredient.factory.impl;
+package com.design.factory.ingredient.factory.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.ingredient.ingredients.*;
-import factory.ingredient.ingredients.impl.*;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.ingredient.ingredients.*;
+import com.design.factory.ingredient.ingredients.impl.*;
 
 public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
 
diff --git a/src/factory/ingredient/factory/impl/NYPizzaIngredientFactory.java b/src/main/java/com/design/factory/ingredient/factory/impl/NYPizzaIngredientFactory.java
similarity index 70%
rename from src/factory/ingredient/factory/impl/NYPizzaIngredientFactory.java
rename to src/main/java/com/design/factory/ingredient/factory/impl/NYPizzaIngredientFactory.java
index 951eeac..bce09bf 100644
--- a/src/factory/ingredient/factory/impl/NYPizzaIngredientFactory.java
+++ b/src/main/java/com/design/factory/ingredient/factory/impl/NYPizzaIngredientFactory.java
@@ -1,8 +1,8 @@
-package factory.ingredient.factory.impl;
+package com.design.factory.ingredient.factory.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.ingredient.ingredients.*;
-import factory.ingredient.ingredients.impl.*;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.ingredient.ingredients.*;
+import com.design.factory.ingredient.ingredients.impl.*;
 
 public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
  
diff --git a/src/factory/ingredient/ingredients/Cheese.java b/src/main/java/com/design/factory/ingredient/ingredients/Cheese.java
similarity index 52%
rename from src/factory/ingredient/ingredients/Cheese.java
rename to src/main/java/com/design/factory/ingredient/ingredients/Cheese.java
index 7ae2fd3..210aab9 100644
--- a/src/factory/ingredient/ingredients/Cheese.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/Cheese.java
@@ -1,4 +1,4 @@
-package factory.ingredient.ingredients;
+package com.design.factory.ingredient.ingredients;
 
 public interface Cheese {
 	public String toString();
diff --git a/src/factory/ingredient/ingredients/Clams.java b/src/main/java/com/design/factory/ingredient/ingredients/Clams.java
similarity index 51%
rename from src/factory/ingredient/ingredients/Clams.java
rename to src/main/java/com/design/factory/ingredient/ingredients/Clams.java
index 9cac502..2160c0e 100644
--- a/src/factory/ingredient/ingredients/Clams.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/Clams.java
@@ -1,4 +1,4 @@
-package factory.ingredient.ingredients;
+package com.design.factory.ingredient.ingredients;
 
 public interface Clams {
 	public String toString();
diff --git a/src/factory/ingredient/ingredients/Dough.java b/src/main/java/com/design/factory/ingredient/ingredients/Dough.java
similarity index 51%
rename from src/factory/ingredient/ingredients/Dough.java
rename to src/main/java/com/design/factory/ingredient/ingredients/Dough.java
index 148bf22..2a0c14d 100644
--- a/src/factory/ingredient/ingredients/Dough.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/Dough.java
@@ -1,4 +1,4 @@
-package factory.ingredient.ingredients;
+package com.design.factory.ingredient.ingredients;
 
 public interface Dough {
 	public String toString();
diff --git a/src/factory/ingredient/ingredients/Pepperoni.java b/src/main/java/com/design/factory/ingredient/ingredients/Pepperoni.java
similarity index 53%
rename from src/factory/ingredient/ingredients/Pepperoni.java
rename to src/main/java/com/design/factory/ingredient/ingredients/Pepperoni.java
index a19f953..4d2334d 100644
--- a/src/factory/ingredient/ingredients/Pepperoni.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/Pepperoni.java
@@ -1,4 +1,4 @@
-package factory.ingredient.ingredients;
+package com.design.factory.ingredient.ingredients;
 
 public interface Pepperoni {
 	public String toString();
diff --git a/src/factory/ingredient/ingredients/Sauce.java b/src/main/java/com/design/factory/ingredient/ingredients/Sauce.java
similarity index 51%
rename from src/factory/ingredient/ingredients/Sauce.java
rename to src/main/java/com/design/factory/ingredient/ingredients/Sauce.java
index ad9453f..0e47bd4 100644
--- a/src/factory/ingredient/ingredients/Sauce.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/Sauce.java
@@ -1,4 +1,4 @@
-package factory.ingredient.ingredients;
+package com.design.factory.ingredient.ingredients;
 
 public interface Sauce {
 	public String toString();
diff --git a/src/factory/ingredient/ingredients/Veggies.java b/src/main/java/com/design/factory/ingredient/ingredients/Veggies.java
similarity index 52%
rename from src/factory/ingredient/ingredients/Veggies.java
rename to src/main/java/com/design/factory/ingredient/ingredients/Veggies.java
index d40cf73..8f787a2 100644
--- a/src/factory/ingredient/ingredients/Veggies.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/Veggies.java
@@ -1,4 +1,4 @@
-package factory.ingredient.ingredients;
+package com.design.factory.ingredient.ingredients;
 
 public interface Veggies {
 	public String toString();
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/BlackOlives.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/BlackOlives.java
new file mode 100644
index 0000000..32cbe3c
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/BlackOlives.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Veggies;
+
+public class BlackOlives implements Veggies {
+
+	public String toString() {
+		return "Black Olives";
+	}
+}
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/Eggplant.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/Eggplant.java
new file mode 100644
index 0000000..2db5f3a
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/Eggplant.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Veggies;
+
+public class Eggplant implements Veggies {
+
+	public String toString() {
+		return "Eggplant";
+	}
+}
diff --git a/src/factory/ingredient/ingredients/impl/FreshClams.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/FreshClams.java
similarity index 52%
rename from src/factory/ingredient/ingredients/impl/FreshClams.java
rename to src/main/java/com/design/factory/ingredient/ingredients/impl/FreshClams.java
index a9360ad..430e1c9 100644
--- a/src/factory/ingredient/ingredients/impl/FreshClams.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/FreshClams.java
@@ -1,6 +1,6 @@
-package factory.ingredient.ingredients.impl;
+package com.design.factory.ingredient.ingredients.impl;
 
-import factory.ingredient.ingredients.Clams;
+import com.design.factory.ingredient.ingredients.Clams;
 
 public class FreshClams implements Clams {
 
diff --git a/src/factory/ingredient/ingredients/impl/FrozenClams.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/FrozenClams.java
similarity index 52%
rename from src/factory/ingredient/ingredients/impl/FrozenClams.java
rename to src/main/java/com/design/factory/ingredient/ingredients/impl/FrozenClams.java
index df2a00b..704d4f9 100644
--- a/src/factory/ingredient/ingredients/impl/FrozenClams.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/FrozenClams.java
@@ -1,6 +1,6 @@
-package factory.ingredient.ingredients.impl;
+package com.design.factory.ingredient.ingredients.impl;
 
-import factory.ingredient.ingredients.Clams;
+import com.design.factory.ingredient.ingredients.Clams;
 
 public class FrozenClams implements Clams {
 
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/Garlic.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/Garlic.java
new file mode 100644
index 0000000..c2779d5
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/Garlic.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Veggies;
+
+public class Garlic implements Veggies {
+
+	public String toString() {
+		return "Garlic";
+	}
+}
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/MarinaraSauce.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/MarinaraSauce.java
new file mode 100644
index 0000000..0a345fb
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/MarinaraSauce.java
@@ -0,0 +1,9 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Sauce;
+
+public class MarinaraSauce implements Sauce {
+	public String toString() {
+		return "Marinara Sauce";
+	}
+}
diff --git a/src/factory/ingredient/ingredients/impl/MozzarellaCheese.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/MozzarellaCheese.java
similarity index 51%
rename from src/factory/ingredient/ingredients/impl/MozzarellaCheese.java
rename to src/main/java/com/design/factory/ingredient/ingredients/impl/MozzarellaCheese.java
index 730eae4..babb127 100644
--- a/src/factory/ingredient/ingredients/impl/MozzarellaCheese.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/MozzarellaCheese.java
@@ -1,6 +1,6 @@
-package factory.ingredient.ingredients.impl;
+package com.design.factory.ingredient.ingredients.impl;
 
-import factory.ingredient.ingredients.Cheese;
+import com.design.factory.ingredient.ingredients.Cheese;
 
 public class MozzarellaCheese implements Cheese {
 
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/Mushroom.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/Mushroom.java
new file mode 100644
index 0000000..c10dbc6
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/Mushroom.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Veggies;
+
+public class Mushroom implements Veggies {
+
+	public String toString() {
+		return "Mushrooms";
+	}
+}
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/Onion.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/Onion.java
new file mode 100644
index 0000000..52eaf49
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/Onion.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Veggies;
+
+public class Onion implements Veggies {
+
+	public String toString() {
+		return "Onion";
+	}
+}
diff --git a/src/factory/ingredient/ingredients/impl/ParmesanCheese.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/ParmesanCheese.java
similarity index 50%
rename from src/factory/ingredient/ingredients/impl/ParmesanCheese.java
rename to src/main/java/com/design/factory/ingredient/ingredients/impl/ParmesanCheese.java
index 7049e8d..76ebf8d 100644
--- a/src/factory/ingredient/ingredients/impl/ParmesanCheese.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/ParmesanCheese.java
@@ -1,6 +1,6 @@
-package factory.ingredient.ingredients.impl;
+package com.design.factory.ingredient.ingredients.impl;
 
-import factory.ingredient.ingredients.Cheese;
+import com.design.factory.ingredient.ingredients.Cheese;
 
 public class ParmesanCheese implements Cheese {
 
diff --git a/src/factory/ingredient/ingredients/impl/PlumTomatoSauce.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/PlumTomatoSauce.java
similarity index 53%
rename from src/factory/ingredient/ingredients/impl/PlumTomatoSauce.java
rename to src/main/java/com/design/factory/ingredient/ingredients/impl/PlumTomatoSauce.java
index e00355a..4c18aa3 100644
--- a/src/factory/ingredient/ingredients/impl/PlumTomatoSauce.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/PlumTomatoSauce.java
@@ -1,6 +1,6 @@
-package factory.ingredient.ingredients.impl;
+package com.design.factory.ingredient.ingredients.impl;
 
-import factory.ingredient.ingredients.Sauce;
+import com.design.factory.ingredient.ingredients.Sauce;
 
 public class PlumTomatoSauce implements Sauce {
 	public String toString() {
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/RedPepper.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/RedPepper.java
new file mode 100644
index 0000000..af2cbc4
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/RedPepper.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Veggies;
+
+public class RedPepper implements Veggies {
+
+	public String toString() {
+		return "Red Pepper";
+	}
+}
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/ReggianoCheese.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/ReggianoCheese.java
new file mode 100644
index 0000000..bf8a15a
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/ReggianoCheese.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Cheese;
+
+public class ReggianoCheese implements Cheese {
+
+	public String toString() {
+		return "Reggiano Cheese";
+	}
+}
diff --git a/src/factory/ingredient/ingredients/impl/SlicedPepperoni.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/SlicedPepperoni.java
similarity index 50%
rename from src/factory/ingredient/ingredients/impl/SlicedPepperoni.java
rename to src/main/java/com/design/factory/ingredient/ingredients/impl/SlicedPepperoni.java
index 2270d09..408cd7b 100644
--- a/src/factory/ingredient/ingredients/impl/SlicedPepperoni.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/SlicedPepperoni.java
@@ -1,6 +1,6 @@
-package factory.ingredient.ingredients.impl;
+package com.design.factory.ingredient.ingredients.impl;
 
-import factory.ingredient.ingredients.Pepperoni;
+import com.design.factory.ingredient.ingredients.Pepperoni;
 
 public class SlicedPepperoni implements Pepperoni {
 
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/Spinach.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/Spinach.java
new file mode 100644
index 0000000..3781289
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/Spinach.java
@@ -0,0 +1,10 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Veggies;
+
+public class Spinach implements Veggies {
+
+	public String toString() {
+		return "Spinach";
+	}
+}
diff --git a/src/factory/ingredient/ingredients/impl/ThickCrustDough.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/ThickCrustDough.java
similarity index 54%
rename from src/factory/ingredient/ingredients/impl/ThickCrustDough.java
rename to src/main/java/com/design/factory/ingredient/ingredients/impl/ThickCrustDough.java
index 6ef6d36..34b8782 100644
--- a/src/factory/ingredient/ingredients/impl/ThickCrustDough.java
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/ThickCrustDough.java
@@ -1,6 +1,6 @@
-package factory.ingredient.ingredients.impl;
+package com.design.factory.ingredient.ingredients.impl;
 
-import factory.ingredient.ingredients.Dough;
+import com.design.factory.ingredient.ingredients.Dough;
 
 public class ThickCrustDough implements Dough {
 	public String toString() {
diff --git a/src/main/java/com/design/factory/ingredient/ingredients/impl/ThinCrustDough.java b/src/main/java/com/design/factory/ingredient/ingredients/impl/ThinCrustDough.java
new file mode 100644
index 0000000..496fd76
--- /dev/null
+++ b/src/main/java/com/design/factory/ingredient/ingredients/impl/ThinCrustDough.java
@@ -0,0 +1,9 @@
+package com.design.factory.ingredient.ingredients.impl;
+
+import com.design.factory.ingredient.ingredients.Dough;
+
+public class ThinCrustDough implements Dough {
+	public String toString() {
+		return "Thin Crust Dough";
+	}
+}
diff --git a/src/factory/pizza/Pizza.java b/src/main/java/com/design/factory/pizza/Pizza.java
similarity index 95%
rename from src/factory/pizza/Pizza.java
rename to src/main/java/com/design/factory/pizza/Pizza.java
index b233356..ddc0abb 100644
--- a/src/factory/pizza/Pizza.java
+++ b/src/main/java/com/design/factory/pizza/Pizza.java
@@ -1,6 +1,6 @@
-package factory.pizza;
+package com.design.factory.pizza;
 
-import factory.ingredient.ingredients.*;
+import com.design.factory.ingredient.ingredients.*;
 
 public abstract class Pizza {
     protected String name;
diff --git a/src/factory/pizza/impl/ChicagoStyleCheesePizza.java b/src/main/java/com/design/factory/pizza/impl/ChicagoStyleCheesePizza.java
similarity index 82%
rename from src/factory/pizza/impl/ChicagoStyleCheesePizza.java
rename to src/main/java/com/design/factory/pizza/impl/ChicagoStyleCheesePizza.java
index 6ebb1de..d84ca66 100644
--- a/src/factory/pizza/impl/ChicagoStyleCheesePizza.java
+++ b/src/main/java/com/design/factory/pizza/impl/ChicagoStyleCheesePizza.java
@@ -1,7 +1,7 @@
-package factory.pizza.impl;
+package com.design.factory.pizza.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.pizza.Pizza;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.pizza.Pizza;
 
 public class ChicagoStyleCheesePizza extends Pizza {
 
diff --git a/src/factory/pizza/impl/ChicagoStylePepperoniPizza.java b/src/main/java/com/design/factory/pizza/impl/ChicagoStylePepperoniPizza.java
similarity index 82%
rename from src/factory/pizza/impl/ChicagoStylePepperoniPizza.java
rename to src/main/java/com/design/factory/pizza/impl/ChicagoStylePepperoniPizza.java
index 380127c..ab3b725 100644
--- a/src/factory/pizza/impl/ChicagoStylePepperoniPizza.java
+++ b/src/main/java/com/design/factory/pizza/impl/ChicagoStylePepperoniPizza.java
@@ -1,7 +1,7 @@
-package factory.pizza.impl;
+package com.design.factory.pizza.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.pizza.Pizza;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.pizza.Pizza;
 
 public class ChicagoStylePepperoniPizza extends Pizza {
 	private final PizzaIngredientFactory pizzaIngredientFactory;
diff --git a/src/factory/pizza/impl/NYStyleCheesePizza.java b/src/main/java/com/design/factory/pizza/impl/NYStyleCheesePizza.java
similarity index 79%
rename from src/factory/pizza/impl/NYStyleCheesePizza.java
rename to src/main/java/com/design/factory/pizza/impl/NYStyleCheesePizza.java
index afc5fb9..f7a9d87 100644
--- a/src/factory/pizza/impl/NYStyleCheesePizza.java
+++ b/src/main/java/com/design/factory/pizza/impl/NYStyleCheesePizza.java
@@ -1,7 +1,7 @@
-package factory.pizza.impl;
+package com.design.factory.pizza.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.pizza.Pizza;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.pizza.Pizza;
 
 public class NYStyleCheesePizza extends Pizza {
 
diff --git a/src/factory/pizza/impl/NYStylePepperoniPizza.java b/src/main/java/com/design/factory/pizza/impl/NYStylePepperoniPizza.java
similarity index 80%
rename from src/factory/pizza/impl/NYStylePepperoniPizza.java
rename to src/main/java/com/design/factory/pizza/impl/NYStylePepperoniPizza.java
index a601394..6cec8ed 100644
--- a/src/factory/pizza/impl/NYStylePepperoniPizza.java
+++ b/src/main/java/com/design/factory/pizza/impl/NYStylePepperoniPizza.java
@@ -1,7 +1,7 @@
-package factory.pizza.impl;
+package com.design.factory.pizza.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.pizza.Pizza;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.pizza.Pizza;
 
 public class NYStylePepperoniPizza extends Pizza {
 
diff --git a/src/factory/pizzastore/PizzaStore.java b/src/main/java/com/design/factory/pizzastore/PizzaStore.java
similarity index 87%
rename from src/factory/pizzastore/PizzaStore.java
rename to src/main/java/com/design/factory/pizzastore/PizzaStore.java
index 28eb27f..af98e51 100644
--- a/src/factory/pizzastore/PizzaStore.java
+++ b/src/main/java/com/design/factory/pizzastore/PizzaStore.java
@@ -1,6 +1,6 @@
-package factory.pizzastore;
+package com.design.factory.pizzastore;
 
-import factory.pizza.Pizza;
+import com.design.factory.pizza.Pizza;
 
 public abstract class PizzaStore {
 
diff --git a/src/factory/pizzastore/impl/ChicagoPizzaStore.java b/src/main/java/com/design/factory/pizzastore/impl/ChicagoPizzaStore.java
similarity index 62%
rename from src/factory/pizzastore/impl/ChicagoPizzaStore.java
rename to src/main/java/com/design/factory/pizzastore/impl/ChicagoPizzaStore.java
index b04ddaf..afea009 100644
--- a/src/factory/pizzastore/impl/ChicagoPizzaStore.java
+++ b/src/main/java/com/design/factory/pizzastore/impl/ChicagoPizzaStore.java
@@ -1,11 +1,11 @@
-package factory.pizzastore.impl;
+package com.design.factory.pizzastore.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.ingredient.factory.impl.ChicagoPizzaIngredientFactory;
-import factory.pizza.Pizza;
-import factory.pizza.impl.ChicagoStyleCheesePizza;
-import factory.pizza.impl.ChicagoStylePepperoniPizza;
-import factory.pizzastore.PizzaStore;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.ingredient.factory.impl.ChicagoPizzaIngredientFactory;
+import com.design.factory.pizzastore.PizzaStore;
+import com.design.factory.pizza.Pizza;
+import com.design.factory.pizza.impl.ChicagoStyleCheesePizza;
+import com.design.factory.pizza.impl.ChicagoStylePepperoniPizza;
 
 public class ChicagoPizzaStore extends PizzaStore {
 
diff --git a/src/factory/pizzastore/impl/NYPizzaStore.java b/src/main/java/com/design/factory/pizzastore/impl/NYPizzaStore.java
similarity index 63%
rename from src/factory/pizzastore/impl/NYPizzaStore.java
rename to src/main/java/com/design/factory/pizzastore/impl/NYPizzaStore.java
index 4b1f8c5..12a0ca3 100644
--- a/src/factory/pizzastore/impl/NYPizzaStore.java
+++ b/src/main/java/com/design/factory/pizzastore/impl/NYPizzaStore.java
@@ -1,11 +1,11 @@
-package factory.pizzastore.impl;
+package com.design.factory.pizzastore.impl;
 
-import factory.ingredient.factory.PizzaIngredientFactory;
-import factory.ingredient.factory.impl.NYPizzaIngredientFactory;
-import factory.pizza.Pizza;
-import factory.pizza.impl.NYStyleCheesePizza;
-import factory.pizza.impl.NYStylePepperoniPizza;
-import factory.pizzastore.PizzaStore;
+import com.design.factory.ingredient.factory.PizzaIngredientFactory;
+import com.design.factory.ingredient.factory.impl.NYPizzaIngredientFactory;
+import com.design.factory.pizzastore.PizzaStore;
+import com.design.factory.pizza.Pizza;
+import com.design.factory.pizza.impl.NYStyleCheesePizza;
+import com.design.factory.pizza.impl.NYStylePepperoniPizza;
 
 public class NYPizzaStore extends PizzaStore {
 
diff --git "a/src/factory/\355\214\251\355\206\240\353\246\254\355\214\250\355\204\264.md" "b/src/main/java/com/design/factory/\355\214\251\355\206\240\353\246\254\355\214\250\355\204\264.md"
similarity index 100%
rename from "src/factory/\355\214\251\355\206\240\353\246\254\355\214\250\355\204\264.md"
rename to "src/main/java/com/design/factory/\355\214\251\355\206\240\353\246\254\355\214\250\355\204\264.md"
diff --git a/src/iterator/IteratorPattern.java b/src/main/java/com/design/iterator/IteratorPattern.java
similarity index 100%
rename from src/iterator/IteratorPattern.java
rename to src/main/java/com/design/iterator/IteratorPattern.java
diff --git a/src/iterator/iter/Iterator.java b/src/main/java/com/design/iterator/iter/Iterator.java
similarity index 100%
rename from src/iterator/iter/Iterator.java
rename to src/main/java/com/design/iterator/iter/Iterator.java
diff --git a/src/iterator/iter/impl/DinerMenuIterator.java b/src/main/java/com/design/iterator/iter/impl/DinerMenuIterator.java
similarity index 100%
rename from src/iterator/iter/impl/DinerMenuIterator.java
rename to src/main/java/com/design/iterator/iter/impl/DinerMenuIterator.java
diff --git a/src/iterator/iter/impl/PancakeHouseIterator.java b/src/main/java/com/design/iterator/iter/impl/PancakeHouseIterator.java
similarity index 100%
rename from src/iterator/iter/impl/PancakeHouseIterator.java
rename to src/main/java/com/design/iterator/iter/impl/PancakeHouseIterator.java
diff --git a/src/iterator/menu/DinerMenu.java b/src/main/java/com/design/iterator/menu/DinerMenu.java
similarity index 100%
rename from src/iterator/menu/DinerMenu.java
rename to src/main/java/com/design/iterator/menu/DinerMenu.java
diff --git a/src/iterator/menu/Menu.java b/src/main/java/com/design/iterator/menu/Menu.java
similarity index 100%
rename from src/iterator/menu/Menu.java
rename to src/main/java/com/design/iterator/menu/Menu.java
diff --git a/src/iterator/menu/PancakeHouseMenu.java b/src/main/java/com/design/iterator/menu/PancakeHouseMenu.java
similarity index 100%
rename from src/iterator/menu/PancakeHouseMenu.java
rename to src/main/java/com/design/iterator/menu/PancakeHouseMenu.java
diff --git a/src/iterator/menu/Waitress.java b/src/main/java/com/design/iterator/menu/Waitress.java
similarity index 100%
rename from src/iterator/menu/Waitress.java
rename to src/main/java/com/design/iterator/menu/Waitress.java
diff --git a/src/iterator/menu/vo/MenuItem.java b/src/main/java/com/design/iterator/menu/vo/MenuItem.java
similarity index 100%
rename from src/iterator/menu/vo/MenuItem.java
rename to src/main/java/com/design/iterator/menu/vo/MenuItem.java
diff --git a/src/observer/ObserverPattern.java b/src/main/java/com/design/observer/ObserverPattern.java
similarity index 85%
rename from src/observer/ObserverPattern.java
rename to src/main/java/com/design/observer/ObserverPattern.java
index abf9581..d2d4249 100644
--- a/src/observer/ObserverPattern.java
+++ b/src/main/java/com/design/observer/ObserverPattern.java
@@ -1,9 +1,9 @@
-package observer;
+package com.design.observer;
 
-import observer.observer.impl.CurrentConditionDisplay;
-import observer.observer.impl.ForecastDisplay;
-import observer.observer.impl.StatisticsDisplay;
-import observer.subject.impl.WeatherData;
+import com.design.observer.observer.impl.CurrentConditionDisplay;
+import com.design.observer.observer.impl.ForecastDisplay;
+import com.design.observer.observer.impl.StatisticsDisplay;
+import com.design.observer.subject.impl.WeatherData;
 
 public class ObserverPattern {
 
diff --git a/src/observer/observer/DisplayElement.java b/src/main/java/com/design/observer/observer/DisplayElement.java
similarity index 59%
rename from src/observer/observer/DisplayElement.java
rename to src/main/java/com/design/observer/observer/DisplayElement.java
index 817f7d6..ead7746 100644
--- a/src/observer/observer/DisplayElement.java
+++ b/src/main/java/com/design/observer/observer/DisplayElement.java
@@ -1,4 +1,4 @@
-package observer.observer;
+package com.design.observer.observer;
 
 public interface DisplayElement {
 
diff --git a/src/observer/observer/Observer.java b/src/main/java/com/design/observer/observer/Observer.java
similarity index 82%
rename from src/observer/observer/Observer.java
rename to src/main/java/com/design/observer/observer/Observer.java
index 2e57af7..5402173 100644
--- a/src/observer/observer/Observer.java
+++ b/src/main/java/com/design/observer/observer/Observer.java
@@ -1,4 +1,4 @@
-package observer.observer;
+package com.design.observer.observer;
 
 public interface Observer {
 
diff --git a/src/observer/observer/impl/CurrentConditionDisplay.java b/src/main/java/com/design/observer/observer/impl/CurrentConditionDisplay.java
similarity index 85%
rename from src/observer/observer/impl/CurrentConditionDisplay.java
rename to src/main/java/com/design/observer/observer/impl/CurrentConditionDisplay.java
index 7539abe..3e35db3 100644
--- a/src/observer/observer/impl/CurrentConditionDisplay.java
+++ b/src/main/java/com/design/observer/observer/impl/CurrentConditionDisplay.java
@@ -1,8 +1,8 @@
-package observer.observer.impl;
+package com.design.observer.observer.impl;
 
-import observer.observer.DisplayElement;
-import observer.observer.Observer;
-import observer.subject.impl.WeatherData;
+import com.design.observer.observer.DisplayElement;
+import com.design.observer.observer.Observer;
+import com.design.observer.subject.impl.WeatherData;
 
 /**
  * 현재 얻은 기상 측정값을 나타내는 디스플레이
diff --git a/src/observer/observer/impl/ForecastDisplay.java b/src/main/java/com/design/observer/observer/impl/ForecastDisplay.java
similarity index 85%
rename from src/observer/observer/impl/ForecastDisplay.java
rename to src/main/java/com/design/observer/observer/impl/ForecastDisplay.java
index 26a8257..9d43b50 100644
--- a/src/observer/observer/impl/ForecastDisplay.java
+++ b/src/main/java/com/design/observer/observer/impl/ForecastDisplay.java
@@ -1,8 +1,8 @@
-package observer.observer.impl;
+package com.design.observer.observer.impl;
 
-import observer.observer.DisplayElement;
-import observer.observer.Observer;
-import observer.subject.impl.WeatherData;
+import com.design.observer.observer.DisplayElement;
+import com.design.observer.observer.Observer;
+import com.design.observer.subject.impl.WeatherData;
 
 /**
  * 측정치를 바탕으로 기상 예보를 하는 디스플레이
diff --git a/src/observer/observer/impl/StatisticsDisplay.java b/src/main/java/com/design/observer/observer/impl/StatisticsDisplay.java
similarity index 88%
rename from src/observer/observer/impl/StatisticsDisplay.java
rename to src/main/java/com/design/observer/observer/impl/StatisticsDisplay.java
index 34ebf4e..6a73356 100644
--- a/src/observer/observer/impl/StatisticsDisplay.java
+++ b/src/main/java/com/design/observer/observer/impl/StatisticsDisplay.java
@@ -1,10 +1,10 @@
-package observer.observer.impl;
+package com.design.observer.observer.impl;
 
 import java.util.ArrayList;
 import java.util.List;
-import observer.observer.DisplayElement;
-import observer.observer.Observer;
-import observer.subject.impl.WeatherData;
+import com.design.observer.observer.DisplayElement;
+import com.design.observer.observer.Observer;
+import com.design.observer.subject.impl.WeatherData;
 
 public class StatisticsDisplay implements Observer, DisplayElement {
 
diff --git a/src/observer/subject/Subject.java b/src/main/java/com/design/observer/subject/Subject.java
similarity index 63%
rename from src/observer/subject/Subject.java
rename to src/main/java/com/design/observer/subject/Subject.java
index e57a896..88067c0 100644
--- a/src/observer/subject/Subject.java
+++ b/src/main/java/com/design/observer/subject/Subject.java
@@ -1,6 +1,6 @@
-package observer.subject;
+package com.design.observer.subject;
 
-import observer.observer.Observer;
+import com.design.observer.observer.Observer;
 
 public interface Subject {
 
diff --git a/src/observer/subject/impl/WeatherData.java b/src/main/java/com/design/observer/subject/impl/WeatherData.java
similarity index 91%
rename from src/observer/subject/impl/WeatherData.java
rename to src/main/java/com/design/observer/subject/impl/WeatherData.java
index 9467c8e..95b81c6 100644
--- a/src/observer/subject/impl/WeatherData.java
+++ b/src/main/java/com/design/observer/subject/impl/WeatherData.java
@@ -1,9 +1,10 @@
-package observer.subject.impl;
+package com.design.observer.subject.impl;
+
+import com.design.observer.observer.Observer;
+import com.design.observer.subject.Subject;
 
 import java.util.ArrayList;
 import java.util.List;
-import observer.observer.Observer;
-import observer.subject.Subject;
 
 public class WeatherData implements Subject {
 
diff --git "a/src/observer/\354\230\265\354\240\200\353\262\204 \355\214\250\355\204\264.md" "b/src/main/java/com/design/observer/\354\230\265\354\240\200\353\262\204 \355\214\250\355\204\264.md"
similarity index 98%
rename from "src/observer/\354\230\265\354\240\200\353\262\204 \355\214\250\355\204\264.md"
rename to "src/main/java/com/design/observer/\354\230\265\354\240\200\353\262\204 \355\214\250\355\204\264.md"
index 116ee03..75ded48 100644
--- "a/src/observer/\354\230\265\354\240\200\353\262\204 \355\214\250\355\204\264.md"	
+++ "b/src/main/java/com/design/observer/\354\230\265\354\240\200\353\262\204 \355\214\250\355\204\264.md"	
@@ -28,7 +28,7 @@ public class WeatherData {
 > 한 객체의 상태가 변경되면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다.
 >
 
-![Untitled](../../img/observer/Untitled.png)
+![Untitled](../../../../img/observer/Untitled.png)
 
 ConcreteSubject
 
diff --git a/src/main/java/com/design/proxy/protection/MatchMakingTestDrive.java b/src/main/java/com/design/proxy/protection/MatchMakingTestDrive.java
new file mode 100644
index 0000000..0a857ae
--- /dev/null
+++ b/src/main/java/com/design/proxy/protection/MatchMakingTestDrive.java
@@ -0,0 +1,91 @@
+package com.design.proxy.protection;
+
+import com.design.proxy.protection.invoke.NotOwnerInvocationHandler;
+import com.design.proxy.protection.invoke.OwnerInvocationHandler;
+import com.design.proxy.protection.person.Person;
+import com.design.proxy.protection.person.MatchMakingUser;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.Proxy;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+public class MatchMakingTestDrive {
+    private static final Map<String, Person> localDb = new HashMap<>();
+
+    public static void main(String[] args) {
+        MatchMakingTestDrive matchMakingTestDrive = new MatchMakingTestDrive();
+        matchMakingTestDrive.drive();
+    }
+
+    public MatchMakingTestDrive() {
+        initDb();
+    }
+
+    private void drive() {
+        Person person = getPerson("guswns");
+
+        // owner proxy
+        Person ownerProxy = getOwnerProxy(person);
+        log.info("name is {}", ownerProxy.getName());
+        ownerProxy.setInterests("coding and training");
+        log.info("intersets set from owner proxy");
+        try {
+            ownerProxy.setGeekRating(10);
+        } catch (Exception e) {
+            log.error("can't set rating from owner proxy", e);
+        }
+        log.info("rating is {}", ownerProxy.getGeekRating());
+
+        // not owner proxy
+        Person notOwnerProxy = getNotOwnerProxy(person);
+        log.info("name is {}", notOwnerProxy.getName());
+        try {
+            notOwnerProxy.setInterests("coding and training");
+        } catch (Exception e) {
+            log.error("can't set intersets from not-owner proxy", e);
+        }
+        log.info("rating set from owner proxy");
+        notOwnerProxy.setGeekRating(100);
+        log.info("rating is {}", notOwnerProxy.getGeekRating());
+    }
+
+    private void initDb() {
+        MatchMakingUser user = MatchMakingUser.builder()
+                .name("guswns")
+                .interests("coding")
+                .rating(7)
+                .build();
+        localDb.put(user.getName(), user);
+
+        MatchMakingUser user1 = MatchMakingUser.builder()
+                .name("kelly")
+                .interests("guswns")
+                .rating(10)
+                .build();
+        localDb.put(user1.getName(), user1);
+    }
+
+    private Person getPerson(String name) {
+        return Optional.ofNullable(localDb.get(name)).orElseThrow(NoSuchElementException::new);
+    }
+
+    private Person getOwnerProxy(Person person) {
+        return (Person) Proxy.newProxyInstance(
+                person.getClass().getClassLoader(),
+                person.getClass().getInterfaces(),
+                new OwnerInvocationHandler(person)
+        );
+    }
+
+    private Person getNotOwnerProxy(Person person) {
+        return (Person) Proxy.newProxyInstance(
+                person.getClass().getClassLoader(),
+                person.getClass().getInterfaces(),
+                new NotOwnerInvocationHandler(person)
+        );
+    }
+}
diff --git a/src/main/java/com/design/proxy/protection/invoke/NotOwnerInvocationHandler.java b/src/main/java/com/design/proxy/protection/invoke/NotOwnerInvocationHandler.java
new file mode 100644
index 0000000..dfc04d0
--- /dev/null
+++ b/src/main/java/com/design/proxy/protection/invoke/NotOwnerInvocationHandler.java
@@ -0,0 +1,31 @@
+package com.design.proxy.protection.invoke;
+
+import com.design.proxy.protection.person.Person;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+@Slf4j
+@RequiredArgsConstructor
+public class NotOwnerInvocationHandler implements InvocationHandler {
+    private final Person person;
+
+    @Override
+    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {
+        try {
+            if (method.getName().startsWith("get")) {
+                return method.invoke(person, args);
+            } else if (method.getName().equals("setGeekRating")) {
+                return method.invoke(person, args);
+            } else if (method.getName().startsWith("set")) {
+                throw new IllegalAccessException();
+            }
+        } catch (InvocationTargetException e) {
+            log.error("invoke error", e);
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/design/proxy/protection/invoke/OwnerInvocationHandler.java b/src/main/java/com/design/proxy/protection/invoke/OwnerInvocationHandler.java
new file mode 100644
index 0000000..34ab43c
--- /dev/null
+++ b/src/main/java/com/design/proxy/protection/invoke/OwnerInvocationHandler.java
@@ -0,0 +1,31 @@
+package com.design.proxy.protection.invoke;
+
+import com.design.proxy.protection.person.Person;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+@Slf4j
+@RequiredArgsConstructor
+public class OwnerInvocationHandler implements InvocationHandler {
+    private final Person person;
+
+    @Override
+    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException {
+        try {
+            if (method.getName().startsWith("get")) {
+                return method.invoke(person, args);
+            } else if (method.getName().equals("setGeekRating")) {
+                throw new IllegalAccessException();
+            } else if (method.getName().startsWith("set")) {
+                return method.invoke(person, args);
+            }
+        } catch (InvocationTargetException e) {
+            log.error("invoke error", e);
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/design/proxy/protection/person/MatchMakingUser.java b/src/main/java/com/design/proxy/protection/person/MatchMakingUser.java
new file mode 100644
index 0000000..59e6639
--- /dev/null
+++ b/src/main/java/com/design/proxy/protection/person/MatchMakingUser.java
@@ -0,0 +1,61 @@
+package com.design.proxy.protection.person;
+
+
+import lombok.Builder;
+
+public class MatchMakingUser implements Person {
+    private String name;
+    private String gender;
+    private String interests;
+    private int rating;
+    private int ratingCount = 0;
+
+    @Builder
+    public MatchMakingUser(String name, String gender, String interests, int rating) {
+        this.name = name;
+        this.gender = gender;
+        this.interests = interests;
+        this.rating = rating;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getGender() {
+        return gender;
+    }
+
+    @Override
+    public String getInterests() {
+        return interests;
+    }
+
+    @Override
+    public int getGeekRating() {
+        return ratingCount == 0 ? 0 : rating / ratingCount;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    @Override
+    public void setInterests(String interests) {
+        this.interests = interests;
+    }
+
+    @Override
+    public void setGeekRating(int rating) {
+        this.rating += rating;
+        ratingCount++;
+    }
+}
diff --git a/src/main/java/com/design/proxy/protection/person/Person.java b/src/main/java/com/design/proxy/protection/person/Person.java
new file mode 100644
index 0000000..aa47f85
--- /dev/null
+++ b/src/main/java/com/design/proxy/protection/person/Person.java
@@ -0,0 +1,19 @@
+package com.design.proxy.protection.person;
+
+public interface Person {
+    String getName();
+
+    String getGender();
+
+    String getInterests();
+
+    int getGeekRating();
+
+    void setName(String name);
+
+    void setGender(String gender);
+
+    void setInterests(String interests);
+
+    void setGeekRating(int rating);
+}
diff --git a/src/main/java/com/design/proxy/remote/GumballMachine.java b/src/main/java/com/design/proxy/remote/GumballMachine.java
new file mode 100644
index 0000000..b2b2326
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/GumballMachine.java
@@ -0,0 +1,104 @@
+package proxy.remote;
+
+import proxy.remote.state.State;
+import proxy.remote.state.impl.*;
+
+import java.rmi.RemoteException;
+import java.rmi.server.UnicastRemoteObject;
+
+public class GumballMachine extends UnicastRemoteObject implements GumballMachineRemote {
+
+    private static final long serialVersionUID = 2L; // serialVersionUID: UnicastRemoteObject가 Serializable을 구현하기 때문에 필요한 필드.
+    private final State soldOut;
+    private final State noQuarter;
+    private final State hasQuarter;
+    private final State sold;
+    private final State winner;
+    private State state;
+    private int count = 0;
+    private String location;
+
+    // 슈퍼클래스 생성자가 어떤 예외를 던진다면 서브클래 스의 생성자도 그 예외를 선언해야 한다. (RemoteException)
+    public GumballMachine(String location, int numberGumballs) throws RemoteException {
+        soldOut = new SoldOutState(this);
+        noQuarter = new NoQuarterState(this);
+        hasQuarter = new HasQuarterState(this);
+        sold = new SoldState(this);
+        winner = new WinnerState(this);
+        this.count = numberGumballs;
+        if (numberGumballs > 0) {
+            state = noQuarter;
+        } else {
+            state = soldOut;
+        }
+        this.location = location;
+    }
+
+    public void insertQuarter() {
+        state.insertQuarter();
+    }
+
+    public void ejectQuarter() {
+        state.ejectQuarter();
+    }
+
+    public void turnCrank() {
+        state.turnCrank();
+        state.dispense();
+    }
+
+    public void setState(State state) {
+        this.state = state;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+
+    public void releaseBall() {
+        System.out.println("알맹이를 내보내고 있습니다");
+        if (count > 0) {
+            count--;
+        }
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public State getState() {
+        return state;
+    }
+
+    public State getSoldOut() {
+        return soldOut;
+    }
+
+    public State getNoQuarter() {
+        return noQuarter;
+    }
+
+    public State getHasQuarter() {
+        return hasQuarter;
+    }
+
+    public State getSold() {
+        return sold;
+    }
+
+    public State getWinner() {
+        return winner;
+    }
+
+    @Override
+    public String toString() {
+        return "GumballMachine{" +
+                "state=" + state.getClass().getSimpleName() +
+                ", count=" + count +
+                '}';
+    }
+}
diff --git a/src/main/java/com/design/proxy/remote/GumballMachineRemote.java b/src/main/java/com/design/proxy/remote/GumballMachineRemote.java
new file mode 100644
index 0000000..b106976
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/GumballMachineRemote.java
@@ -0,0 +1,14 @@
+package proxy.remote;
+
+import proxy.remote.state.State;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface GumballMachineRemote extends Remote {
+    int getCount() throws RemoteException;
+
+    String getLocation() throws RemoteException;
+
+    State getState() throws RemoteException;
+}
diff --git a/src/main/java/com/design/proxy/remote/GumballMachineTestDrive.java b/src/main/java/com/design/proxy/remote/GumballMachineTestDrive.java
new file mode 100644
index 0000000..3477201
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/GumballMachineTestDrive.java
@@ -0,0 +1,29 @@
+package proxy.remote;
+
+import java.rmi.Naming;
+
+public class GumballMachineTestDrive {
+
+    /**
+     * - 원격 서비스(GumballMachineTestDrive) 를 실행하기 전에 "rmiregistry &"을 통해 rmiregistry를 백그라운드에서 실행시킨다.
+     * - 사용되는 메소드에서 직렬화가 필요한부분을 모두 직렬화해야 한다. (State)
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        if (args.length < 2) {
+            System.out.println("GumballMachine <name> <inventory>");
+            System.exit(1);
+        }
+
+        try {
+            int count = Integer.parseInt(args[1]);
+            GumballMachine gumballMachine = new GumballMachine(args[0], count);
+
+            // rebind() 메소드를 통해 gumballMachine 을 RMI 레지스트리에 등록한다. -> RMI 시스템은 레지스트리에 스텁만 등록한다
+            Naming.rebind("//" + args[0] + "/gumballmachine", gumballMachine);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/design/proxy/remote/GumballMonitor.java b/src/main/java/com/design/proxy/remote/GumballMonitor.java
new file mode 100644
index 0000000..1df56ac
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/GumballMonitor.java
@@ -0,0 +1,26 @@
+package proxy.remote;
+
+
+import java.rmi.RemoteException;
+
+/**
+ * 프록시를 활용하는 클라이언트 객체.
+ */
+public class GumballMonitor {
+
+    private final GumballMachineRemote machine; // GumballMachine 구상 클래스가 아니라 Remote 원격 인터페이스인 GumballMachineRemote를 사용한다.
+
+    public GumballMonitor(GumballMachineRemote machine) {
+        this.machine = machine;
+    }
+
+    public void report() {
+        try {
+            System.out.println("Gumball Machine: " + machine.getLocation());
+            System.out.println("Current inventory: " + machine.getCount() + " gumballs");
+            System.out.println("Current state: " + machine.getState());
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/java/com/design/proxy/remote/GumballMonitorTestDrive.java b/src/main/java/com/design/proxy/remote/GumballMonitorTestDrive.java
new file mode 100644
index 0000000..ecb0107
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/GumballMonitorTestDrive.java
@@ -0,0 +1,44 @@
+package proxy.remote;
+
+import java.rmi.Naming;
+
+public class GumballMonitorTestDrive {
+
+    /**
+     * 1. 클라이언트에서 RMI 레지스트리를 lookup 한다
+     * <p>
+     * 2. RMI 레지스트리에서 stub 객체(GumballMachineRemote)를 리턴한다.
+     * <p>
+     * 3. 클라이언트에서 stub의 메소드(report)를 호출한다. (gumballMonitor.report();)
+     *
+     * @param args
+     */
+    public static void main(String[] args) {
+        String[] location = {"rmi://santafe.mightygumball.com/gumballmachine",
+                "rmi://boulder.mightygumball.com/gumballmachine",
+                "rmi://austin.mightygumball.com/gumballmachine"};
+
+        if (args.length > 0) {
+            location = new String[1];
+            // 클라이언트에서는 GumballMachineTestDrive에서 gumballMachine 을 RMI 레지스트리에 등록할 때 사용한 이름 "gumballmachine"을 적어줘야 한다.
+            // argument 첫번째 인자에 서비스(GumballMachineTestDrive)가 돌아가는 시스템의 hostname 또는 ip 주소를 입력한다.
+            location[0] = "rmi://" + args[0] + "/gumballmachine";
+        }
+
+        GumballMonitor[] monitor = new GumballMonitor[location.length];
+
+        for (int i = 0; i < location.length; i++) {
+            try {
+                GumballMachineRemote machine = (GumballMachineRemote) Naming.lookup(location[i]); // lookup -> 스텁 객체 반환
+                monitor[i] = new GumballMonitor(machine);
+                System.out.println(monitor[i]);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        for (GumballMonitor gumballMonitor : monitor) {
+            gumballMonitor.report(); // 스텁의 메소드 호출. (클라이언트는 스텁이 실제 객체라고 생각한다)
+        }
+    }
+}
diff --git a/src/main/java/com/design/proxy/remote/state/State.java b/src/main/java/com/design/proxy/remote/state/State.java
new file mode 100644
index 0000000..258095d
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/state/State.java
@@ -0,0 +1,13 @@
+package proxy.remote.state;
+
+import java.io.Serializable;
+
+public interface State extends Serializable {
+    void insertQuarter();
+
+    void ejectQuarter();
+
+    void turnCrank();
+
+    void dispense();
+}
diff --git a/src/main/java/com/design/proxy/remote/state/impl/HasQuarterState.java b/src/main/java/com/design/proxy/remote/state/impl/HasQuarterState.java
new file mode 100644
index 0000000..fc79395
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/state/impl/HasQuarterState.java
@@ -0,0 +1,44 @@
+package proxy.remote.state.impl;
+
+import proxy.remote.GumballMachine;
+import proxy.remote.state.State;
+
+import java.util.Random;
+
+public class HasQuarterState implements State {
+
+    private static final long serialVersionUID = 2L;
+    private final transient GumballMachine gumballMachine; // 직렬화를 원치않는 변수는 transient 키워드를 붙힌다.
+    private final Random random = new Random(System.currentTimeMillis());
+
+    public HasQuarterState(GumballMachine gumballMachine) {
+        this.gumballMachine = gumballMachine;
+    }
+
+    @Override
+    public void insertQuarter() {
+        System.out.println("동전을 한 개만 넣어주세요");
+    }
+
+    @Override
+    public void ejectQuarter() {
+        System.out.println("동전이 반환됩니다.");
+        gumballMachine.setState(gumballMachine.getNoQuarter());
+    }
+
+    @Override
+    public void turnCrank() {
+        System.out.println("손잡이를 돌리셨습니다");
+        int winner = random.nextInt(10);
+        if (winner == 0 && gumballMachine.getCount() > 1) {
+            gumballMachine.setState(gumballMachine.getWinner());
+        } else {
+            gumballMachine.setState(gumballMachine.getSold());
+        }
+    }
+
+    @Override
+    public void dispense() {
+        System.out.println("알맹이를 내보낼 수 없습니다");
+    }
+}
diff --git a/src/main/java/com/design/proxy/remote/state/impl/NoQuarterState.java b/src/main/java/com/design/proxy/remote/state/impl/NoQuarterState.java
new file mode 100644
index 0000000..5de921b
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/state/impl/NoQuarterState.java
@@ -0,0 +1,35 @@
+package proxy.remote.state.impl;
+
+import proxy.remote.GumballMachine;
+import proxy.remote.state.State;
+
+public class NoQuarterState implements State {
+
+    private static final long serialVersionUID = 2L;
+    private final transient GumballMachine gumballMachine;
+
+    public NoQuarterState(GumballMachine gumballMachine) {
+        this.gumballMachine = gumballMachine;
+    }
+
+    @Override
+    public void insertQuarter() {
+        System.out.println("동전을 넣음");
+        gumballMachine.setState(gumballMachine.getHasQuarter());
+    }
+
+    @Override
+    public void ejectQuarter() {
+        System.out.println("동전을 넣어 주세요");
+    }
+
+    @Override
+    public void turnCrank() {
+        System.out.println("동전을 넣어 주세요");
+    }
+
+    @Override
+    public void dispense() {
+        System.out.println("동전을 넣어 주세요");
+    }
+}
diff --git a/src/main/java/com/design/proxy/remote/state/impl/SoldOutState.java b/src/main/java/com/design/proxy/remote/state/impl/SoldOutState.java
new file mode 100644
index 0000000..c5c5639
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/state/impl/SoldOutState.java
@@ -0,0 +1,33 @@
+package proxy.remote.state.impl;
+
+import proxy.remote.GumballMachine;
+import proxy.remote.state.State;
+
+public class SoldOutState implements State {
+    private static final long serialVersionUID = 2L;
+    private final transient GumballMachine gumballMachine;
+
+    public SoldOutState(GumballMachine gumballMachine) {
+        this.gumballMachine = gumballMachine;
+    }
+
+    @Override
+    public void insertQuarter() {
+        System.out.println("매진 되었습니다");
+    }
+
+    @Override
+    public void ejectQuarter() {
+        System.out.println("매진 되었습니다");
+    }
+
+    @Override
+    public void turnCrank() {
+        System.out.println("매진 되었습니다");
+    }
+
+    @Override
+    public void dispense() {
+        System.out.println("매진 되었습니다. 알맹이를 내보낼 수 없습니다");
+    }
+}
diff --git a/src/main/java/com/design/proxy/remote/state/impl/SoldState.java b/src/main/java/com/design/proxy/remote/state/impl/SoldState.java
new file mode 100644
index 0000000..4ec138b
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/state/impl/SoldState.java
@@ -0,0 +1,41 @@
+package proxy.remote.state.impl;
+
+import proxy.remote.GumballMachine;
+import proxy.remote.state.State;
+
+public class SoldState implements State {
+    private static final long serialVersionUID = 2L;
+    private final transient GumballMachine gumballMachine;
+
+    public SoldState(GumballMachine gumballMachine) {
+        this.gumballMachine = gumballMachine;
+    }
+
+    @Override
+    public void insertQuarter() {
+        System.out.println("동전을 넣음");
+    }
+
+    @Override
+    public void ejectQuarter() {
+        System.out.println("동전을 넣어 주세요");
+    }
+
+    @Override
+    public void turnCrank() {
+        System.out.println("동전을 넣어 주세요");
+    }
+
+    @Override
+    public void dispense() {
+        gumballMachine.releaseBall();
+        if (gumballMachine.getCount() > 0) {
+            gumballMachine.setState(gumballMachine.getNoQuarter());
+        } else {
+            System.out.println("gumballs가 부족합니다");
+            gumballMachine.setState(gumballMachine.getSoldOut());
+        }
+    }
+
+
+}
diff --git a/src/main/java/com/design/proxy/remote/state/impl/WinnerState.java b/src/main/java/com/design/proxy/remote/state/impl/WinnerState.java
new file mode 100644
index 0000000..a6bae12
--- /dev/null
+++ b/src/main/java/com/design/proxy/remote/state/impl/WinnerState.java
@@ -0,0 +1,45 @@
+package proxy.remote.state.impl;
+
+import proxy.remote.GumballMachine;
+import proxy.remote.state.State;
+
+public class WinnerState implements State {
+    private static final long serialVersionUID = 2L;
+    private final transient GumballMachine gumballMachine;
+
+    public WinnerState(GumballMachine gumballMachine) {
+        this.gumballMachine = gumballMachine;
+    }
+
+    @Override
+    public void insertQuarter() {
+        System.out.println("동전을 넣음");
+    }
+
+    @Override
+    public void ejectQuarter() {
+        System.out.println("동전을 넣어 주세요");
+    }
+
+    @Override
+    public void turnCrank() {
+        System.out.println("동전을 넣어 주세요");
+    }
+
+    @Override
+    public void dispense() {
+        gumballMachine.releaseBall();
+        if (gumballMachine.getCount() == 0) {
+            gumballMachine.setState(gumballMachine.getSoldOut());
+        } else {
+            gumballMachine.releaseBall();
+            System.out.println("축하합니다! 알맹이를 하나 더 받을 수 있어요");
+            if (gumballMachine.getCount() > 0) {
+                gumballMachine.setState(gumballMachine.getNoQuarter());
+            } else {
+                System.out.println("더이상의 알맹이가 없습니다.");
+                gumballMachine.setState(gumballMachine.getSoldOut());
+            }
+        }
+    }
+}
diff --git a/src/main/java/com/design/proxy/virtual/Icon.java b/src/main/java/com/design/proxy/virtual/Icon.java
new file mode 100644
index 0000000..8b18ab0
--- /dev/null
+++ b/src/main/java/com/design/proxy/virtual/Icon.java
@@ -0,0 +1,9 @@
+package proxy.virtual;
+
+public interface Icon {
+    int getIconWidth();
+
+    int getIconHeight();
+
+    void paintIcon();
+}
diff --git a/src/main/java/com/design/proxy/virtual/ImageIcon.java b/src/main/java/com/design/proxy/virtual/ImageIcon.java
new file mode 100644
index 0000000..e7a2cb6
--- /dev/null
+++ b/src/main/java/com/design/proxy/virtual/ImageIcon.java
@@ -0,0 +1,33 @@
+package proxy.virtual;
+
+import java.net.URL;
+
+public class ImageIcon implements Icon {
+
+    private final URL imageUrl;
+    private final int width;
+    private final int height;
+
+    public ImageIcon(URL imageUrl) {
+        this.imageUrl = imageUrl;
+        this.width = 600;
+        this.height = 800;
+    }
+
+    @Override
+    public int getIconWidth() {
+        System.out.println("real");
+        return this.width;
+    }
+
+    @Override
+    public int getIconHeight() {
+        System.out.println("real");
+        return this.height;
+    }
+
+    @Override
+    public void paintIcon() {
+        System.out.println("(width:" + width + ", height:" + height + " ,URL:" + imageUrl + ") 이미지를 그렸습니다.");
+    }
+}
diff --git a/src/main/java/com/design/proxy/virtual/ImageProxy.java b/src/main/java/com/design/proxy/virtual/ImageProxy.java
new file mode 100644
index 0000000..9a6ce8e
--- /dev/null
+++ b/src/main/java/com/design/proxy/virtual/ImageProxy.java
@@ -0,0 +1,56 @@
+package proxy.virtual;
+
+import java.net.URL;
+import java.util.Objects;
+
+public class ImageProxy implements Icon {
+
+    private volatile ImageIcon imageIcon; // volatile: 메인 메모리에 변수 값을 저장하여 멀티 스레드 환경에서의 값 불일치를 해결
+    private final URL imageUrl;
+    private boolean retrieving;
+
+    public ImageProxy(URL imageUrl) {
+        this.imageUrl = imageUrl;
+    }
+
+    // synchronized: volatile로 인해 여러 스레드에서 imageIcon에 동시에 접근할 수 있으므로 동기화 처리.
+    synchronized void setImageIcon(ImageIcon imageIcon) {
+        this.imageIcon = imageIcon;
+    }
+
+    @Override
+    public int getIconWidth() {
+        if (Objects.nonNull(imageIcon)) {
+            return imageIcon.getIconWidth();
+        }
+        System.out.println("proxy");
+        return 800; // default width
+    }
+
+    @Override
+    public int getIconHeight() {
+        if (Objects.nonNull(imageIcon)) {
+            return imageIcon.getIconHeight();
+        }
+        System.out.println("proxy");
+        return 600; // default height
+    }
+
+    @Override
+    public void paintIcon() {
+        if (Objects.nonNull(imageIcon)) {
+            imageIcon.paintIcon();
+            return;
+        }
+
+        if (!retrieving) {
+            System.out.println("앨범 커버를 불러오는 중입니다...");
+            retrieving = true;
+
+            new Thread(() -> {
+                setImageIcon(new ImageIcon(imageUrl));
+                imageIcon.paintIcon();
+            }).start();
+        }
+    }
+}
diff --git a/src/main/java/com/design/proxy/virtual/ImageProxyTestDrive.java b/src/main/java/com/design/proxy/virtual/ImageProxyTestDrive.java
new file mode 100644
index 0000000..5e0c834
--- /dev/null
+++ b/src/main/java/com/design/proxy/virtual/ImageProxyTestDrive.java
@@ -0,0 +1,20 @@
+package proxy.virtual;
+
+import java.net.URL;
+
+public class ImageProxyTestDrive {
+
+    public static void main(String[] args) throws Exception {
+        ImageProxy proxy = new ImageProxy(new URL("http://images.amazon.com/images/P/B00009XBYK.01.LZZZZZZZ.jpg"));
+        System.out.println(proxy.getIconHeight());
+        System.out.println(proxy.getIconWidth());
+        proxy.paintIcon();
+
+        Thread.sleep(100L);
+        System.out.println("-----------------------");
+
+        System.out.println(proxy.getIconHeight());
+        System.out.println(proxy.getIconWidth());
+        proxy.paintIcon();
+    }
+}
diff --git a/src/singleton/SingletonPattern.java b/src/main/java/com/design/singleton/SingletonPattern.java
similarity index 74%
rename from src/singleton/SingletonPattern.java
rename to src/main/java/com/design/singleton/SingletonPattern.java
index bd50699..289e94f 100644
--- a/src/singleton/SingletonPattern.java
+++ b/src/main/java/com/design/singleton/SingletonPattern.java
@@ -1,4 +1,4 @@
-package singleton;
+package com.design.singleton;
 
 public class SingletonPattern {
     public static void main(String[] args) {
diff --git a/src/singleton/boiler/ChocolateBoilerEnum.java b/src/main/java/com/design/singleton/boiler/ChocolateBoilerEnum.java
similarity index 96%
rename from src/singleton/boiler/ChocolateBoilerEnum.java
rename to src/main/java/com/design/singleton/boiler/ChocolateBoilerEnum.java
index 3adaa3f..baef1b2 100644
--- a/src/singleton/boiler/ChocolateBoilerEnum.java
+++ b/src/main/java/com/design/singleton/boiler/ChocolateBoilerEnum.java
@@ -1,4 +1,4 @@
-package singleton.boiler;
+package com.design.singleton.boiler;
 
 /**
  * enum으로 싱글톤을 생성하면
diff --git a/src/singleton/boiler/ChocolateBoilerFinal.java b/src/main/java/com/design/singleton/boiler/ChocolateBoilerFinal.java
similarity index 97%
rename from src/singleton/boiler/ChocolateBoilerFinal.java
rename to src/main/java/com/design/singleton/boiler/ChocolateBoilerFinal.java
index 8dfb9de..06f7bc2 100644
--- a/src/singleton/boiler/ChocolateBoilerFinal.java
+++ b/src/main/java/com/design/singleton/boiler/ChocolateBoilerFinal.java
@@ -1,4 +1,4 @@
-package singleton.boiler;
+package com.design.singleton.boiler;
 
 /**
  * public static final field
diff --git a/src/singleton/boiler/ChocolateBoilerLazy.java b/src/main/java/com/design/singleton/boiler/ChocolateBoilerLazy.java
similarity index 97%
rename from src/singleton/boiler/ChocolateBoilerLazy.java
rename to src/main/java/com/design/singleton/boiler/ChocolateBoilerLazy.java
index febb51d..3be58c0 100644
--- a/src/singleton/boiler/ChocolateBoilerLazy.java
+++ b/src/main/java/com/design/singleton/boiler/ChocolateBoilerLazy.java
@@ -1,4 +1,4 @@
-package singleton.boiler;
+package com.design.singleton.boiler;
 
 /**
  * lazy initialization -> 동기화 문제
diff --git a/src/singleton/boiler/ChocolateBoilerSynchronized.java b/src/main/java/com/design/singleton/boiler/ChocolateBoilerSynchronized.java
similarity index 97%
rename from src/singleton/boiler/ChocolateBoilerSynchronized.java
rename to src/main/java/com/design/singleton/boiler/ChocolateBoilerSynchronized.java
index ac490fb..43fd655 100644
--- a/src/singleton/boiler/ChocolateBoilerSynchronized.java
+++ b/src/main/java/com/design/singleton/boiler/ChocolateBoilerSynchronized.java
@@ -1,4 +1,4 @@
-package singleton.boiler;
+package com.design.singleton.boiler;
 
 /**
  * lazy initialization & synchronized
diff --git a/src/singleton/boiler/ChocolateBoilerVolatile.java b/src/main/java/com/design/singleton/boiler/ChocolateBoilerVolatile.java
similarity index 97%
rename from src/singleton/boiler/ChocolateBoilerVolatile.java
rename to src/main/java/com/design/singleton/boiler/ChocolateBoilerVolatile.java
index 5aabc00..49ed37a 100644
--- a/src/singleton/boiler/ChocolateBoilerVolatile.java
+++ b/src/main/java/com/design/singleton/boiler/ChocolateBoilerVolatile.java
@@ -1,4 +1,4 @@
-package singleton.boiler;
+package com.design.singleton.boiler;
 
 /**
  * lazy initialization & volatile
diff --git "a/src/singleton/\354\213\261\352\270\200\355\206\244 \355\214\250\355\204\264.md" "b/src/main/java/com/design/singleton/\354\213\261\352\270\200\355\206\244 \355\214\250\355\204\264.md"
similarity index 100%
rename from "src/singleton/\354\213\261\352\270\200\355\206\244 \355\214\250\355\204\264.md"
rename to "src/main/java/com/design/singleton/\354\213\261\352\270\200\355\206\244 \355\214\250\355\204\264.md"
diff --git a/src/state/StatePattern.java b/src/main/java/com/design/state/StatePattern.java
similarity index 85%
rename from src/state/StatePattern.java
rename to src/main/java/com/design/state/StatePattern.java
index 0f366ab..2da4e52 100644
--- a/src/state/StatePattern.java
+++ b/src/main/java/com/design/state/StatePattern.java
@@ -1,6 +1,6 @@
-package state;
+package com.design.state;
 
-import state.context.GumballMachine;
+import com.design.state.context.GumballMachine;
 
 public class StatePattern {
     public static void main(String[] args) {
diff --git a/src/state/context/GumballMachine.java b/src/main/java/com/design/state/context/GumballMachine.java
similarity index 94%
rename from src/state/context/GumballMachine.java
rename to src/main/java/com/design/state/context/GumballMachine.java
index 39ba22e..9d488d8 100644
--- a/src/state/context/GumballMachine.java
+++ b/src/main/java/com/design/state/context/GumballMachine.java
@@ -1,7 +1,7 @@
-package state.context;
+package com.design.state.context;
 
-import state.state.State;
-import state.state.impl.*;
+import com.design.state.state.State;
+import com.design.state.state.impl.*;
 
 public class GumballMachine {
 
diff --git a/src/state/state/State.java b/src/main/java/com/design/state/state/State.java
similarity index 88%
rename from src/state/state/State.java
rename to src/main/java/com/design/state/state/State.java
index 6da30b1..b45161e 100644
--- a/src/state/state/State.java
+++ b/src/main/java/com/design/state/state/State.java
@@ -1,4 +1,4 @@
-package state.state;
+package com.design.state.state;
 
 public interface State {
     void insertQuarter();
diff --git a/src/state/state/impl/HasQuarterState.java b/src/main/java/com/design/state/state/impl/HasQuarterState.java
similarity index 90%
rename from src/state/state/impl/HasQuarterState.java
rename to src/main/java/com/design/state/state/impl/HasQuarterState.java
index ce4840e..cc2e814 100644
--- a/src/state/state/impl/HasQuarterState.java
+++ b/src/main/java/com/design/state/state/impl/HasQuarterState.java
@@ -1,7 +1,7 @@
-package state.state.impl;
+package com.design.state.state.impl;
 
-import state.context.GumballMachine;
-import state.state.State;
+import com.design.state.context.GumballMachine;
+import com.design.state.state.State;
 
 import java.util.Random;
 
diff --git a/src/state/state/impl/NoQuarterState.java b/src/main/java/com/design/state/state/impl/NoQuarterState.java
similarity index 85%
rename from src/state/state/impl/NoQuarterState.java
rename to src/main/java/com/design/state/state/impl/NoQuarterState.java
index e828f5e..c49297d 100644
--- a/src/state/state/impl/NoQuarterState.java
+++ b/src/main/java/com/design/state/state/impl/NoQuarterState.java
@@ -1,7 +1,7 @@
-package state.state.impl;
+package com.design.state.state.impl;
 
-import state.context.GumballMachine;
-import state.state.State;
+import com.design.state.context.GumballMachine;
+import com.design.state.state.State;
 
 public class NoQuarterState implements State {
     private final GumballMachine gumballMachine;
diff --git a/src/state/state/impl/SoldOutState.java b/src/main/java/com/design/state/state/impl/SoldOutState.java
similarity index 86%
rename from src/state/state/impl/SoldOutState.java
rename to src/main/java/com/design/state/state/impl/SoldOutState.java
index 24a2786..e3debeb 100644
--- a/src/state/state/impl/SoldOutState.java
+++ b/src/main/java/com/design/state/state/impl/SoldOutState.java
@@ -1,7 +1,7 @@
-package state.state.impl;
+package com.design.state.state.impl;
 
-import state.context.GumballMachine;
-import state.state.State;
+import com.design.state.context.GumballMachine;
+import com.design.state.state.State;
 
 public class SoldOutState implements State {
     private final GumballMachine gumballMachine;
diff --git a/src/state/state/impl/SoldState.java b/src/main/java/com/design/state/state/impl/SoldState.java
similarity index 87%
rename from src/state/state/impl/SoldState.java
rename to src/main/java/com/design/state/state/impl/SoldState.java
index 0cd9955..a6d7a02 100644
--- a/src/state/state/impl/SoldState.java
+++ b/src/main/java/com/design/state/state/impl/SoldState.java
@@ -1,7 +1,7 @@
-package state.state.impl;
+package com.design.state.state.impl;
 
-import state.context.GumballMachine;
-import state.state.State;
+import com.design.state.context.GumballMachine;
+import com.design.state.state.State;
 
 public class SoldState implements State {
     private final GumballMachine gumballMachine;
diff --git a/src/state/state/impl/WinnerState.java b/src/main/java/com/design/state/state/impl/WinnerState.java
similarity index 90%
rename from src/state/state/impl/WinnerState.java
rename to src/main/java/com/design/state/state/impl/WinnerState.java
index 7424975..65bfce5 100644
--- a/src/state/state/impl/WinnerState.java
+++ b/src/main/java/com/design/state/state/impl/WinnerState.java
@@ -1,7 +1,7 @@
-package state.state.impl;
+package com.design.state.state.impl;
 
-import state.context.GumballMachine;
-import state.state.State;
+import com.design.state.context.GumballMachine;
+import com.design.state.state.State;
 
 public class WinnerState implements State {
     private final GumballMachine gumballMachine;
diff --git a/src/strategy/StrategyPattern.java b/src/main/java/com/design/strategy/StrategyPattern.java
similarity index 76%
rename from src/strategy/StrategyPattern.java
rename to src/main/java/com/design/strategy/StrategyPattern.java
index 46f2c8e..f2d959a 100644
--- a/src/strategy/StrategyPattern.java
+++ b/src/main/java/com/design/strategy/StrategyPattern.java
@@ -1,9 +1,9 @@
-package strategy;
+package com.design.strategy;
 
-import strategy.base.Duck;
-import strategy.behavior.impl.FlyRocketPowered;
-import strategy.ducks.MallardDuck;
-import strategy.ducks.MuteDuck;
+import com.design.strategy.base.Duck;
+import com.design.strategy.behavior.impl.FlyRocketPowered;
+import com.design.strategy.ducks.MallardDuck;
+import com.design.strategy.ducks.MuteDuck;
 
 public class StrategyPattern {
     public static void main(String[] args) {
diff --git a/src/strategy/base/Duck.java b/src/main/java/com/design/strategy/base/Duck.java
similarity index 82%
rename from src/strategy/base/Duck.java
rename to src/main/java/com/design/strategy/base/Duck.java
index 9540b2c..545c615 100644
--- a/src/strategy/base/Duck.java
+++ b/src/main/java/com/design/strategy/base/Duck.java
@@ -1,7 +1,7 @@
-package strategy.base;
+package com.design.strategy.base;
 
-import strategy.behavior.FlyBehavior;
-import strategy.behavior.QuackBehavior;
+import com.design.strategy.behavior.FlyBehavior;
+import com.design.strategy.behavior.QuackBehavior;
 
 public abstract class Duck {
   protected FlyBehavior flyBehavior; // 레퍼런스 변수
diff --git a/src/strategy/behavior/FlyBehavior.java b/src/main/java/com/design/strategy/behavior/FlyBehavior.java
similarity index 55%
rename from src/strategy/behavior/FlyBehavior.java
rename to src/main/java/com/design/strategy/behavior/FlyBehavior.java
index 2e72e0b..8b35ac4 100644
--- a/src/strategy/behavior/FlyBehavior.java
+++ b/src/main/java/com/design/strategy/behavior/FlyBehavior.java
@@ -1,4 +1,4 @@
-package strategy.behavior;
+package com.design.strategy.behavior;
 
 public interface FlyBehavior {
   void fly();
diff --git a/src/strategy/behavior/QuackBehavior.java b/src/main/java/com/design/strategy/behavior/QuackBehavior.java
similarity index 57%
rename from src/strategy/behavior/QuackBehavior.java
rename to src/main/java/com/design/strategy/behavior/QuackBehavior.java
index a847e16..4646db4 100644
--- a/src/strategy/behavior/QuackBehavior.java
+++ b/src/main/java/com/design/strategy/behavior/QuackBehavior.java
@@ -1,4 +1,4 @@
-package strategy.behavior;
+package com.design.strategy.behavior;
 
 public interface QuackBehavior {
   void quack();
diff --git a/src/strategy/behavior/impl/FlyNoWay.java b/src/main/java/com/design/strategy/behavior/impl/FlyNoWay.java
similarity index 61%
rename from src/strategy/behavior/impl/FlyNoWay.java
rename to src/main/java/com/design/strategy/behavior/impl/FlyNoWay.java
index 1782b8a..470310e 100644
--- a/src/strategy/behavior/impl/FlyNoWay.java
+++ b/src/main/java/com/design/strategy/behavior/impl/FlyNoWay.java
@@ -1,6 +1,6 @@
-package strategy.behavior.impl;
+package com.design.strategy.behavior.impl;
 
-import strategy.behavior.FlyBehavior;
+import com.design.strategy.behavior.FlyBehavior;
 
 public class FlyNoWay implements FlyBehavior {
 
diff --git a/src/strategy/behavior/impl/FlyRocketPowered.java b/src/main/java/com/design/strategy/behavior/impl/FlyRocketPowered.java
similarity index 66%
rename from src/strategy/behavior/impl/FlyRocketPowered.java
rename to src/main/java/com/design/strategy/behavior/impl/FlyRocketPowered.java
index c16b322..b181ae4 100644
--- a/src/strategy/behavior/impl/FlyRocketPowered.java
+++ b/src/main/java/com/design/strategy/behavior/impl/FlyRocketPowered.java
@@ -1,6 +1,6 @@
-package strategy.behavior.impl;
+package com.design.strategy.behavior.impl;
 
-import strategy.behavior.FlyBehavior;
+import com.design.strategy.behavior.FlyBehavior;
 
 public class FlyRocketPowered implements FlyBehavior {
 
diff --git a/src/strategy/behavior/impl/FlyWithWings.java b/src/main/java/com/design/strategy/behavior/impl/FlyWithWings.java
similarity index 64%
rename from src/strategy/behavior/impl/FlyWithWings.java
rename to src/main/java/com/design/strategy/behavior/impl/FlyWithWings.java
index c9fc702..ddcd15e 100644
--- a/src/strategy/behavior/impl/FlyWithWings.java
+++ b/src/main/java/com/design/strategy/behavior/impl/FlyWithWings.java
@@ -1,6 +1,6 @@
-package strategy.behavior.impl;
+package com.design.strategy.behavior.impl;
 
-import strategy.behavior.FlyBehavior;
+import com.design.strategy.behavior.FlyBehavior;
 
 public class FlyWithWings implements FlyBehavior {
 
diff --git a/src/strategy/behavior/impl/LoudQuack.java b/src/main/java/com/design/strategy/behavior/impl/LoudQuack.java
similarity index 63%
rename from src/strategy/behavior/impl/LoudQuack.java
rename to src/main/java/com/design/strategy/behavior/impl/LoudQuack.java
index 8772be5..8c8966d 100644
--- a/src/strategy/behavior/impl/LoudQuack.java
+++ b/src/main/java/com/design/strategy/behavior/impl/LoudQuack.java
@@ -1,6 +1,6 @@
-package strategy.behavior.impl;
+package com.design.strategy.behavior.impl;
 
-import strategy.behavior.QuackBehavior;
+import com.design.strategy.behavior.QuackBehavior;
 
 public class LoudQuack implements QuackBehavior  {
 
diff --git a/src/strategy/behavior/impl/MuteQuack.java b/src/main/java/com/design/strategy/behavior/impl/MuteQuack.java
similarity index 63%
rename from src/strategy/behavior/impl/MuteQuack.java
rename to src/main/java/com/design/strategy/behavior/impl/MuteQuack.java
index 9f8d8a1..6652303 100644
--- a/src/strategy/behavior/impl/MuteQuack.java
+++ b/src/main/java/com/design/strategy/behavior/impl/MuteQuack.java
@@ -1,6 +1,6 @@
-package strategy.behavior.impl;
+package com.design.strategy.behavior.impl;
 
-import strategy.behavior.QuackBehavior;
+import com.design.strategy.behavior.QuackBehavior;
 
 public class MuteQuack implements QuackBehavior {
 
diff --git a/src/strategy/ducks/MallardDuck.java b/src/main/java/com/design/strategy/ducks/MallardDuck.java
similarity index 57%
rename from src/strategy/ducks/MallardDuck.java
rename to src/main/java/com/design/strategy/ducks/MallardDuck.java
index 809b041..e853d1b 100644
--- a/src/strategy/ducks/MallardDuck.java
+++ b/src/main/java/com/design/strategy/ducks/MallardDuck.java
@@ -1,8 +1,8 @@
-package strategy.ducks;
+package com.design.strategy.ducks;
 
-import strategy.behavior.impl.FlyWithWings;
-import strategy.behavior.impl.LoudQuack;
-import strategy.base.Duck;
+import com.design.strategy.behavior.impl.FlyWithWings;
+import com.design.strategy.behavior.impl.LoudQuack;
+import com.design.strategy.base.Duck;
 
 public class MallardDuck extends Duck {
 
diff --git a/src/strategy/ducks/MuteDuck.java b/src/main/java/com/design/strategy/ducks/MuteDuck.java
similarity index 56%
rename from src/strategy/ducks/MuteDuck.java
rename to src/main/java/com/design/strategy/ducks/MuteDuck.java
index 47e39e7..46a0cb0 100644
--- a/src/strategy/ducks/MuteDuck.java
+++ b/src/main/java/com/design/strategy/ducks/MuteDuck.java
@@ -1,8 +1,8 @@
-package strategy.ducks;
+package com.design.strategy.ducks;
 
-import strategy.behavior.impl.FlyNoWay;
-import strategy.behavior.impl.MuteQuack;
-import strategy.base.Duck;
+import com.design.strategy.behavior.impl.FlyNoWay;
+import com.design.strategy.behavior.impl.MuteQuack;
+import com.design.strategy.base.Duck;
 
 public class MuteDuck extends Duck {
 
diff --git "a/src/strategy/\354\240\204\353\236\265\355\214\250\355\204\264.md" "b/src/main/java/com/design/strategy/\354\240\204\353\236\265\355\214\250\355\204\264.md"
similarity index 100%
rename from "src/strategy/\354\240\204\353\236\265\355\214\250\355\204\264.md"
rename to "src/main/java/com/design/strategy/\354\240\204\353\236\265\355\214\250\355\204\264.md"
diff --git a/src/template/TemplatePattern.java b/src/main/java/com/design/template/TemplatePattern.java
similarity index 100%
rename from src/template/TemplatePattern.java
rename to src/main/java/com/design/template/TemplatePattern.java
diff --git a/src/template/abstractlist/MyStringList.java b/src/main/java/com/design/template/abstractlist/MyStringList.java
similarity index 100%
rename from src/template/abstractlist/MyStringList.java
rename to src/main/java/com/design/template/abstractlist/MyStringList.java
diff --git a/src/template/base/AbstractClass.java b/src/main/java/com/design/template/base/AbstractClass.java
similarity index 100%
rename from src/template/base/AbstractClass.java
rename to src/main/java/com/design/template/base/AbstractClass.java
diff --git a/src/template/beverage/CaffeineBeverage.java b/src/main/java/com/design/template/beverage/CaffeineBeverage.java
similarity index 100%
rename from src/template/beverage/CaffeineBeverage.java
rename to src/main/java/com/design/template/beverage/CaffeineBeverage.java
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..77d8f39
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}:%line) - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="debug">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>
\ No newline at end of file
