2021. 9. 18. 08:00ใBack-End ์์ ์ค/Spring Framework
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ค๋์ Spring์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์์ OCP์์น๊ณผ DIP๋ฅผ ์ข ๋ ๊ณต๋ถ ํด ๋ณด๋๋ก ํ๋ ๊ฒ์ด์์.
์ด ๋ด์ฉ์ ์ธํ๋ฐ - ๊น์ํ ๊ฐ์ฌ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌ ํ์์ต๋๋ค.
์ด ๊ฐ์์ ๋ํ Code๋ ์ฌ๊ธฐ์ ์ค๋น ํด ๋๊ฒ์!
๐ ๋ชฉ์ฐจ
01. [Spring] ์คํ๋ง ํต์ฌ ์๋ฆฌ
02. [Spring] ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
03. [Spring] ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
04. [Spring] OCP์ DIP ๊ณ ๋ คํ๊ธฐ
05. [Spring] ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ - ์๋ก์ด ํ ์ธ ์ ์ฑ
๊ฐ๋ฐ
06. [Spring] AppConfig ๋ฆฌํฉํฐ๋ง
07. [Spring] Ioc, DI Container
08. [Spring] ์คํ๋ง ์ปจํ
์ด๋ ์์ฑ
09. [Spring] ์ฑ๊ธํค ์ปจํ
์ด๋
10. [Spring] Component Scan And Auto wired Start
11. [Spring] ์์กด๊ด๊ณ ์ฃผ์
๋ฐฉ๋ฒ
12. [Spring] Bean Life Cycle Call Back
13. [Spring] Bean Scope
๐ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ๊ณผ ์ค๊ณ
- ํ์
- ํ์์ ๊ฐ์ ํ๊ณ , ์กฐํํ ์ ์๋ค.
- ํ์์ ์ผ๋ฐ๊ณผ VIP ๋ ๊ฐ์ง ๋ฑ๊ธ์ด ์๋ค.
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB๋ฅผ ๊ตฌ์ถํ ์ ์๊ณ , ์ธ๋ถ ์์คํ ๊ณผ ์ฐ๋ํ ์ ์์ผ๋, ์ด๋ค DB๋ฅผ ์ธ์ง ์ด๋ค ๋ฐฉ์์ผ๋ก Data๋ฅผ ์ฒ๋ฆฌํ ์ง ์ ํด์ง์ง ์์๋ค.
- ์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ
- ํ์์ ์ํ์ ์ฃผ๋ฌธํ ์ ์๋ค.
- ํ์ ๋ฑ๊ธ์ ๋ฐ๋ผ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ ์ ์๋ค.
- ํ ์ธ ์ ์ฑ
์ ๋ชจ๋ VIP๋ 1,000์์ ํ ์ธ ํด ์ฃผ๋ ๊ณ ์ ๊ธ์ก ํ ์ธ์ ์ ์ฉํด๋ฌ๋ผ๊ณ , ์์ฒญ ๋ฐ์๋ค.
(๋จ, ๋์ค์ ์ ์ฑ ์ ๋ณ๊ฒฝ ๋ ์ ์๋ค๊ณ ํ๋ค.) - ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ํ์ฌ์ ๊ธฐ๋ณธ ํ ์ธ ์ ์ฑ ์ ์์ง ์ ํ์ง ๋ชปํ๊ณ , ์คํ ์ง์ ๊น์ง ๊ณ ๋ฏผ์ ๋ฏธ๋ฃจ๊ณ ์ถ๋ค. ์ต์ ์ ๊ฒฝ์ฐ ํ ์ธ์ ์ ์ฉํ์ง ์์์๋ ์๋ค.
์์ ๊ฐ์ ๋ด์ฉ์ผ๋ก ์ฝ๋ฉ์ ํ๋ฉด์ ์ด๋ฒ ๊ณต๋ถ๋ฅผ ์์ ํด ๋ณด๋๋ก ํ ๊ฒ์. ๋จผ์ , DB๋ ์ ํด์ง์ง ์์๊ณ , ํ ์ธ ์ ์ฑ ๊ฐ์ ๊ฒฝ์ฐ๋ ์คํ ์ง์ ๊น์ง ๋ฏธ๋ฃจ๊ณ ์ถ๋ค๊ณ ํด์! ๊ทธ๋ผ ๋๋์ฒด ๊ฐ๋ฐ์ ํ๋ผ๋ ๊ฑธ๊น์? ๋ง๋ผ๋๊ฑธ๊น์?
๋ฐ๋ก ์ด ๋, ๊ฐ์ฒด ์งํฅ์ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ฉด ๊ทธ๋ฆฌ๊ณ , DIP์ OCP ์์น์ ์งํจ๋ค๋ฉด ์ด ๋ฌธ์ ๋ ๊ฑฑ์ ๊ฑฐ๋ฆฌ๊ฐ ์๋๋๋๋ค!
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Interface๋ฅผ ๋ง๋ค๊ณ , ๊ตฌํ์ฒด๋ฅผ ์ธ์ ๋ ์ง ๊ฐ์๋ผ์ธ ์ ์๋๋ก ์ค๊ณ๋ฅผ ํ๋ฉด ๋๋ ๊ฒ์ด์์.
Interface๋ ์ญํ ! ๊ตฌํ์ฒด๋ ๊ทธ ์ญํ ์ ๊ตฌํ ํ๋ ๊ฒ!
๐ก ์ฐธ๊ณ ๋ก ์ด๋ฒ ๊ณต๋ถ์์๋ Spring์ ์ฌ์ฉํ์ง ์๊ณ , ์ค๋ก์ง ์์ ์๋ฐ๋ก๋ง ๊ณต๋ถํ๋ ๊ฒ์ด์์!
๐ํ์ ๋๋ฉ์ธ ์ค๊ณ
- ํ์ ๋๋ฉ์ธ ์๊ตฌ์ฌํญ
- ํ์์ ๊ฐ์ ํ๊ณ , ์กฐํํ ์ ์๋ค.
- ํ์์ ์ผ๋ฐ๊ณผ VIP ๋ ๊ฐ์ง ๋ฑ๊ธ์ผ๋ก ๋๋๋ค.
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB๋ฅผ ๊ตฌ์ถํ ์ ์๊ณ , ์ธ๋ถ ์์คํ ๊ณผ ์ฐ๋ํ ์ ์๋ค.
๐ ํ์ ๋๋ฉ์ธ ํ๋ ฅ ๊ด๊ณ
๐ ํ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
๐ ํ์ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ
ํ์ ์๋น์ค ๊ฐ์ฒด ์ด๋ฆ : MemberServiceImpl
์ฌ๊ธฐ์ Impl์ ์ธํฐํ์ด์ค์ ๋ํ ๊ตฌํ์ฒด๊ฐ ํ๋์ผ ๋๋ ๊ด๋ก์ ํด๋์ค๋ช ์ ์ด๊ฒ์ ๋ถํ์ฃผ๋ ๊ฒ์ด์์.
๐ํ์ ๋๋ฉ์ธ ๊ฐ๋ฐ
๐ ํ์ Entity
- ํ์ ๋ฑ๊ธ
- ํ์ Entity
๐ ํ์ ์ ์ฅ์
- ํ์ ์ ์ฅ์ ์ธํฐํ์ด์ค
- Memory ํ์ ์ ์ฅ์ ๊ตฌํ์ฒด
DB์ ๋ํด์ ์ด๋ค ๊ฒ์ ์ฌ์ฉํ ์ง ์์ง ๊ฒฐ์ ๋์ง ์์๋ค๋ ๊ฐ์ ํ์ ์งํํ๋ ๊ฒ์ด์์.
์ด๋ ๋ค๊ณ ํ๋๋ผ๋ ๊ฐ๋ฐ์ ์งํํ ์ ์๋ต๋๋ค! ๊ทธ๊ฑด ๋จ์ํ๊ฒ Memory๋ฅผ ํ์ฉํ์ฌ ํ์ ์ ์ฅ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด์์.
๐ก์ฐธ๊ณ :
[HashMap]์ ๋์์ฑ Issue๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฐ๊ฒฝ์ฐ [CocurrentHashMap]์ ์ฌ์ฉํ ์ ์๋ค.
๋์์ฑ Issue๋?
๋จผ์ ์ด๊ฒ์ ์ด์ผ๊ธฐ ์ ์ Thread(์ค๋ ๋)๋ฅผ ์ดํดํด์ผ ํ๊ณ , ์ด ์ค๋ ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ๋จผ์ ์ดํดํด์ผ ํ๋ค.
ํ๋ก์ธ์ค๋? ์ผ๋ฐ์ ์ผ๋ก ํน์ ์์ ์ ์ํํ๋ ์ํํธ์จ์ด๋ฅผ ํ๋ก๊ทธ๋จ์ด๋ผ ํ๋ค. ์ด ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ก ์คํ๋์ด, Memory๋ CPU์ ๊ฐ์ ์์์ ํ ๋น ๋ฐ์ผ๋ฉด ์ด๊ฒ์ ํ๋ก์ธ์ค๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ค๋ ๋๋? ์์ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ฑํ๋ ํ๋์ ๋จ์๋ฅผ ๋งํ๋ค. ์ฆ, ํ๋์ ํ๋ก์ธ์ค๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์๋ํ๊ณ ์์ ์ ์๋ค.
์ค์ธ๋๋ ์์ ์ ํ ๋จ์๋ก ํ๋ก์ธ์ค๋ ๋ ์์ ์ธ Memory๋ฅผ ํ ๋น ๋ฐ์ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค ๋ผ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ก์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์นจ๋ฒํ์ง ๋ชปํ๋ค. ํ์ง๋ง, ํ๋ก์ธ์ค ๋ด๋ถ์ ์๋ ์ฌ๋ฌ ์ค๋ ๋๋ค์ ์๋ก ๊ฐ์ ํ๋ก์ธ์ค ๋ด๋ถ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์์์ ๊ณต์ ํ ์ ์๋ค. ๊ฐ์ ์์์ ๊ณต์ ํ๋ ๊ฒ์ผ๋ก ์ธํด ๋์์ ์ฌ๋ฌ ์ผ์ ๊ฐ์ ์์์ ๋๊ณ ์ํํ ์๋ ์๊ณ , ์ด ๋๋ฌธ์ ๊ณง ๋ณ๋ ฌ์ฑ์ ํฅ์์ ๋๋ชจํ ์ ์๋ค.
ํ์ง๋ง, ๋จ์ ๋ ์กด์ฌํ๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ํ๋์ ์์์ ๊ณต์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ์์์ ๋๊ณ ๋์์ฑ ๋ฌธ์ , ๋ฐ๋๋ฝ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ค์ด ๋ฐ์ํ ์ ์๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฌธ์ ์๋ ํ๋ก๊ทธ๋จ์ ์ ์ํ ์ ์๊ฒ ๋๋ค.
๐ ํ์ ์๋น์ค
- ํ์ ์๋น์ค ์ธํฐํ์ด์ค
- ํ์ ์๋น์ค ๊ตฌํ์ฒด
์์ ๊ฐ์ด ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์์๊น์?
๊ทธ๊ฒ์ ๋ฐ๋ก ๋ค๋ฅธ ์ ์ฅ์๋ก ๋ณ๊ฒฝํ ๋ OCP ์์น๊ณผ DIP๋ฅผ ์งํค๊ณ ์์ง ์๋ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํด์.
OCP์ DIP์ ๋ํ ๋ด์ฉ์ ๋ชจ๋ฅด์ ๋ค๋ฉด ์ฌ๊ธฐ์ ๊ด์ฌ์ ์ฃผ์ธ์!
์ ์ฝ๋ 9๋ฒ์งธ ์ค์ ๋ณด๋ฉด ์์กด๊ด๊ณ๊ฐ ์ธํฐํ์ด์ค ๋ฟ๋ง ์๋๋ผ ๊ตฌํ์ฒด๊น์ง ๋ชจ๋ ์์กดํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
์์์๋ MemberRepository๋ก ์ธํฐํ์ด์ค๋ฅผ ์์กดํ๋, ๋ค์์๋ new๋ฅผ ํตํด MemoryMemberRepository๋ฅผ ์์กดํ๊ณ ์๋ ๊ฒ์ด์์. ์ด๊ฒ ๋ฐ๋ก ๋ฌธ์ ์ธ ๊ฒ์ด์์!
๐ ํ์ ๋๋ฉ์ธ - ํ์ ๊ฐ์ Test
์์ Test Code๋ JUnit์ ํตํ Test์ธ ๊ฒ์ด์์.
๐์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ์ค๊ณ
- ์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ
- ํ์์ ์ํ์ ์ฃผ๋ฌธํ ์ ์๋ค.
- ํ์ ๋ฑ๊ธ์ ๋ฐ๋ผ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ ์ ์๋ค.
- ํ ์ธ ์ ์ฑ ์ผ๋ก ๋ชจ๋ VIP๋ 1,000์์ ํ ์ธํด์ฃผ๋ ๊ณ ์ ๊ธ์ก ํ ์ธ์ ์ ์ฉํด๋ฌ๋ผ๊ณ ํ๋ค. (๋์ค์ ๋ณ๊ฒฝ๋ ์ ์์)
- ํ ์ธ ์ ์ฑ
์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ํ์ฌ์ ๊ธฐ๋ณธ ํ ์ธ ์ ์ฑ
์ ์์ง ์ ํ๊ณ , ์คํ ์ง์ ๊น์ง ๊ณ ๋ฏผ์ ๋ฏธ๋ฃจ๊ณ ์ถ๋ค.
์ต์ ์ ๊ฒฝ์ฐ ํ ์ธ์ ์ ์ฉํ์ง ์์์๋ ์๋ค.
๐ ์ฃผ๋ฌธ ๋๋ฉ์ธ ํ๋ ฅ, ์ญํ ์ฑ ์
์์ ๊ทธ๋ฆผ์์ Client๋ Spring MVC์ ๊ฒฝ์ฐ์ Controller๋ก ๋ณผ ์ ์๊ณ , JAVA์ ๊ฒฝ์ฐ Main()๋ก ๋ณผ ์ ์๋ ๊ฒ์ด์์.
- ์ฃผ๋ฌธ ์์ฑ : Client๋ ์ฃผ๋ฌธ ์๋น์ค์ ์ฃผ๋ฌธ ์์ฑ์ ์์ฒญํ๋ค.
- ํ์ ์กฐํ : ํ ์ธ์ ์ํด์๋ ํ์ ๋ฑ๊ธ์ด ํ์ํ๋ฏ๋ก, ์ฃผ๋ฌธ ์๋น์ค๋ ํ์ ์ ์ฅ์์์ ํ์์ ์ ์ฅํ๋ค.
- ํ ์ธ ์ ์ฉ : ์ฃผ๋ฌธ ์๋น์ค๋ ํ์ ๋ฑ๊ธ์ ๋ฐ๋ฅธ ํ ์ธ ์ฌ๋ถ๋ฅผ ํ ์ธ ์ ์ฑ ์ ์์ํ๋ค.
- ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฐํ : ์ฃผ๋ฌธ ์๋น์ค๋ ํ ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
๐ ์ฃผ๋ฌธ ๋๋ฉ์ธ ์ ์ฒด
์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํด์ ์์ ๋กญ๊ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ ์ ์๊ฒ ์ค๊ณํด์ผ ํ๋ ๊ฒ์ด์์. ๊ทธ๋์ผ ํ์ ์ ์ฅ์๋ ๋ฌผ๋ก ์ด๊ณ , ํ ์ธ ์ ์ฑ ๋ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ต๋๋ค!
๐ ์ฃผ๋ฌธ ๋๋ฉ์ธ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
๐ ์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ1
ํ์์ Memory์์ ์กฐํํ๊ณ , ์ ์ก ํ ์ธ ์ ์ฑ (๊ณ ์ ๊ธ์ก)์ ์ง์ํด๋ ์ฃผ๋ฌธ ์๋น์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ ๊ฒ์ด์์.
๊ฒฐ๊ตญ ์ญํ ๋ค์ ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ ํ ์ ์๊ฒ ๋ ๊ฒ์ด์์. ์ด๊ฒ์ด ๋ฌด์จ ๋ง์ด๋๋ฉด ์ ์ฅ์๋ฅผ Memory์์ DB๋ก ๋ณ๊ฒฝํ๊ณ , ํ ์ธ ์ ์ฑ ์ ์ ์ก์์ ์ ๋ฅ ๋ก ๋ณ๊ฒฝํด๋ ์ฃผ๋ฌธ ์๋น์ค ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค๋ ์ด์ผ๊ธฐ์ธ ๊ฒ์ด์์.
๐ ์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ2
ํ์์ Memory๊ฐ ์๋ ์ค์ DB์์ ์กฐํํ๊ณ , ์ ๋ฅ ํ ์ธ ์ ์ฑ (์ฃผ๋ฌธ ๊ทธ๋จ์ ๋ฐ๋ผ % ํ ์ธ)์ผ๋ก ๋ฐฉ์์ ๋ฐ๊พธ์ด๋ ์ฃผ๋ฌธ ์๋น์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ ๊ฒ์ด์์. ๋ค์ ํ๋ฒ ์ธ๊ธํ์ง๋ง ํ๋ ฅ ๊ด๊ณ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ ํ ์ ์๋ ๊ฒ์ด์์!
๐์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ๊ฐ๋ฐ
๐ ํ ์ธ ์ ์ฑ ์ธํฐํ์ด์ค
๐ ์ ์ก ํ ์ธ ์ ์ฑ ๊ตฌํ์ฒด
์์ 13๋ฒ์งธ ์ค if๋ฌธ์ ๋ถ์ํด ๋ณด๋ฉด ํ์์ ๋ฑ๊ธ์ด VIP๋ผ๋ฉด 'discountFixAmount'๋ณ์๋ฅผ ๋ฐํํด์ 1000์์ ํ ์ธ ํ ์ ์๊ฒ ์ฐ์ฐํ ์ ์๋๋ก ํด์ฃผ๊ณ , ์๋๋ฉด ํ ์ธ์ด ์๊ฒ '0'์ ๋ฐํ ํ๋ ๊ฒ์ด์์.
๐ ์ฃผ๋ฌธ Entity
package hello.core.order;
public class Order {
private Long memberId;
private String itemName;
private int itemPrice;
private int discountPrice;
public int calculatePrice() {
return itemPrice - discountPrice;
}
public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
this.memberId = memberId;
this.itemName = itemName;
this.itemPrice = itemPrice;
this.discountPrice = discountPrice;
}
public Long getMemberId() {
return memberId;
}
public void setMemberId(Long memberId) {
this.memberId = memberId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public int getItemPrice() {
return itemPrice;
}
public void setItemPrice(int itemPrice) {
this.itemPrice = itemPrice;
}
public int getDiscountPrice() {
return discountPrice;
}
public void setDiscountPrice(int discountPrice) {
this.discountPrice = discountPrice;
}
@Override
public String toString() {
return "Order{" +
"memberId=" + memberId +
", itemName='" + itemName + '\'' +
", itemPrice=" + itemPrice +
", discountPrice=" + discountPrice +
'}';
}
}
๐ ์ฃผ๋ฌธ ์๋น์ค ๊ตฌํ์ฒด
order ์๋น์ค์ ์ ์ฅ์์ ํ ์ธ์ ๋ํด์๋ ๋ชฐ๋ผ๋ ๋๋ ๊ฒ์ด์์. '์์์ ๊ณ์ฐํ๊ณ , ๋ํํ ๊ฒฐ๊ณผ๋ง ์ค!' ๋ผ๊ณ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด์์.
์ฃผ๋ฌธ ์์ฑ ์์ฒญ์ด ์ค๋ฉด, ํ์ ์ ๋ณด๋ฅผ ์กฐํํ๊ณ (16๋ฒ์งธ ์ค), ๊ณ ์ ๊ธ์ก ํ ์ธ ์ ์ฑ ์ ์ ์ฉ(18๋ฒ์งธ ์ค)ํ ๋ค ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ ๊ฒ์ด์์.
๋ฉ๋ชจ๋ฆฌ ํ์ ๋ ํฌ์งํ ๋ฆฌ์ ๊ณ ์ ๊ธ์ก ํ ์ธ ์ ์ฑ ์ ๊ตฌํ์ฒด๋ก ์์ฑํ๊ฒ ๋๋ ๊ฒ์ด์ง์!
๐์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ Test
๐ ์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ Test
์ ์์ ์ผ๋ก ์ ์คํ ๋๋ค์!
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช ๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] AppConfig ๋ฆฌํฉํฐ๋ง (0) | 2021.09.30 |
---|---|
[Spring] ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ - ์๋ก์ด ํ ์ธ ์ ์ฑ ๊ฐ๋ฐ (0) | 2021.09.29 |
[Spring] ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (0) | 2021.09.12 |
[Spring] ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID) (0) | 2021.09.11 |
[Spring] ์คํ๋ง ํต์ฌ ์๋ฆฌ (0) | 2021.09.10 |